#author("2020-12-16T19:31:23+00:00","default:sysosa","sysosa")
#author("2020-12-16T20:03:31+00:00","default:sysosa","sysosa")
ジョブスケジュールの対象に GPUs も加えることが可能だが、torqueパッケージをrebuildする必要がある


***GPUs対応torque作成 [#zcfa7faf]
rpmbuildを使います。
なので、SPRMを取得して、展開、SPECファイルを調整して、rebuildな筋書き
#code(nonumber){{
[root@pbs ~]# yum install yum-utils
[root@pbs ~]# yumdownloader --enablerepo=epel --source torque
[root@pbs ~]# rpm -Uvh torque-4.2.10-10.el7.src.rpm
[root@pbs ~]# vi rpmbuild/SPECS/torque.spec
}}
torque.specの変更箇所は下記になる
#code(diff,nonumber){{
--- rpmbuild/SPECS/torque.spec.orig     2016-04-09 22:31:54.000000000 +0900
+++ rpmbuild/SPECS/torque.spec  2020-12-15 23:23:28.256898137 +0900
@@ -381,7 +381,7 @@
   --with-sendmail=%{_sbindir}/sendmail --disable-static \
   --with-tcp-retry-limit=2 --without-debug \
   --enable-drmaa --enable-munge-auth --with-munge \
-  --enable-cpuset --enable-numa-support \
+  --enable-cpuset --enable-numa-support --enable-nvidia-gpus \
   %{server_nameflags} %{guiflags} %{tclflags} %{rcpflags}

 make %{?_smp_mflags}
}}
&color(red){*};&size(10){「--with-nvml-includ」「--with-nvml-lib」を付けるとGPUが認識されない....};
rpmbuildに足りないパッケージをインストールして、rpmbuildします
そうして、rpmbuild を実行する
#code(nonumber){{
[root@pbs ~]# yum install desktop-file-utils pam-devel xauth readline-devel gperf openssl-devel hwloc-devel libxml2-devel \
                  munge-devel tcl-devel tk-devel graphviz "tex(latex)" tex-xtab tex-sectsty tex-tocloft tex-multirow
[root@pbs ~]# rpmbuild -bb rpmbuild/SPECS/torque.spec
}}
再構築が完了すると rpmbuild/RPMS/x86_64/ に rpm ファイルが置かれる
#code(nonumber){{
[root@pbs ~]# ls rpmbuild/RPMS/x86_64/
torque-4.2.10-10.el7.x86_64.rpm              torque-gui-4.2.10-10.el7.x86_64.rpm
torque-client-4.2.10-10.el7.x86_64.rpm       torque-libs-4.2.10-10.el7.x86_64.rpm
torque-debuginfo-4.2.10-10.el7.x86_64.rpm    torque-mom-4.2.10-10.el7.x86_64.rpm
torque-devel-4.2.10-10.el7.x86_64.rpm        torque-pam-4.2.10-10.el7.x86_64.rpm
torque-drmaa-4.2.10-10.el7.x86_64.rpm        torque-scheduler-4.2.10-10.el7.x86_64.rpm
torque-drmaa-devel-4.2.10-10.el7.x86_64.rpm  torque-server-4.2.10-10.el7.x86_64.rpm
[root@pbs ~]#
}}

この作ったパッケージで入れ替えてみる
&color(red){*};&size(10){恐らく計算ノードのみ切り替えればいいのかなと思うのだが、全て切り替えました};

***ジョブ管理ノードへインストール [#x1e1e381]
特段することはなく、作ったtorque-momをインストールするだけ。
#code(nonumber){{
[root@pbs ~]# yum remove "torque*" -y
[root@pbs ~]# cd rpmbuild/RPMS/x86_64/

[root@pbs x86_64]# yum localinstall ./torque-server-4.2.10-10.el7.x86_64.rpm \
                                    ./torque-scheduler-4.2.10-10.el7.x86_64.rpm \
                                    ./torque-libs-4.2.10-10.el7.x86_64.rpm \
                                    ./torque-client-4.2.10-10.el7.x86_64.rpm \
                                    ./torque-4.2.10-10.el7.x86_64.rpm
[root@pbs x86_64]#
}}
とインストールを行う。
そして設定します
#code(nonumber){{
[root@pbs ~]# hostname > /var/lib/torque/server_name
[root@pbs ~]# pbs_server -d /var/lib/torque -t create -f -D
pbs_server is up (version - 4.2.10, port - 15001)              <-- Ctrl-Cで停止

[root@pbs ~]# vi /var/lib/torque/server_priv/nodes
n1 np=1 num_node_boards=1 numa_board_str=1

[root@pbs ~]# create-munge-key
}}
そしてデーモンを起動させます
#code(nonumber){{
[root@pbs ~]# systemctl start trqauthd.service pbs_server.service munge.service
[root@pbs ~]# systemctl enable trqauthd.service pbs_server.service munge.service
}}

***計算ノード [#p0934d82]
GPUs対応のパッケージを計算ノードに組み込みます
GPUノードにはGPUが2枚搭載されています
#code(nonumber){{
[root@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)
[root@s ~]#
}}

まずはパッケージを転送します
#code(nonumber){{
[root@pbs ~]# cd rpmbuild/RPMS/x86_64/
[root@pbs x86_64]# 
[root@pbs x86_64]# scp torque-4.2.10-10.el7.x86_64.rpm torque-libs-4.2.10-10.el7.x86_64.rpm torque-mom-4.2.10-10.el7.x86_64.rpm root@s:
}}
そしてインストール
#code(nonumber){{
[root@s ~]# yum localinstall ./torque-4.2.10-10.el7.x86_64.rpm ./torque-libs-4.2.10-10.el7.x86_64.rpm torque-mom-4.2.10-10.el7.x86_64.rpm
[root@s ~]# vi /var/lib/torque/mom_priv/config
$pbsserver pbs

[root@s ~]#
}}
#code(nonumber){{
[root@s ~]# systemctl enable pbs_mom.service
[root@s ~]# systemctl start pbs_mom.service
}}

***管理ノードに GPUs ノードを追加 [#nd2b85d4]
#code(nonumber){{
[root@pbs ~]# vi /var/lib/torque/server_priv/nodes
n1 np=1 num_node_boards=1 numa_board_str=1
s  np=4 num_node_boards=1 numa_board_str=4 gpus=2

[root@pbs ~]# systemctl restart pbs_server
}}
pbsnodeを実行すると下記になります。

#code(nonumber){{
[root@pbs ~]# pbsnodes
n1-0
     state = free
     np = 1
     ntype = cluster
     status = rectime=1608107709,varattr=,jobs=,state=free,netload=? 0,gres=,loadave=0.00,ncpus=0,physmem=1880672kb(略
     mom_service_port = 15002
     mom_manager_port = 15003

s-0
     state = free
     np = 4
     ntype = cluster
     status = rectime=1608107721,varattr=,jobs=,state=free,netload=? 0,gres=,loadave=0.00,ncpus=0,physmem=32886236kb(略
     mom_service_port = 15002
     mom_manager_port = 15003
     gpus = 2
     gpu_status = gpu[1]=gpu_id=00000000:06:00.0;gpu_product_name=GeForce GT 710;(略)gpu[0]=gpu_id=00000000:01:00.0;gpu_product_name=GeForce GT 710;(略

[root@pbs ~]#
}}
と稼働を確認できる
次にNUMAを利用してGPUノードを仮想的に2つに分けて片方はGPU数0、もう片方はGPU数2としてみる
まず管理ノード側で
#code(nonumber){{
[root@pbs ~]# vi /var/lib/torque/server_priv/nodes
n1 np=1 num_node_boards=1 numa_board_str=1
s  np=4 num_node_boards=2 numa_board_str=1,3 gpus=2 numa_gpu_node_str=0,2

[root@pbs ~]# systemctl restart pbs_server
}}
GPUノード側で
#code(nonumber){{
[root@s ~]# vi /var/lib/torque/mom_priv/mom.layout
nodes=0
nodes=1

[root@s ~]# systemctl restart pbs_mom
}}
として「pbsnode」で確認を取ると
#code(nonumber){{
[root@pbs ~]# pbsnodes
n1-0
     state = free
     np = 1
     ntype = cluster
     status = rectime=1608145809,varattr=,jobs=,state=free,netload=? 0,gres=,loadave=0.00,ncpus=0,physmem=1880672kb,(略
     mom_service_port = 15002
     mom_manager_port = 15003

s-0
     state = free
     np = 1
     ntype = cluster
     status = rectime=1608145819,varattr=,jobs=,state=free,netload=? 0,gres=,loadave=0.00,ncpus=0,physmem=32886236kb,(略
     mom_service_port = 15002
     mom_manager_port = 15003
     gpus = 2
     gpu_status = gpu[1]=gpu_id=00000000:06:00.0;gpu_product_name=GeForce GT 710;(略),gpu[0]=gpu_id=00000000:01:00.0;gpu_product_name=GeForce GT 710;(略

s-1
     state = free
     np = 3
     ntype = cluster
     status = rectime=1608145819,varattr=,jobs=,state=free,netload=? 15205,gres=,loadave=0.00,ncpus=0,physmem=? 15205, (略
     mom_service_port = 15002
     mom_manager_port = 15003
     gpus = 2
     gpu_status = gpu[1]=gpu_id=00000000:06:00.0;gpu_product_name=GeForce GT 710;(略),gpu[0]=gpu_id=00000000:01:00.0;gpu_product_name=GeForce GT 710;(略

[root@pbs ~]#
}}
と双方にGPUが2つ割り当てられてしまった
NUMAでは無理っぽいのかも...

***NUMAを外してGPU対応 [#t6d51fd6]
#code(nonumber){{
--- rpmbuild/SPECS/torque.spec.orig     2016-04-09 22:31:54.000000000 +0900
+++ rpmbuild/SPECS/torque.spec  2020-12-17 04:34:06.454913271 +0900
@@ -381,7 +381,7 @@
   --with-sendmail=%{_sbindir}/sendmail --disable-static \
   --with-tcp-retry-limit=2 --without-debug \
   --enable-drmaa --enable-munge-auth --with-munge \
-  --enable-cpuset --enable-numa-support \
+  --enable-cpuset --enable-nvidia-gpus \
   %{server_nameflags} %{guiflags} %{tclflags} %{rcpflags}

 make %{?_smp_mflags}
}}
こうしてrpmbuildして、管理ノードと計算ノードにrpmを配布+インストールを行う。
設定はほぼ同じで、違いはnodesファイル
#code(nonumber){{
[root@pbs ~]# cat /var/lib/torque/server_priv/nodes
n1 np=1
s np=4 gpus=2
[root@pbs ~]#
}}

これで利用者設定とqueueを作成、「qmgr -c "set server scheduling = True"」を実行して
インターラクティブモードで接続すると
#code(nonumber){{
[illya@pbs ~]$ qsub -l nodes=1:ppn=4:gpus=2 -I
qsub: waiting for job 7.pbs to start
qsub: job 7.pbs ready

[illya@s ~]$ ls -l /var/lib/torque/aux/
total 8
-rw-r--r-- 1 root root  8 Dec 17 04:47 7.pbs
-rw-r--r-- 1 root root 14 Dec 17 04:47 7.pbsgpu


[illya@s ~]$ cat /var/lib/torque/aux/7.pbs     <-- 利用可能なcoreが計算ノードsで4つ
s
s
s
s

[illya@s ~]$ cat /var/lib/torque/aux/7.pbsgpu  <-- 利用可能なGPUが、計算ノードsで2つ。
s-gpu1
s-gpu0
[illya@s ~]$
}}

ここで一旦インターラクティブモードを終えて、次に2つのターミナルで「nodes=1:ppn=4:gpus=1」でリソースを占有してみる
#code(nonumber){{
[illya@pbs ~]$ qsub -l nodes=1:ppn=1:gpus=1 -I
qsub: waiting for job 13.pbs to start
qsub: job 13.pbs ready

[illya@s ~]$ cat /var/lib/torque/aux/13.pbsgpu
s-gpu0
[illya@s ~]$
}}

もう片方は
#code(nonumber){{
[illya@pbs ~]$ qsub -l nodes=1:ppn=1:gpus=1 -I
qsub: waiting for job 14.pbs to start
qsub: job 14.pbs ready

[illya@s ~]$ cat /var/lib/torque/aux/14.pbsgpu
s-gpu1
[illya@s ~]$
}}
と「s-gpu0」「s-gpu1」とGPUID毎に割り当てられる.

っが、残念なことにインターラクティブモードなのだが「nvidia-smi」と実行すると2つのデバイスが見えて
使えてしまいます。
#code(nonumber){{
[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 ~]$
}}


TorqueでGPUリソースの管理はできるのだが、制御として1枚しか使わせないとかは出来ないみたい.
またGPUIDのどれが割り当てられたかは確認できるので、アプリを調整すれば同一計算機内で同じGPUIDを被らないで使うことは可能っぽい.
っが、アプリの調整は大変そう..


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS