#author("2020-12-16T08:32:03+00:00","default:sysosa","sysosa") #author("2020-12-16T08:33:17+00:00","default:sysosa","sysosa") もやはOpenSourceではなくなったTORQUE. でもCentOSとかで古いバージョンだけど yum で入手可能です. ここでは&color(lightseagreen){''CentOS 7''}; で TORQUE を使ったジョブコントロールについて記す. &size(10){過去記事 [[torque-4.2.10>TORQUE/180401]]. [[torque-2.5.x>TORQUE151107]]は、EOL(End of Life)/EOSL(End Of Service Life)の模様. [[manualページ>+http://www.adaptivecomputing.com/support/documentation-index/torque-resource-manager-documentation/]]から}; &size(10){GPUs対応 [[TORQUE/GPUs]]}; キュー作成[[TORQUE/queue]] [[TORQUE/Preemption]] [[TORQUE/BLCR]] [[TORQUE/memo]] [[TORQUE/job script]] [[TORQUE/macOS]] [[TORQUE/windows10]] ***全体像 [#wec964f1] 同一のネットワーク上に管理ノード、計算ノード、ジョブ発行ノードらが存在する アカウント管理とかユーザのホームディレクトリは各ノードと共有されているとする 計算ノードへのジョブ投入にはsshかrshのいずれかを選ぶ -ssh 公開鍵を作成してそれを「&color(magenta){~/.ssh/authorized_keys};」に記載する -rsh rsh-serverパッケージをインストールして「&color(orange){/etc/hosts.equiv};」に「+」のみ記載する。 &color(red){*};&size(10){セキュリティーに関わるので要注意箇所です。絶対に「+ +」と記載してはダメ}; &ref(2020y12m13d_191022362.png,noborder); IPとか役目は下記参照 |BGCOLOR(yellow):役目|BGCOLOR(yellow):ホスト名|BGCOLOR(yellow):IPアドレス|BGCOLOR(yellow):core数|BGCOLOR(yellow):備考| |管理ノード|pbs|192.168.0.57|1|| |計算ノード|n1|192.168.0.52|1|pbs_momが稼働&br;実際の計算を行う| |~|n2|192.168.0.53|2|~| |~|n3|192.168.0.54|3|~| |ジョブ発行ノード|client|192.168.0.20|1|qsub,qstat| 管理ノード・計算ノードには下記のようにfirewallに穴をあけておきます #code(nonumber){{ firewall-cmd --add-port=15001/tcp --permanent firewall-cmd --add-port=15002/tcp --permanent firewall-cmd --add-port=15003/tcp --permanent firewall-cmd --reload (場合によっては) firewall-cmd --add-service=rsh --permanent }} ***管理ノードの構築 [#z86def53] toqrueパッケージは epel リポジトリで提供されているのでまずはepelリポジトリを登録します。 それから 管理ノードなので必要な「torque-server」「torque-scheduler」そして管理コマンドを含む「torque-client」をインストールします #code(nonumber){{ [root@pbs ~]# yum install epel-release [root@pbs ~]# yum install torque-server torque-scheduler torque-client (付随して hwloc-libs, munge, munge-libs, tcl, torque, torque-libs もインストールされる) }} 設定を施します。「/var/lib/torque/server_name」に管理ノードのホスト名を記載します #code(nonumber){{ [root@pbs ~]# hostname > /var/lib/torque/server_name [root@pbs ~]# cat /var/lib/torque/server_name pbs [root@pbs ~]# }} 次に、ジョブコントロール向けのデータベースを作ります。 #code(nonumber){{ [root@pbs ~]# pbs_server -d /var/lib/torque -t create -f -D pbs_server is up (version - 4.2.10, port - 15001) }} これでデータベースファイルは作成されますが、pbs_serverデーモンが稼動し続けています。 なのでここで &color(red){Ctrl-C}; によりpbs_serverデーモンを強制停止させます。 そして各計算ノードの情報を「/var/lib/torque/server_priv/nodes」に記載します #code(nonumber){{ [root@pbs ~]# vi /var/lib/torque/server_priv/nodes n1 np=1 num_node_boards=1 numa_board_str=1 [root@pbs ~]# }} &color(red){*};&size(10){ここに記載されるホスト名は、計算ノードで「hostname」と実行したときの値であることが大事みたい}; 次に、qstat/qmgrコマンドの実行に必要な munge のキーファイルを作成します &color(red){*};&size(10){ジョブ発行ノードにここで作った munge.key が必要になります}; #code(nonumber){{ [root@pbs ~]# create-munge-key Generating a pseudo-random key using /dev/urandom completed. [root@pbs ~]# ls -l /etc/munge/ total 4 -r--------. 1 munge munge 1024 Dec 13 19:37 munge.key [root@pbs ~]# }} そして管理ノードでのデーモンを起動します。 #code(nonumber){{ [root@pbs ~]# systemctl start trqauthd.service pbs_server.service munge.service [root@pbs ~]# systemctl enable trqauthd.service pbs_server.service munge.service }} ***計算ノードの構築 [#l161f655] 管理ノードと同じく「epel」リポジトリを登録して、今度は「torque-mom」パッケージのみをインストールします #code(nonumber){{ [root@n1 ~]# yum install epel-release [root@n1 ~]# yum install torque-mom (連動して hwloc-lib, munge, munge-libs, torque, torque-libs もインストールされる) }} 設定としては、「/var/lib/torque/mom_priv/config」に管理ノードの名称を記載します #code(nonumber){{ [root@n1 ~]# vi /var/lib/torque/mom_priv/config $pbsserver pbs [root@n1 ~]# }} #code(nonumber){{ [root@n1 ~]# systemctl enable pbs_mom.service [root@n1 ~]# systemctl start pbs_mom.service }} ***ジョブ発行ノード [#mf8f2b6b] 管理ノードならその場でジョブを発行できますが、それ以外のノードでもジョブを発行できます #code(nonumber){{ [root@client ~]# yum install epel-release [root@client ~]# yum install torque-client (付随して hwloc-libs, libtool-ltdl, munge, munge-libs, tcl, torque, torque-libs もインストールされる) }} 設定を施します。 まずジョブ管理ノードがどこなのかを「/var/lib/torque/server_name」に記載します #code(nonumber){{ [root@client ~]# echo pbs > /var/lib/torque/server_name }} そして、ジョブ管理ノードで作成した「munge.key」を貰い受けます &color(red){*};要、所有者変更 #code(nonumber){{ [root@client ~]# scp root@pbs:/etc/munge/munge.key /etc/munge/munge.key [root@client ~]# chown munge:munge /etc/munge/munge.key [root@client ~]# systemctl enable trqauthd.service munge.service [root@client ~]# systemctl start trqauthd.service munge.service }} これでジョブ発行ノードで qsub、pbsnode、qmgrらが使えます ~ ~ ***管理ノードの「&color(orangered){/var/lib/torque/server_priv/nodes};」 [#e6cf152c] epelリポジトリから得られる Torque は NUMA 対応品です. そのためマルチコア、マルチダイ構成の計算機の場合はちょいと 手を加える必要があるみたい。 コマンド「&color(magenta){lscpu};」の出力に於いて #code(nonumber){{ [root@n5 ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 8 : : NUMA node0 CPU(s): 0-7 }} とか #code(nonumber){{ CPU(s): 28 : NUMA node0 CPU(s): 0-13 NUMA node1 CPU(s): 14-27 }} とか #code(nonumber){{ : CPU(s): 16 : NUMA node0 CPU(s): 0,2,4,6,8,10,12,14 NUMA node1 CPU(s): 1,3,5,7,9,11,13,15 }} とからがある. NUMAは極々あっさりなら core/memoryが密になっている単位で、mpi/threads計算に於いて遠くにあるcoreを使うより互いに近いcoreどうしで計算すればcore間もcore-memory間も距離が短くその分ロスが少なくなる. そんな単位かと思っている. 1筐体より細かい単位かな. これを活用するには「/var/lib/torque/server_priv/nodes」にて #code(nonumber){{ n5 np=8 num_node_boards=1 numa_board_str=8 n6 np=28 num_node_boards=2 numa_board_str=14 n7 np=16 num_node_boards=2 numa_board_str=8 }} と明記します。 &color(red){*};各計算ノードで「hostname」を実行したときの値を付ける必要がある。 &color(red){*};各計算ノードで「&color(magenta){hostname};」を実行したときのホスト名で定義します また運用的に 1core、1core、3core、3core とNUMAを利用して分けることも可能なようで #code(nonumber){{ n5 np=8 num_node_boards=4 numa_board_str=1,1,3,3 }} と表記もできる。 そしてこのNUMAの定義に従い 計算ノード側も調整します 場所は計算機ノードの「/var/lib/torque/mom_priv/mom.layout」になります。 #code(nonumber){{ [root@n5 ~]# cat /var/lib/torque/mom_priv/mom.layout nodes=0 nodes=1 [root@n5 ~]# (1core、1core、3core、3coreとnodesで定義したなら) nodes=0 nodes=1 nodes=2 nodes=3 }} とします。 計算ノードのpbs_momと管理ノードのpbs_serverを再起動して pbsnodes を実行すると #code(nonumber){{ [root@client ~]# pbsnodes n5 n5-0 state = free np = 1 ntype = cluster status = rectime=1607866020,varattr=,jobs=,state=free,(略 mom_service_port = 15002 mom_manager_port = 15003 n5-1 state = free np = 1 ntype = cluster status = rectime=1607866020,varattr=,jobs=,state=free,(略 mom_service_port = 15002 mom_manager_port = 15003 n5-2 state = free np = 3 ntype = cluster status = rectime=1607866020,varattr=,jobs=,state=free,(略 mom_service_port = 15002 mom_manager_port = 15003 n5-3 state = free np = 3 ntype = cluster status = rectime=1607866020,varattr=,jobs=,state=free,(略 mom_service_port = 15002 mom_manager_port = 15003 [root@client ~]# }} と1台なのに複数のノードがあるように見えます。 ...ただこのようにNUMAが有効になっているとジョブを出す側としては 「qsub -l nodes=&color(cadetblue){n5-0:ppn=1};''+''&color(mediumblue){n5-1:ppn=1};''+''&color(chocolate){n5-2:ppn=3};''+''&color(mediumseagreen){n5-3:ppn=3};」としないと1台丸ごと使えないです そうなるとslrumの方が便利かな。使用するqueueと幾つcoreを使うのかでジョブが流せますから。 Torque/openPBSはqueue名とホスト名(ホスト数)が必要で、NUMAが絡むとNUMA1つが1つのホスト(ホスト数)になる。 この辺も注意する必要があるので場合によってはNUMAのサポートを切ったバイナリを使うのもありかと. 参照[[TORQUE/180401]] ***利用者登録 [#g582f1bc] mungeを使うとjobを投入するにも確認するにもまずはTorqueへのユーザ登録が必要です。 &color(red){*};&size(10){CentOS提供のTorqueパッケージはデフォでmungeを採用しているので必須作業です}; 参照:[[TORQUE/queue#a92b7130]] 管理ノードにて #code(nonumber){{ [root@pbs ~]# qmgr Max open servers: 9 Qmgr: set server authorized_users=illya@* }}