slurmで流すときの「Standard submission script」を作ってみた. ファイル名は「sbatch.sh」としています
2026.08.31 改定. 複数計算ノード対応へ.
#!/bin/bash
#SBATCH --ntasks=XXXmpinodesXXX # Number of MPI procs
#SBATCH --cpus-per-task=XXXthreadsXXX # Number of threads
#SBATCH --partition=XXXqueueXXX # Queue name
#SBATCH --nodes=XXXnodesXXX # CEIL( XXXcoresXXX / XXXdedicatedXXX ) 必要なcore数を1台当たりのcore数で割って切り上げ. ノード数
#SBATCH --error=XXXerrfileXXX
#SBATCH --output=XXXoutfileXXX
#SBATCH --job-name=XXXnameXXX
cd $SLURM_SUBMIT_DIR
### Environment Modules
. /etc/profile.d/modules.sh
module load mpi/openmpi-x86_64
module load relion
### requested resources
cat <<_EOF_>XXXoutfileXXX
----------------------------------------------
start `date`
----------------------------------------------
Queue name XXXqueueXXX
required cores XXXcoresXXX :( XXXmpinodesXXX[mpi] * XXXthreadsXXX[threads] )
nodes XXXnodesXXX :CEIL( XXXcoresXXX / XXXdedicatedXXX ) :( ${SLURM_JOB_NODELIST} )
_EOF_
### check command
cmd_=$(/bin/cat <<_EOF_
XXXcommandXXX
_EOF_
)
cmd=$(echo "$cmd_" | sed -z 's/\n/\&\&/g')
run=$(echo $cmd|awk '{print $1}')
### Run
export OMPI_MCA_pml=ob1
export OMPI_MCA_btl=self,vader,tcp
SECONDS=0
command="{ { srun --mpi=pmix_v3 ${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_「srun」で投げてますが、以前この部分をmpirunで以前は作ってました.
mpirunなので「--oversubscribe」とかでrelion_refine_mpiの時の親mpi対処ができたのですが、、それよりもsrunの方が計算が早いみたい.
ただそうなると「--oversubscribe」が使えないので「Number of MPI procs」「Number of threads」「Minimum dedicated cores per node」らの値の算出が結構面倒...
Class2DやClass3DはGPUを使っての計算が可能ですが、複数のMPIを使って計算する場合、親MPIを考慮する必要がある。でも親MPIはGPU計算を行わない。子MPIのみGPU計算が可能
例えば、4枚GPUマシンが2台あってそれを全て使って計算したいとなると、
1つのGPUに1つのMPI(子MPI)プロセスを割り当てるなら、8MPIが必要
加えて、親MPIを1つ加えての合計9MPIが必要となる
次に、1つのノードに幾つのMPIを乗せるか。9MPIの計算になるので、1つのノードには 9÷2 = 4.5 なので、5MPI割り当てる
もし 32core/4GPUと64core/4GPUなら、少ない32coreに合わせて、32÷5 = 6.4 で、1MPI当たり6core割り当てることになる
9MPIを6coreで計算するので、全体では9 x 6 = 54 core必要として、1ノードでは54÷2 = 27 なので1ノードの最低coreを27 coreと定義します
これでパネルは下記のようにします

*「Compute」タグでは「Use GPU acceleration?」を有効にして「Which GPUs to use」は無記載でもok
見切れてますが「Queue submit command」は「sbatch --ntasks-per-node=5 --gres=gpu:4」です。1ノードあたり5mpiを消費して、4GPUを使用する意図です。
ログ(run.out)には
:
Queue name g
required cores 54 :( 9[mpi] * 6[threads] )
nodes 2 :CEIL( 54 / 27 ) :( g[01-02] )
:と記載されます
slurm側では、それぞれ30coreを確保して計算されることになります. (5mpi * 6 threads)
(sloadから)
Queue Run wait Host CPU usage GPU
g01 30/64 **********---------- 4/4 **** pro4000 mix
g02 30/32 *******************- 4/4 **** pro4000 mixGPUを使わず、全CPU coreを使って計算したいなら. MotionCorrectionとかでしょうか
32coreマシンと64coreマシンなら、1MPI1threadsとして、96MPIを用意できる。この96MPIの中に親MPIを入れる。
core数が違うので、--ntasks-per-nodeで均等割りはしない
96÷2 = 48 なので、1ノードの最低coreを48 coreと定義しますパネルにすれば

*「Compute」タグでは「Use GPU acceleration?」は無効にします
ログ(run.out)には
:
Queue name g
required cores 96 :( 96[mpi] * 1[threads] )
nodes 2 :CEIL( 96 / 48 ) :( g[01-02] )
:と記載されます
slurm側では、それぞれ全core確保して計算されることになります.
(sloadから)
Queue Run wait Host CPU usage GPU
g01 64/64 ******************** 0/4 ---- pro4000alloc
g02 32/32 ******************** 0/4 ---- pro4000allocとなります
1台の2基のGPUがあって、それぞれが32coreなら
1つのGPUに1つのMPI(子MPI)プロセスを乗せるので、4 x 2 = 8MPI
加えて、親MPIがあるので合計9MPIが必要となる
次に1つのノードには 9(MPI)÷4(台) = 2.25なので、3MPIを割り当てる
そして32coreマシンなので、32÷3 = 10.67で、1MPI当たり10core割り当てる
9MPIをそれぞれ10coreで計算するので、全体では9 x 10 = 90 coreが必要で、1ノードでは 90 ÷ 4 = 22.5、1ノードの最低コアは23とします
パネルでは下記のようになります

見切れてますが「Queue submit command」は「sbatch --ntasks-per-node=3 --gres=gpu:2」です。1ノードあたり3mpiを消費して、2GPUを使用する意図です。
run.outは下記のようになり
Queue name g2
required cores 90 :( 9[mpi] * 10[threads] )
nodes 4 :CEIL( 90 / 23 ) :( g[21-24] )計算途中の sload を見ると、各ノードは 3MPI確保されるので、30coreが確保されるのですが、親MPIを運営する1台を除き他は用意された3MPIをすべて使わない。
Queue Run wait Host CPU usage GPU
g21 30/32 *******************- 2/2 ** rtx3090 mix
g22 30/32 *******************- 2/2 ** rtx3090 mix
g23 30/32 *******************- 2/2 ** rtx3090 mix
g24 30/32 *******************- 2/2 ** rtx3090 mix使用可能な変数とパネルの位置
Number of MPI procs: => XXXmpinodesXXX
Number of threads; => XXXthreadsXXX
Submit to queue?: => XXXqueueXXX
Minimum dedicated cores per node: => XXXdedicatedXXX他「Standard submisstion script」で使える変数
XXXmpinodesXXX * XXXthreadsXXX => XXXcoresXXX
XXXnodesXXX = CEIL( XXXcoresXXX / XXXdedicatedXXX )slurmでは、
「Number of MPI procs」はtaskとして扱い「--ntask(-n)」に該当かと。
「Number of threasds」は「--cpus-per-task(-c)」に該当かなと。
XXXnodesXXX は「--nodes(-N)」に該当かな
計算ノード間でMPIの数を均等にしたいなら「Queue submit command」に「sbatch --ntasks-per-node=X」とか入れて、計算ノード間に割り振られるtaskの値を同じにする
もし同じqueueの中で、計算機を指定したいなら「Queue submit command」には「sbatch --nodes=2 --nodelist=a,c」と「--nodelist」を使って指定する