PBSProを普通に使う場合にはcpu coreの空き数、メモリ搭載量とかでジョブの配送先が決まる。

ただ最近ではGPUの空き枚数でジョブの配送が決まってほしい場合もあり、基本のままでは不十分になりつつある。
例えば64coreなマシンで4枚GPUを搭載しているノードにジョブを入れたい場合、
64coreすべてを使用するような形でジョブを投げる必要がある
もし16coreで投げると、そのマシンはまだまだジョブを受け付けられる状態にあり、その他のジョブがGPUを使うようなら
4枚のGPUはその計算リソースを供給され遅くなるか、最悪ジョブが停止されてしまう。

2020y02m16d_200727527.png

ここではGPUの枚数で計算ノードが決定され(resource定義)、かつそのGPUがそのジョブにしか使われないようにしてみる(hook定義)。

resource

既定ではGPUを定義する項目がないので、その定義項目をジョブ管理ノードに追加します。

[root@openpbs ~]# qmgr
Qmgr: create resource ngpus type=long, flag=nh   <--「create resource ngpus type=long, flag=nh」を実行
Qmgr: list resource                              <--「list resource」で確認
#
# Create resources and set their properties.
#
Resource ngpus
    type = long
    flag = hn
 
Qmgr: quit
[root@openpbs ~]#

その後、pds機能を一旦停止させ、新たなリソース名として「ngpus(数値型)」を追加
「sched_config」を修正してpbsを再起動

[root@openpbs ~]# systemctl stop pbs
[root@openpbs ~]# vi /var/lib/pbs/sched_priv/sched_config
- resources: "ncpus, mem, arch, host, vnode, netwins, aoe"
+ resources: "ncpus, mem, arch, host, vnode, netwins, aoe, ngpus"     <--- 247行目あたり、「ngpus」を追加
 
[root@openpbs ~]# systemctl start pbs

この後に、計算ノードにGPUを定義します

[root@openpbs ~]# qmgr -c "set node s resources_available.ngpus=2"
 
(確認)
[root@openpbs ~]# qmgr -c "print node s"
#
# Create nodes and set their properties.
#
#
# Create and define node s
#
create node s Mom=s.sybyl.local
set node s state = free
set node s resources_available.arch = linux
set node s resources_available.host = s
set node s resources_available.mem = 32886284kb
set node s resources_available.ncpus = 8
set node s resources_available.ngpus = 2
set node s resources_available.vnode = s
set node s resv_enable = True
[root@openpbs ~]#

ここでqsubのインターラクティヴモードで GPU を1つ使うようにしてみる

[illya@client ~]$ qsub -q workq -l select=1:ncpus=1:ngpus=1 -I
qsub: waiting for job 7.openpbs to start
qsub: job 7.openpbs ready
 
[illya@s ~]$

nvidia-smiコマンドでgpuリソースを確認すると、、、

[illya@s ~]$ nvidia-smi -L
GPU 0: GeForce GT 710 (UUID: GPU-f0753e20-06f7-695a-f325-b5b6342393ba)
GPU 1: GeForce GT 710 (UUID: GPU-34c49ab7-b79d-e341-93e2-1659e9bd9e57)
[illya@s ~]$

と2つのGPUが列挙されてしまう。1つだけ使いたいのに、、っでそれを解消するのがhook

hook

参照先: https://www.altair.com/resource/altair-pbs-professional-support-on-nvidia-dgx-systems

まずは下記を実行して「pbs_cgroups.json」を得ます。

[root@openpbs ~]# qmgr -c "export hook pbs_cgroups application/x-config default" > pbs_cgroups.json

取得した「pbs_cgroups.json」の中身に修正を加えます。

{
    "cgroup_prefix"         : "pbs_jobs",
    "exclude_hosts"         : [],
    "exclude_vntypes"       : ["no_cgroups"],
    "run_only_on_hosts"     : [],
    "periodic_resc_update"  : true,
    "vnode_per_numa_node"   : false,
    "online_offlined_nodes" : true,
    "use_hyperthreads"      : false,
    "ncpus_are_cores"       : false,
    "cgroup" : {
        "cpuacct" : {
            "enabled"            : true,
            "exclude_hosts"      : [],
            "exclude_vntypes"    : []
        },
        "cpuset" : {
            "enabled"            : true,
            "exclude_cpus"       : [],
            "exclude_hosts"      : [],
            "exclude_vntypes"    : [],
            "mem_fences"         : true,
            "mem_hardwall"       : false,
            "memory_spread_page" : false
        },
        "devices" : {
            "enabled"            : true,     <--ここを「false」から「true」に変更
            "exclude_hosts"      : [],
            "exclude_vntypes"    : [],
            "allow"              : [        #  allow部分を下記に全変換
                "c 195:* m",
                "c 136:* rwm",
                ["infiniband/rdma_cm","rwm"],
                ["fuse","rwm"],
                ["net/tun","rwm"],
                ["tty","rwm"],
                ["ptmx","rwm"],
                ["console","rwm"],
                ["null","rwm"],
                ["zero","rwm"],
                ["full","rwm"],
                ["random","rwm"],
                ["urandom","rwm"],
                ["cpu/0/cpuid","rwm","*"],
                ["nvidia-modeset", "rwm"],
                ["nvidia-uvm", "rwm"],
                ["nvidia-uvm-tools", "rwm"],
                ["nvidiactl", "rwm"]
            ]
        },
        "hugetlb" : {
            "enabled"            : false,
            "exclude_hosts"      : [],
            "exclude_vntypes"    : [],
            "default"            : "0MB",
            "reserve_percent"    : 0,
            "reserve_amount"     : "0MB"
        },
        "memory" : {
            "enabled"            : true,
            "exclude_hosts"      : [],
            "exclude_vntypes"    : [],
            "soft_limit"         : false,
            "default"            : "256MB",
            "reserve_percent"    : 0,
            "reserve_amount"     : "64MB"
        },
        "memsw" : {
            "enabled"            : true,
            "exclude_hosts"      : [],
            "exclude_vntypes"    : [],
            "default"            : "256MB",
            "reserve_percent"    : 0,
            "reserve_amount"     : "64MB"
        }
    }
}

修正した「pbs_cgroups.json」ファイルをシステムに戻して反映させる

[root@openpbs ~]# qmgr -c "import hook pbs_cgroups application/x-config default pbs_cgroups.json"
hook 'pbs_cgroups' contents overwritten
[root@openpbs ~]#

その後に「pbs_cgroup」を有効にする

(現状の確認)
[root@pbspro ~]# qmgr
Qmgr: list hook
Hook pbs_cgroups
    type = site
    enabled = false
    event = execjob_begin,execjob_epilogue,execjob_end,execjob_launch,
        execjob_attach,
        execjob_resize,
        exechost_periodic,
        exechost_startup
    user = pbsadmin
    alarm = 90
    freq = 120
    order = 100
    debug = false
    fail_action = offline_vnodes
 
(hookを有効にする)
Qmgr: set hook pbs_cgroups enabled = true
 
(有効になったかの確認)
Qmgr: list hook
Hook pbs_cgroups
    type = site
    enabled = true   <-- trueに代わる
    event = execjob_begin,execjob_epilogue,execjob_end,execjob_launch,
        execjob_attach,
        execjob_resize,
        exechost_periodic,
        exechost_startup
    user = pbsadmin
    alarm = 90
    freq = 120
    order = 100
    debug = false
    fail_action = offline_vnodes
 
Qmgr:
[root@pbspro ~]#

あとはpbs_serverと対象の計算ノードのpbsサービスを再起動します

[root@openpbs ~]# systemctl restart pbs
 
[root@s ~]# systemctl restart pbs

テスト

同じようにqsubのインターラクティヴモードでテスト

[illya@client ~]$ qsub -q workq -l select=1:ncpus=1:ngpus=1 -I
qsub: waiting for job 22.openpbs to start
qsub: job 22.openpbs ready
 
[illya@s ~]$ nvidia-smi -L
GPU 0: GeForce GT 710 (UUID: GPU-f0753e20-06f7-695a-f325-b5b6342393ba)
[illya@s ~]$ exit
 
[illya@client ~]$ qsub -q workq -l select=1:ncpus=1:ngpus=2 -I
qsub: waiting for job 23.openpbs to start
qsub: job 23.openpbs ready
 
[illya@s ~]$ nvidia-smi -L
GPU 0: GeForce GT 710 (UUID: GPU-f0753e20-06f7-695a-f325-b5b6342393ba)
GPU 1: GeForce GT 710 (UUID: GPU-34c49ab7-b79d-e341-93e2-1659e9bd9e57)
 
[illya@s ~]$ exit
 
[illya@client ~]$ qsub -q workq -l select=1:ncpus=1 -I
qsub: waiting for job 24.openpbs to start
qsub: job 24.openpbs ready
 
[illya@s ~]$ nvidia-smi -L
No devices found.
 
[illya@s ~]$

1個指定、2個指定も問題なく使えたみたい。また何も指定しないとデバイスすら見えないみたい

留意
ngpus=2でジョブリソースを確保しても、ncpusが余っていればジョブの投入は可能です. 単にGPUリソースにアクセスできないだけ

一応これでGPUリソースの排他的制限は出来たけど、今度は逆にCPUリソースの排他的制限は可能なのかと疑問がでる...未調査です


qsubで1coreリソースを確保して、でも展開されるスクリプトには1core以上を使うアプリが仕込まれると厄介極まりない...
1計算機ノード1coreな世界なら心配要らない話だけど、昨今のハイブリッドMPIなプログラムだと考慮が必要なのかも


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2020-09-20 (日) 07:07:04 (35d)