本家様 http://www.adaptivecomputing.com/products/open-source/torque/
ジョブコントローラ。SGEと役目は同じなのだが、正直SGEは愚生には重すぎました。わからん...っで
slurmと共にTORQUEも検討した次第。slurmよりもネットに転がっている情報量が多いようで、
こちらTORQUEを使ってみる。
キュー作成TORQUE/queue
TORQUE/Preemption
TORQUE/BLCR
TORQUE/memo
TORQUE/job script
TORQUE/macOS TORQUE/windows10
以前掲載したtorque-2.5.xは、EOSL(End Of Service Life)の模様
* 6.1.xより昔のバージョンは全てEOL/EOSLの様子(1709)、manualページ
から
GPUs対応 TORQUE/GPUs
マニュアルhttp://docs.adaptivecomputing.com/torque/4-2-10/help.htm
その他のジョブコントローラ https://en.wikipedia.org/wiki/Comparison_of_cluster_software
同一のネットワーク上に管理ノード、計算ノード、ジョブ発行ノードらが存在する。
そして、アカウント管理にはsamba ADを採用して、ユーザのホームディレクトリが各ノードと共有されているとする。
各ノードのsamba ADへの参加は、samba/Linux参加を参考。ホームディレクトリの共有はNFSを参考に
&ref(): File not found: "2015y11m07d_110530467.png" at page "TORQUE/180401";
管理ノードから計算ノードへのジョブ投入にはsshか、rshを利用する。
sshならSSHホストベース認証か、authorized_keysを用意する。
rshを利用するなら /etc/hosts.equiv の調整を行う。こちらの方が楽かな。
IPとか役目は下記参照
| 役目 | ホスト名 | IPアドレス | core数 | 備考 |
| 管理ノード | pbs.sybyl.local | 192.168.0.57 | 1 | |
| 計算ノード | n1.sybyl.local | 192.168.0.52 | 1 | pbs_momが稼働 実際の計算を行う |
| n2.sybyl.local | 192.168.0.53 | 2 | ||
| n3.sybyl.local | 192.168.0.54 | 3 | ||
| ジョブ発行ノード | client.sybyl.local | 192.168.0.20 | 1 | qsub,qstat |
*各マシンは最小構成で構築されて、samba/Linux参加/winbinddにてドメイン参加済み
このようにフラットなネットワーク上に各ノードを繋げる方法の他にも、管理ノードに2つのネットワークを持たせて、
計算ノードを別のネットワーク下に置く方法もある。
&ref(): File not found: "2016y03m05d_231440168.png" at page "TORQUE/180401";
計算ノードだけのネットワークになるので、より効率的なのかも知れない。
gpuマシンがあるのでこれを有効にしてみた。
*gpu対応のためにライブラリインストールはCUDAを参照
*c.sybyl.localにはnvidiaカードは入ってないがライブラリはカードの有無関係なくインストールできます
*既定であるmungeとcpusetはそのまま有効にした。numaも既定では有効だが、、怪しい挙動があったので無能にした。参照TORQUE/torque.spec
[root@c ~]# yum install yum-utils
[root@c ~]# yumdownloader --enablerepo=epel --source torqueにてtorqueのSPRMパッケージ torque-4.2.10-10.el7.src.rpm を取得した。このパッケージのSPECファイルを修正して再構築します。
[root@c ~]# rpm -Uvh torque-4.2.10-10.el7.src.rpm
[root@c ~]# vi rpmbuild/SPECS/torque.spectorque.specファイルの修正箇所TORQUE/torque.spec
その後、パッケージを作ります
[root@c ~]# rpmbuild -bb rpmbuild/SPECS/torque.spec完成したrpmパッケージは下記となる。これらのファイルを必要に応じて管理ノード、計算ノード、ジョブ発行ノードにコピーします。
[root@c ~]#
[root@c ~]# ls rpmbuild/RPMS/x86_64/
torque-4.2.10-10.el7.centos.x86_64.rpm torque-gui-4.2.10-10.el7.centos.x86_64.rpm
torque-client-4.2.10-10.el7.centos.x86_64.rpm torque-libs-4.2.10-10.el7.centos.x86_64.rpm
torque-debuginfo-4.2.10-10.el7.centos.x86_64.rpm torque-mom-4.2.10-10.el7.centos.x86_64.rpm
torque-devel-4.2.10-10.el7.centos.x86_64.rpm torque-pam-4.2.10-10.el7.centos.x86_64.rpm
torque-drmaa-4.2.10-10.el7.centos.x86_64.rpm torque-scheduler-4.2.10-10.el7.centos.x86_64.rpm
torque-drmaa-devel-4.2.10-10.el7.centos.x86_64.rpm torque-server-4.2.10-10.el7.centos.x86_64.rpm
[root@c ~]#各rpmパッケージに何が入っているかは rpm -qpl とかで見れます
[root@c ~]# rpm -qpl ./rpmbuild/RPMS/x86_64/torque-4.2.10-10.el7.centos.x86_64.rpm
/etc/torque/pbs_environment
/etc/torque/server_name
/usr/lib/systemd/system/trqauthd.service
/usr/sbin/trqauthd
:
[root@c ~]#*使用する torqueパッケージ(これら管理ノードへコピーします)
torque-4.2.10-10.el7.centos.x86_64.rpm
torque-libs-4.2.10-10.el7.centos.x86_64.rpm
torque-client-4.2.10-10.el7.centos.x86_64.rpm
torque-server-4.2.10-10.el7.centos.x86_64.rpmこの作ったrpmファイルをインストールします。
[root@pbs ~]# yum -y localinstall \
torque-4.2.10-10.el7.centos.x86_64.rpm \
torque-libs-4.2.10-10.el7.centos.x86_64.rpm \
torque-client-4.2.10-10.el7.centos.x86_64.rpm \
torque-server-4.2.10-10.el7.centos.x86_64.rpm次に、管理ノードのサイトをserver_nameに定義して、pbs_serverのデータベースを作成する
[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)これでデータベースファイルは作成されますが、pbs_serverデーモンが稼動し続けています。
なのでここで Ctrl-C によりpbs_serverデーモンを強制停止させます。
*「pbs_server -t create」でデータベースファイルを作って終了すればいいのだが、、
計算ノードのリストを用意します。npはノードあたりのcpuコア数です
[root@pbs ~]# vi /var/lib/torque/server_priv/nodes
n1.sybyl.local np=1
n2.sybyl.local np=2
n3.sybyl.local np=3
[root@pbs ~]#NUMAをサポートするなら、NUMAの数を定義に加える
[root@pbs ~]# vi /var/lib/torque/server_priv/nodes
n1.sybyl.local np=1 num_node_boards=1
n2.sybyl.local np=2 num_node_boards=1
n3.sybyl.local np=3 num_node_boards=1
[root@pbs ~]#*計算ノードはFQDNにしないとエラー(Node n1 is reporting on node n1.sybyl.local, which pbs_server doesn't know about)が発生する場合がある
*「num_node_boards」はNUMAの数を示します。lscpuとかで確認できます。詳しくはここを参照
*このNUMAを取り扱いたくないなら、configureで「--enable-numa-support」を外す
mungeのキーを作成します
[root@pbs ~]# /usr/sbin/create-munge-key
Generating a pseudo-random key using /dev/urandom completed.
[root@pbs ~]#キーファイルは「/etc/munge/munge.key」に置かれます。
その後にtrqauthd、pbs_server、mungeを起動させます。
[root@pbs ~]# systemctl start trqauthd.service pbs_server.service munge.service
[root@pbs ~]# systemctl enable trqauthd.service pbs_server.service munge.serviceこれでスケジューラを除いて管理ノードの基本はできた。
試しに現在の状況を確認すると
[root@pbs torque]# qmgr -c "p s"
#
# Set server attributes.
#
set server acl_hosts = pbs.sybyl.local
set server log_events = 511
set server mail_from = adm
set server scheduler_iteration = 600
set server node_check_rate = 150
set server tcp_timeout = 300
set server job_stat_rate = 45
set server poll_jobs = True
set server mom_job_sync = True
set server next_job_number = 0
set server moab_array_compatible = True
set server nppcu = 1
[root@pbs torque]#となる。管理ノードから直接ジョブ発行はできるのだが、あとでジョブ発行ノードを追加するので
そのサイトを登録する
[root@pbs ~]# qmgr -c 'set server submit_hosts = client'ジョブを割り振るスケジューラは、TORQUEで提供されている torque-scheduler でもいいのだが、細かい制御が無理。
なので、http://www.adaptivecomputing.com/products/open-source/maui/
の maui を使用している。
開発環境とTorque-develをインストールして、このmauiをコンパイル/インストールします(/usr/local/mauiを起点にした)
[root@pbs ~]# yum -y groupinstall "Development Tools"
[root@pbs ~]# yum -y localinstall ./torque-devel-4.2.10-9.el7.centos.x86_64.rpm
[root@pbs ~]# gzip -cd maui-3.3.1.tar.gz | tar xf - && cd maui-3.3.1
[root@pbs maui-3.3.1]# ./configure --with-pbs=/usr
[root@pbs maui-3.3.1]# make && make install
[root@pbs maui-3.3.1]# cp etc/maui.d /etc/init.d
[root@pbs maui-3.3.1]# vi /etc/init.d/maui.d
- MAUI_PREFIX=/opt/maui
+ MAUI_PREFIX=/usr/local/maui
[root@pbs maui-3.3.1]#起動スクリプトは init.d しか提供されてなく、CentOS7の systemctl 向けのは用意されていない。
っで、作ってみた
[root@pbs ~]# vi /etc/systemd/system/maui.service
[Unit]
Description=maui job scheduler
After=syslog.target network.target
[Service]
Type=oneshot
ExecStart=/etc/init.d/maui.d start
ExecStop=/etc/init.d/maui.d start
ExecReload=/etc/init.d/maui.d restart
RemainAfterExit=yes
LimitNOFILE=32768
[Install]
WantedBy=multi-user.target
[root@pbs ~]#
[root@pbs ~]# systemctl --system daemon-reload
[root@pbs ~]# systemctl enable maui.service
[root@pbs ~]# systemctl start maui.service*journalctlコマンドで起動を確認する
留意
mauiスケジューラは「gpu」に対応してません。なのでTorqueでgpuの占有を示すキーワードがあると止まります。
たとえTorqueそのものをGPU対応で作ったとしても
「#PBS -l nodes=1:ppn=1:gpus=1」とかの「gpus=1」があると駄目みたい。
mauiスケジューラの変わりにtorque-schedulerの「pbs_sched」スケジューラはgpuを扱えます。
TORQUE/scheduler
*使用する torqueパッケージ(計算ノードへコピーします)
torque-4.2.10-10.el7.centos.x86_64.rpm
torque-libs-4.2.10-10.el7.centos.x86_64.rpm
torque-mom-4.2.10-10.el7.centos.x86_64.rpmそしてインストール
[root@n1 ~]# yum -y localinstall ./torque-4.2.10-10.el7.centos.x86_64.rpm \
torque-libs-4.2.10-10.el7.centos.x86_64.rpm torque-mom-4.2.10-10.el7.centos.x86_64.rpm*同時にhwloc-lib、libtool-ltdl、munge、munge-libsがインストールされる
次に、設定ファイル /var/lib/torque/mom_priv/config を修正して、
[root@n1 ~]# vi /var/lib/torque/mom_priv/config
$pbsserver pbs
$usecp *:/home /home
$log_file_suffix %h
$log_keep_days 10
[root@n1 ~]#*「$log_file_suffix」が効かない。。 configure に「--with-momlogsuffix=%h」を入れると目的通りログにホスト名が付く
起動させる
[root@n1 ~]# systemctl enable pbs_mom.service
[root@n1 ~]# systemctl start pbs_mom.service管理ノードで確認をとる。
[root@pbs ~]# pbsnodes -l all
n1.sybyl.local free
n2.sybyl.local down
n3.sybyl.local down
[root@pbs ~]#とn1が認識された。これを計算ノードの数だけ行う
*NUMAを有効にしていると下記のようになる
[root@pbs ~]# pbsnodes -l all
n1.sybyl.local-0 free
n2.sybyl.local down
n3.sybyl.local down
[root@pbs ~]#*使用する torqueパッケージ(ジョブ発行ノードへコピーします)
torque-4.2.10-10.el7.centos.x86_64.rpm
torque-libs-4.2.10-10.el7.centos.x86_64.rpm
torque-client-4.2.10-10.el7.centos.x86_64.rpmそしてインストール。
[root@client ~]# yum -y localinstall ./torque-4.2.10-10.el7.centos.x86_64.rpm \
torque-libs-4.2.10-10.el7.centos.x86_64.rpm torque-client-4.2.10-10.el7.centos.x86_64.rpmまたmungeを使っているので管理ノードのmungeキーを貰い受けます
[root@pbs ~]# scp /etc/munge/munge.key root@client:/etc/munge
[root@client ~]# chown munge:munge /etc/munge/munge.keyジョブ発行ノードのサイトを定義して、trqauthd.serviceとmunge.serviceを起動させます
[root@client ~]# echo pbs > /var/lib/torque/server_name
[root@client ~]# systemctl enable trqauthd.service munge.service
[root@client ~]# systemctl start trqauthd.service munge.serviceqmgr コマンドを使って通信テストを行います。
[root@client ~]# qmgr -c "p s"
#
# Set server attributes.
#
set server acl_hosts = pbs.sybyl.local
set server log_events = 511
set server mail_from = adm
set server scheduler_iteration = 600
set server node_check_rate = 150
set server tcp_timeout = 300
set server job_stat_rate = 45
set server poll_jobs = True
set server mom_job_sync = True
set server next_job_number = 0
set server moab_array_compatible = True
set server nppcu = 1
[root@client ~]#これでジョブ発行ノードの構築は完了
次の段階に進む前に、キューを作成します。
参照TORQUE/queue
単純なスクリプトで確認してみる
[illya@client ~]$ echo "sleep 30" | qsub
3.pbs.sybyl.local
[illya@client ~]$ qstat -n
pbs.sybyl.local:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
----------------------- ----------- -------- ---------------- ------ ----- ------ ------ --------- - ---------
3.pbs.sybyl.local illya batch STDIN 12008 1 1 -- 480:00:01 R --
n3
[illya@client ~]$[illya@client ~]$ cat a.sh
#!/bin/sh
#PBS -q bio
#PBS -l nodes=1:ppn=1
cd $PBS_O_WORKDIR
#--------------------------#
# write your job
sleep 30
echo `hostname`
[illya@client ~]$ qsub a.sh
4.pbs.sybyl.local
[illya@client ~]$ qstat -n
pbs.sybyl.local:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
----------------------- ----------- -------- ---------------- ------ ----- ------ ------ --------- - ---------
4.pbs.sybyl.local illya bio a.sh 11154 1 1 -- -- R 00:00:00
n1
[illya@client ~]$
[illya@client ~]$ cat a.sh.o4
n1.sybyl.local
[illya@client ~]$qsubは指定されたリソースの予約確保を行い、その確保されたホストにジョブを1つ投入する。
nodes、ppnで指定された数だけジョブを投げるのではない。確保だけ行って、そこにジョブを投入するだけ。
だが、その後、投げられたジョブが起点となって確保したリソースを使用するかはジョブの中身次第。
mpirunであれば、最初にqsubから投げられたジョブがマスターノードになって、「-machinefile」で渡されたホストにジョブを投入する。
server_priv/nodes に記載した「np」の値はそのマシンのコア数を表示するものであるが、別に異なっても構わない。
例として、n3.sybyl.localは、1cpu/1coreで動いているが、
[root@n3 ~]# LANG=C lscpu -e
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
0 0 0 0 0:0:0:0 yes
[root@n3 ~]#server_priv/nodesで「np=3」としていると
[root@pbs ~]# pbsnodes n3.sybyl.local
n3.sybyl.local
state = free
np = 3
(略
[root@pbs ~]#と認識される
これはconfigureの際、「cpuset」を有効にすれば回避され、ハードウエアにあわせて「np」の値が変更されます。
関連擁護としては cgroup とか hwloc かな
ここではわざと「cpuset」を無効にしてます。
下記のスクリプトを流して環境変数を得た見た
[illya@pbs ~]$ vi a.sh
#!/bin/sh
#PBS -q bio
#PBS -l nodes=3:ppn=2
#PBS -j oe
env
[illya@pbs ~]$ qsub a.sh「env」コマンドで得られた結果から先頭文字PBSの値を書きに掲載
| 変数名 | 値 | 備考 |
| PBS_VERSION | TORQUE-4.2.10 | |
| PBS_JOBNAME | a.sh | 実行したスクリプトファイル名 |
| PBS_ENVIRONMENT | PBS_BATCH | |
| PBS_O_WORKDIR | /home/illya | スクリプトを実行した場所 |
| PBS_TASKNUM | 1 | |
| PBS_O_HOME | /home/illya | 実行者のホームディレクトリ |
| PBS_WALLTIME | 864000 | |
| PBS_MOMPORT | 15003 | |
| PBS_GPUFILE | /var/lib/torque/aux//8.pbs.sybyl.localgpu | |
| PBS_O_QUEUE | bio | 使用したキューの名称 |
| PBS_O_LOGNAME | illya | 実行者(ログイン名) |
| PBS_O_LANG | en_US.UTF-8 | |
| PBS_JOBCOOKIE | B3825133EF21DE765747CC0B926951E0 | |
| PBS_NODENUM | 0 | |
| PBS_NUM_NODES | 3 | nodesの値 |
| PBS_O_SHELL | /bin/bash | 使用したシェル |
| PBS_JOBID | 8.pbs.sybyl.local | |
| PBS_O_HOST | pbs.sybyl.local | ジョブを発行したホスト |
| PBS_VNODENUM | 0 | |
| PBS_QUEUE | bio | 使用したキューの名称(PBS_O_QUEUEと同じ?) |
| PBS_O_MAIL | /var/spool/mail/illya | |
| PBS_MICFILE | /var/lib/torque/aux//8.pbs.sybyl.localmic | |
| PBS_NP | 6 | 確保したCPUリソース |
| PBS_O_SERVER | pbs.sybyl.local | |
| PBS_NUM_PPN | 2 | ppnの値 |
| PBS_NODEFILE | /var/lib/torque/aux//8.pbs.sybyl.local | |
| PBS_O_PATH | (PATH) |
簡単なスクリプトで検証する
まずジョブスクリプト
[illya@pbs ~]$ vi a.sh
#!/bin/sh
#PBS -q bio
#PBS -l nodes=2:ppn=1
#PBS -j oe
#
cd $PBS_O_WORKDIR
#
export PATH=/Appl/Linux/NAMD_2.11_Linux-x86_64-multicore:$PATH <---この環境変数がmpirunで各計算ノードに渡るのか検証
#
mpirun -np 2 /home/illya/b.sh
[illya@pbs ~]$mpirunで実行される b.sh は
[illya@pbs ~]$ vi b.sh
#!/bin/bash
echo $PATH
[illya@pbs ~]$と単純にPATH環境変数のみを返す。
そして、これを実際にqsub経由で流してみる
[illya@pbs ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/illya/.local/bin:/home/illya/bin
[illya@pbs ~]$ qsub a.shすぐさま完了して、そのログを見てみると
[illya@pbs ~]$ cat a.sh.o9
/Appl/Linux/NAMD_2.11_Linux-x86_64-multicore:/usr/local/bin:/usr/bin:/usr/local/sbin:(略
/Appl/Linux/NAMD_2.11_Linux-x86_64-multicore:/usr/local/bin:/usr/bin:/usr/local/sbin:(略
[illya@pbs ~]$と指定したPATHが含まれて各計算ノードに渡っていた
利用可能なリソースから空いている計算機にジョブを投げるのが「うり」なのだが、ノードを指定して計算することもできる
nodesを使用するノードの数ではなく、ホスト名を入れれば計算ノードが指定される。
[illya@pbs ~]$ vi a.sh
#!/bin/sh
#PBS -q bio
#PBS -l nodes=n1.sybyl.local:ppn=1
#PBS -j oe
#
(略
[illya@pbs ~]$複数指定をするなら
[illya@pbs ~]$ vi a.sh
#!/bin/sh
#PBS -q chem
#PBS -l nodes=n2.sybyl.local:ppn=2+n3.sybyl.local:ppn=2
#PBS -j oe
#
(略
[illya@pbs ~]$として「+」で繋げる