sge gridengineをubuntu 18.04 lts, 20.04 lts, redhat 7に入れる

今まで,古いsgeのディレクトリを使い続けてもubuntu14から18までは問題なく動いていた.20.04 ltsにすると,一部の計算機でうまくジョブが走らなくなった.exit codeは10で早期にこけているようだということしかわからない.だましだまし使うのをやめ,aptやyumでgridengineをインストールし直すことにした.以下は,大体やる順番である.

 

 

1. gridengineのaptやyumのパッケージ(master, exec, common, mon)を入れる.

2. 古いsgeではrootで管理されていたが,aptやyumでパッケージを入れると自動的にsgeadminというアカウントが加わり,このアカウントで管理する.sgeadminのuidとgidを各計算機で同一にする.

3. masterをinst_masterでいれる.masterが動く計算機=master nodeではexecが自動的に入ったのかいまいち記憶にないが,execも入れた状態にする.

4. queue, host, parallel environmentを古いsgeのmaster nodeの設定を表示させファイルに出力させる.これらのファイルを用いて,今回のgridengineのmaster nodeに同じ設定をする.

5. execのみが動く計算機=workerにも同じパッケージ群をaptやyumで入れる.

6. master nodeのdefaultディレクトリをtarで固め,workerで展開する.

7. workerにinst_execでexecをいれる.

8. default/comon/settings.shおよびsetting.cshを/etc/profile.dにSGE.sh, SGE.cshとしてシンボリックリンクをはる.

9. ubuntuの場合は,パッケージを入れるとsystemctrlでデーモンが起動および停止ができる.systemctrl start, stop, statusを何度かして,正常にデーモンが動くのを確認する.古いsgeのデーモンが走っていたりしたらkillする.

10. デーモンが走っており,qstat -fでホストが正常表示されたら,テストジョブを投げ,通ればOK. 通らない場合,workerでデーモンがエラーになっている(systtemctrl statusでdead等)場合が多く,systemctrlで起動・停止,kill等で正しく動かせれば,jobはうまく走るようである.

11. redhat系のexecデーモン自動起動はよくわからなかった.リブートしつつsgeexecを直接叩き,デーモンが動くようにする.

12.システムを再起動または停止するまえに、古いsgeの起動ファイル(/etc/init.d/sgemaster.xxx及びsgeexec.xxx)を除く。

★ 3と7は,sudo -u sgeadmin ./install_exec,suto -u sgeadmin sgeexecによりrootでなくsgeadminで行う.

ubuntuでの全体の流れはここここを参考にした.redhat系はここ(pdf).

★qconfを使ってqueue等の設定を作るのには,たしか英語のページでここが良かったよう.

 

追記 2023/05/14

複数のディレクトリで順番にシェルのforループで網羅的にqsubすることがあるが,古いsgeに比べて,今回入れたgridengineでは一つ一つのレスポンスが速くなった気がする.

 

追記 2023/05/28

あまりないかもしれないが、mpirunで並列化したプログラムのジョブでノード内の並列ではメモリ使用量が計算速度を律速する場合、複数のホストにできるだけ低いコア数で割り当てたい場合がある。そのときは$fill_upではなく$round_robinというallocation_ruleを用いる。fillupというpararell_environmentがすでにあったので、それを利用して$round_robinをall.qで使えるようにした:

1. fillupの設定をファイルに落とし、書き換えてroundrobinというparallel_environmentを作る。

qconf -sp fillup > roundrobin

vi roundrobin

(roundrobin のallocation_ruleを$fill_upから$round_robinに, pe_nameをfillupからroundrobin書き換える。)

sudo -u sgeadmin qconf -Ap roundrobin

2. all.qにroundrobinを加える。

sudo -u sgeadmin qconf -mq all.q

all.qのparallel_environments にroundrobinを追加して保存。

 

以下の内容をqsubしてやると、2コアでメモリが94G以上食ってswapを使っていたのが、2つのノードでそれぞれ1コアずつ使ってswapを使うのを回避できた。

#$ -cwd
#$ -V -S /bin/zsh
#$ -N run6204q04
#$ -q all.q@nova4,all.q@nova5
#$ -pe roundrobin*  2
#$ -e err-$JOB_ID
#$ -o std-$JOB_ID
#source /opt/intel/oneapi/setvars.sh
source /opt/mlfsoft/python-utsusemi/utsusemi/DNA/bashrc.py3.DNA
mpirun -np 2 ./get_resampled_data_using_class_w_uncorr_mpi_run6204.py

 

追記 2023/06/06

ノード間での並列が特定の1つのホストではうまく行かなかった。sgeのジョブのログには、ファイヤーウォールが邪魔している等の原因候補が示されているが、ファイヤーウォールなど設定していないはずで、sshdとかの設定が悪いとかいろいろ比較試行錯誤したが、わからずじまいだった。/va/logのauth.logを見てもなにもない。よくよくみると、/var/log/kern.logがうまく行かないジョブの投入と連動して行が増えており、通信IP、NIC, ポートもsgeのジョブと対応していた。それらの行には、UFW BLOCKとある。

ufwファイヤーウォールで、iptablesと組んで働く。ノード間並列がうまく行かないホストでのみufwがactiveになっていたので、

sudo ufw disable

でinactiveにした。これでノード間並列はできるようになった。

再起動しても、ufwはinactiveのままであった。

できればiptablesごと削除したいが、とりあえずはこのままにしておく。

 

追記 2023/07/11

2023/05/28に記述したroundrobinのPEだけでは、同様のジョブが複数ある場合、投げてしまうとノードのコア数一杯までジョブが走り、メモリが不足してしまう。このため、ジョブが終わったあとその都度次のジョブを投入するということになる。これではqueueing systemの意味があまりない。ノードおよび個々のノードのコア数を限定した新たなqueueを用意すれば、複数のジョブを投げても1つのジョブだけ走り、残りは順次終わるまで待つようだ。手順例は以下の通り。

例えば 36コアあるノードnova6, nova7, nova8, nova9でそれぞれ5コアずつ出し、20コアの並列計算を順次行うことを考える。5コアというコア数は、メモリで限定されたもの。

1. nova6, nova7, nova8, nova9で構成されるホストグループを新たに作る。

 qconf -shgrpl  現在あるホストグループのリストを表示

 qconf -shgrp @allhosts > x36hosts 既存のホストグループ(@allhosts)の内容をx36hostsというファイルに保存、中身を以下のように編集。

group_name @x36hosts
hostlist nova6 nova7 nova8 nova9

    sudo -u sgeadmin qconf -Ahgrp x36hosts

2. コア数とノードを限定したqueueを作る。

   qconf -sql  現在あるqueueのリストを表示

   qconf -sq all.q > resamples.q 既存のqueue(all.q)の内容をresamples.qというファイルに保存、中身の一部を以下のように編集。

qname                 resamples.q
hostlist              @x36hosts
pe_list               make smp roundrobin
slots                 1,[nova6=5],[nova7=5],[nova8=5],[nova9=5]

   sudo -u sgeadmin qconf -Aq resamples.q 新たなqueue(resamples.q)を登録。

3. ジョブのファイル例:

#$ -cwd
#$ -V -S /bin/zsh
#$ -N run4174qm
#$ -pe roundrobin*  20
#$ -q resamples.q@nova6,resamples.q@nova7,resamples.q@nova8,resamples.q@nova9
#$ -e err-$JOB_ID
#$ -o std-$JOB_ID
mpirun -np 20 ./get_resampled_data_mpi_using_classmgc3_classtmp.py