本家様 http://www.adaptivecomputing.com/products/open-source/torque/

ジョブコントローラ。SGEと役目は同じなのだが、正直SGEは愚生には重すぎました。わからん...っで
slurmと共にTORQUEも検討した次第。slurmよりもネットに転がっている情報量が多いようで、
こちらTORQUEを使ってみる。

キュー作成TORQUE/queue
TORQUE/Preemption
TORQUE/BLCR
TORQUE/memo
TORQUE/macOS

以前掲載したtorque-2.5.xは、EOSL(End Of Service Life)の模様
GPUs対応 TORQUE/GPUs

その他のジョブコントローラ https://en.wikipedia.org/wiki/Comparison_of_cluster_software

全体像

同一のネットワーク上に管理ノード、計算ノード、ジョブ発行ノードらが存在する。
そして、アカウント管理にはsamba ADを採用して、ユーザのホームディレクトリが各ノードと共有されているとする。
各ノードのsamba ADへの参加は、samba/Linux参加を参考。ホームディレクトリの共有はNFSを参考に
2015y11m07d_110530467.png

管理ノードから計算ノードへのジョブ投入にはsshか、rshを利用する。
sshならSSHホストベース認証か、authorized_keysを用意する。
rshを利用するなら /etc/hosts.equiv の調整を行う。こちらの方が楽かな。

IPとか役目は下記参照

役目ホスト名IPアドレスcore数備考
管理ノードpbs.sybyl.local192.168.0.571
計算ノードn1.sybyl.local192.168.0.521pbs_momが稼働
実際の計算を行う
n2.sybyl.local192.168.0.532
n3.sybyl.local192.168.0.543
ジョブ発行ノードclient.sybyl.local192.168.0.201qsub,qstat

*各マシンは最小構成で構築されて、samba/Linux参加/winbinddにてドメイン参加済み

このようにフラットなネットワーク上に各ノードを繋げる方法の他にも、管理ノードに2つのネットワークを持たせて、
計算ノードを別のネットワーク下に置く方法もある。
2016y03m05d_231440168.png
計算ノードだけのネットワークになるので、より効率的なのかも知れない。

TORQUEパッケージの再構築

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.spec

torque.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 ~]#

管理ノードの構築

*使用する 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)

っが、このデータベースの作成は完了しません。なのでCtrl-Cで強制停止させます。
これでもデータベース(/var/lib/torque/server_priv/serverdb)は作成されます。

計算ノードのリストを用意します。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'

管理ノードの構築その2、ジョブスケジューラ

ジョブを割り振るスケジューラは、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コマンドで起動を確認する

計算ノード

*使用する 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.service

qmgr コマンドを使って通信テストを行います。

[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」で渡されたホストにジョブを投入する。

計算ホストのcore数と nodes ファイルの記載

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」を無効にしてます。

ジョブスクリプトで使用可能なTORQUE由来の環境変数

下記のスクリプトを流して環境変数を得た見た

[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_VERSIONTORQUE-4.2.10
PBS_JOBNAMEa.sh実行したスクリプトファイル名
PBS_ENVIRONMENTPBS_BATCH
PBS_O_WORKDIR/home/illyaスクリプトを実行した場所
PBS_TASKNUM1
PBS_O_HOME/home/illya実行者のホームディレクトリ
PBS_WALLTIME864000
PBS_MOMPORT15003
PBS_GPUFILE/var/lib/torque/aux//8.pbs.sybyl.localgpu
PBS_O_QUEUEbio使用したキューの名称
PBS_O_LOGNAMEillya実行者(ログイン名)
PBS_O_LANGen_US.UTF-8
PBS_JOBCOOKIEB3825133EF21DE765747CC0B926951E0
PBS_NODENUM0
PBS_NUM_NODES3nodesの値
PBS_O_SHELL/bin/bash使用したシェル
PBS_JOBID8.pbs.sybyl.local
PBS_O_HOSTpbs.sybyl.localジョブを発行したホスト
PBS_VNODENUM0
PBS_QUEUEbio使用したキューの名称(PBS_O_QUEUEと同じ?)
PBS_O_MAIL/var/spool/mail/illya
PBS_MICFILE/var/lib/torque/aux//8.pbs.sybyl.localmic
PBS_NP6確保したCPUリソース
PBS_O_SERVERpbs.sybyl.local
PBS_NUM_PPN2ppnの値
PBS_NODEFILE/var/lib/torque/aux//8.pbs.sybyl.local
PBS_O_PATH(PATH)

ジョブスクリプトでの環境変数を組み込んで、それがmpirunで各計算ノードに波及するのか?

簡単なスクリプトで検証する
まずジョブスクリプト

[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 ~]$

として「+」で繋げる


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2017-05-03 (水) 14:23:52 (106d)