#author("2025-10-12T03:09:43+00:00;2025-10-01T06:52:37+00:00","default:sysosa","sysosa") #author("2025-11-30T14:29:39+00:00","default:sysosa","sysosa") slurmをjob queuing systemに使った場合 -厳しくリソース管理が行われるので16coreマシンに 5mpi/4threads/4GPU は走らない -なので割り当てられたリソースを無視する「--oversubscribe」を埋め込む. &size(10){利用は計画的に}; -hostfileは提供してくれないから、必要だったら作る必要がある -job発行時に$TMPDIRの提供がない. Prolog/Epilog機構を駆使する必要がある これらに留意する必要があるっぽい slurmでrelionを使うときの「qsub.sh」を作ってみている. &size(10){「sbatch.sh」とかの名称がいいのかも}; #code(nonumber){{ #!/bin/bash #SBATCH --partition=XXXqueueXXX #SBATCH --ntasks=XXXmpinodesXXX #SBATCH --cpus-per-task=XXXthreadsXXX #SBATCH --error=XXXerrfileXXX #SBATCH --output=XXXoutfileXXX #SBATCH --job-name=XXXnameXXX #SBATCH --gres=gpu:4 ################################# 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 ### 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 " ### check GPU np=XXXmpinodesXXX localnodefile=1 if [ ${run##*/} = "relion_refine_mpi" ]; then if [[ $cmd = *--gpu* ]]; then np=$(expr $np + 1) fi 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" 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_ }} ***メモ [#u3fb57e3] GPUの使用枚数のしては「Queue submit command:」欄で行う. 「sbatch --gres=gpu:2」なら「gpu」とgres.confで定義されたGPUを2枚使うことを意図します 複数ノードを使っての計算が目的なら「--gres=gpu:X」の値は1ノード当たりのGPU数にしてください。 &ref(2023y07m29d_112636965.png,nolink); relionのソースを修正して、枚数指定の入力欄を拵えればいいのかな. 画面はこんな感じになるのかも. [[https://hpc.nih.gov/apps/relion/index.html>+https://hpc.nih.gov/apps/relion/index.html]] ただ、こうゆう修正を行うとupdateの時が面倒かなぁ. &size(10){まぁ「pipeline_jobs.cpp」の修正のみで用意できますけど}; 「Compute」タグの「Which GPUs to use:」欄から得られそうだが、 ***メモ その2 [#t1becb3d] 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が作れない」とかで警告が起こりやすい