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」らの値の算出が結構面倒...

Runningパネル

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と定義します
 

これでパネルは下記のようにします
2026y09m01d_105627163.png
*「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  mix

Runningパネル(CPUを使い切りたい)

GPUを使わず、全CPU coreを使って計算したいなら. MotionCorrectionとかでしょうか

 32coreマシンと64coreマシンなら、1MPI1threadsとして、96MPIを用意できる。この96MPIの中に親MPIを入れる。
 
 core数が違うので、--ntasks-per-nodeで均等割りはしない
 
 96÷2 = 48 なので、1ノードの最低coreを48 coreと定義します

パネルにすれば
2026y09m01d_112508834.png
*「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

となります

Runningパネル (4ノードGPUマシン)

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とします
 

パネルでは下記のようになります
2026y09m05d_012429295.png
見切れてますが「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」を使って指定する

最新の60件
2026-09-11 2026-09-06 2026-09-05 2026-08-31 2026-08-27 2026-08-24 2026-08-20 2026-08-18 2026-08-17 2026-08-16 2026-08-15 2026-08-13 2026-08-12 2026-08-11 2026-08-09 2026-07-30 2026-07-25 2026-07-24 2026-07-20 2026-07-18 2026-07-17 2026-07-16 2026-07-08 2026-07-07 2026-07-06 2026-07-04 2026-07-02 2026-06-27 2026-06-24 2026-06-21 2026-06-17 2026-06-14 2026-06-13 2026-06-09 2026-06-08 2026-06-05 2026-06-04

edit


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2026-09-05 (土) 01:33:46