slurmをjob queuing systemに使った場合

これらに留意する必要があるっぽい

slurmでrelionを使うときの「qsub.sh」を作ってみている. 「sbatch.sh」とかの名称がいいのかも

2026.02.24 改定. 複数計算ノード対応へ.

#!/bin/bash
#SBATCH --ntasks=XXXmpinodesXXX        # Number of MPI procs
#SBATCH --cpus-per-task=XXXthreadsXXX  # Number of threads
#SBATCH --partition=XXXqueueXXX        # Submit to queue?
#SBATCH --nodes=XXXnodesXXX            # CEIL( XXXcoresXXX / XXXdedicatedXXX )
#SBATCH --error=XXXerrfileXXX
#SBATCH --output=XXXoutfileXXX
#SBATCH --job-name=XXXnameXXX
###SBATCH --gres=gpu:4                 # 無効へ 「Queue submit command」内で"sbatch --gres=gpu:2"(1ノード当たりのGPU使用枚数) とかで定義
#################################
 
cd $SLURM_SUBMIT_DIR
 
### Environment Modules  (ジョブ投入前の環境変数(PATH,LD_LIBRARY_PATH,RELION_XXXが継承されるので不要かも)
. /etc/profile.d/modules.sh
module load mpi/openmpi-x86_64
module load relion                  # modeule load relion/5.0.1 とか module load relion/4.0.2 とか
 
### requested resources
cat <<_EOF_>XXXoutfileXXX
----------------------------------------------
start  `date`
----------------------------------------------
Queue name                         XXXqueueXXX
used nodes                         ${SLURM_JOB_NODELIST}
  +--NumberOfProcess[MPI procs]    XXXmpinodesXXX
     +-- NumberOfThreads[threads]  XXXthreadsXXX
_EOF_
 
### check command
cmd_=$(/bin/cat <<_EOF_
XXXcommandXXX
_EOF_
)
cmd=$(echo "$cmd_" | sed -z 's/\n/\&\&/g')
run=$(echo $cmd|awk '{print $1}')
 
### mpirun option
opt=" --display-map --bind-to none --mca plm_rsh_agent rsh --map-by node --oversubscribe "
opt=" --display-map --bind-to none --mca pml ob1 --mca mtl ^ofi --mca btl self,vader,tcp --mca btl_tcp_if_include lo,eth0 --map-by node --oversubscribe "
opt=" --display-map --bind-to none --mca pml ob1 --mca mtl ^ofi --mca btl self,vader,tcp --map-by node --oversubscribe "
 
### check GPU
np=XXXmpinodesXXX
localnodefile=1
#if [ ${run##*/} =  "relion_refine_mpi" ]; then
#   if [[ $cmd = *--gpu* ]]; then
#      np=$(expr $np + 1)
#   fi
#fi
if [[ ${run##*/} =  *_mpi ]]; then
   np=$(expr $np + 1)
fi
 
### Run
SECONDS=0
command="{ { mpirun $opt --host ${SLURMD_NODENAME} -np $np ${cmd:0:-2} | tee -a XXXoutfileXXX ; } 3>&2 2>&1 1>&3 | tee -a XXXerrfileXXX ; } 3>&2 2>&1 1>&3"
command="{ { mpirun $opt -np $np ${cmd:0:-2} | tee -a XXXoutfileXXX ; } 3>&2 2>&1 1>&3 | tee -a XXXerrfileXXX ; } 3>&2 2>&1 1>&3"
eval $command
 
cat <<_EOF_>>XXXoutfileXXX
----------------------------------------------
use relion: `readlink -f $run`
end time: `date '+%y%m%d %H:%M:%S'`  (spend  `printf "%02d:%02d:%02d\n" $(($SECONDS/3600)) $((($SECONDS%3600)/60)) $(($SECONDS%60))`)
----------------------------------------------
done
_EOF_

メモ

GPUの使用枚数のしては「Queue submit command:」欄で行う. 「sbatch --gres=gpu:2」なら「gpu」とgres.confで定義されたGPUを2枚使うことを意図します

複数ノードを使っての計算が目的なら「--gres=gpu:X」の値は1ノード当たりのGPU数にしてください。

2023y07m29d_112636965.png

relionのソースを修正して、枚数指定の入力欄を拵えればいいのかな.
画面はこんな感じになるのかも.
https://hpc.nih.gov/apps/relion/index.html

あと特定のマシンで計算させたいのなら「Standard submission script」を
「sbatch --gres=gpu:2 --nodelist=gpu01
2台で計算させたいのなら
「sbatch --gres=gpu:2 --nodelist=gpu01,gpu02 --nodes=2
とします。用意されるmpiは「--map-by node」によって各ノードにラウンドロビン(平等に順繰り)で配られます.

メモ その2

mpirunのオプション
「 --display-map --bind-to none --mca pml ob1 --mca mtl ^ofi --mca btl self,vader,tcp --mca btl_tcp_if_include lo,eth0 --map-by node --oversubscribe」
について
「--mca pml ob1」
PML(Point-to-Pint Messaging Layer) ob1[古典的で安定したPML, 仮想にはBTLを使用], ucx[新しい汎用通信スタック, 高速だが環境依存が強い]

「--mca mtl ^ofi」
MTL(Matching Transport Layer) ofi(libfabric)ベースのMTLを使わないと宣言. PSM2/PSM3(Omni-Path)を含むlibfabricプロバイダの利用を拒んでいる.

「--mca btl self,vander,tcp」
BTL(Byte Transfer Layer) PML=ob1 の設定の中で実際の通信を担うレイヤー. self:自分自身の通信, vader: 共有メモリ通信(単一ノード内のrank間通信), tcp: TCP/IPソケット通信(複数ノード間やlo/eth0間)

「--mca_tcp_if_include lo,rth0」
BTLがtcpの際に、使用するインターフェース(loとeth0), これを付けないと/sys/class/net/をみて使えそうなnicにもソケットを作るが、使っていないnicに「UDP socketが作れない」とかで警告が起こりやすい

メモ3

「Standard Submisstion script:」で使用可能な変数とパネルの位置

Number of MPI procs:              => XXXmpinodesXXX
Number of threads;                => XXXthreadsXXX
Submit to queue?:                 => XXXqueueXXX
Minimum dedicated cores per node: => XXXdedicatedXXX
 
XXXmpinodesXXX * XXXthreadsXXX    => XXXcoresXXX            
 
XXXnodesXXX = CEIL( XXXcoresXXX / XXXdedicatedXXX )  --> 16core要求されて、1ノード当たり8coreなら 2ノード。16coreで1ノード3coreなら 16/3 => 5.3 で 6ノード

slurmでは、
「Number of MPI procs」はtaskとして扱い「--ntask(-n)」に該当かと。
「Number of threasds」は「--cpus-per-task(-c)」に該当かなと。
XXXnodesXXX は「--nodes(-N)」に該当かな

計算ノード間にcore数に違いある場合。もし8mpi/2threadsで流したいのに、A:8core、B:16core、c:8coreで、AとCで計算したいなら「Queue submit command」欄に「sbatch --nodes=2 --nodelist=a,c」とします。

最新の60件
2026-05-13 2026-05-12 2026-05-11 2026-05-08 2026-05-06 2026-05-05 2026-05-04 2026-05-03 2026-05-02 2026-04-30 2026-04-29 2026-04-28 2026-04-27 2026-04-25 2026-04-24 2026-04-22 2026-04-21 2026-04-12 2026-04-08 2026-04-06 2026-04-05 2026-04-02 2026-03-26 2026-03-23 2026-03-21 2026-03-19 2026-03-15 2026-03-14 2026-03-13 2026-03-07 2026-03-06 2026-03-04 2026-03-02
  • Relion/slurm
2026-02-26 2026-02-24 2026-02-21 2026-02-18 2026-02-17 2026-02-16 2026-02-11

edit


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2026-03-02 (月) 21:50:24