ジョブ管理システム slurm にてジョブを発行してみる
参照先 https://slurm.schedmd.com/sbatch.html

ジョブの分散が上手く行っているか

ここでは計算ノードが3つあって、それぞれ4coreを持っている。
どれかのノードに1coreなジョブを流したければ

#!/bin/bash
#SBATCH -J test_run         # --job-name=test_run ジョブの名称
#SBATCH -o output_%j.txt    # --output=output_test_run.txt
#SBATCH -e errors_%j.txt    # --error=errors_test_run.txt
#SBATCH -p workq            # いわゆる使用するキュー名
#SBATCH -n 3                # --ntasks=           このジョブで3タスク(プロセス)を実行する
#SBATCH -c 1                # --cpus-per-task=   1プロセス当たり1core使用する
 
echo "===== SLURM NODELIST ====="
echo $SLURM_NODELIST
 
echo "===== srun hostname ====="
srun hostname

結果ファイル「errors_%j.txt」の中身は

===== SLURM NODELIST =====
n1
===== srun hostname =====
n1
n1
n1

と表示されます. 1つのノードに3つのプロセスが入りました。

次に同じく3つのプロセスを動かすのですが、1つのプロセスあたり3つのcoreを使用したいとなると「-c 1」を「-c 3」に変更じて実行すると

===== SLURM NODELIST =====
n[1-3]
===== srun hostname =====
n1
n3
n2

となります。1つのノードで3core使用するので、3ノードで計算するって事になります。

relionのようなハイブリッドmpiの場合では、この「-c」がthreadsになって、「-n」がmpi数って感じでしょうか.

ただslurmの場合、リソース要求した後に mpi masterの数を加えたいとかで「mpirun -np (XX + 1)」とするとエラーになります。その際は mpirun のオプション「--oversubscribe」で誤魔化すことが必要かな.
openpbsはその辺見逃してくれる.

mpiプログラム

サンプルジョブはmpiプログラムで1台もしくは複数台にまたがって実行させたく、そのサンプルmpiプログラムを chatgpt君に作ってもらった

#include <mpi.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv) {
    MPI_Init(&argc, &argv);

    int world_size, world_rank, name_len;
    char processor_name[MPI_MAX_PROCESSOR_NAME];

    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    MPI_Get_processor_name(processor_name, &name_len);

    printf("Hello from rank %d of %d on host %s (PID %d)\n",
           world_rank, world_size, processor_name, getpid());

    MPI_Finalize();
    return 0;
}

ファイル名を mpi_hello.c として保存して下記のようにしてコンパイル

mpicc -o mpi_hello mpi_hello.c

作られたプログラム「mpi_hello」を使って各種テストを行ってみた

#!/bin/bash
#SBATCH -J test_run         # --job-name=test_run ジョブの名称
#SBATCH -o output_%j.txt    # --output=output_test_run.txt
#SBATCH -e errors_%j.txt    # --error=errors_test_run.txt
#SBATCH -p workq            # いわゆる使用するキュー名
#SBATCH -n 3                # --ntasks         このジョブで3タスク(プロセス)を実行する
#SBATCH -c 3                # --cpus-per-task 1プロセス当たり3core使用する
 
NODEFILE=$(mktemp)
scontrol show hostname $SLURM_NODELIST > $NODEFILE    # mpi向けのnodefileを作る
 
module load mpi
opt="--display-map --bind-to none --map-by node --oversubscribe"   # mpirunのオプション
 
mpirun -np 4 -machinefile $NODEFILE $opt  ./mpi_hello
 
echo "-----"
hostname
ls -l $NODEFILE
cat $NODEFILE
 
echo "-----"
rm $NODEFILE   # 終わったら削除

っで結果は下記になります

 Data for JOB [41586,1] offset 0 Total slots allocated 3
 
 ========================   JOB MAP   ========================
 
 Data for node: n1      Num slots: 1    Max slots: 0    Num procs: 2
        Process OMPI jobid: [41586,1] App: 0 Process rank: 0 Bound: N/A
        Process OMPI jobid: [41586,1] App: 0 Process rank: 3 Bound: N/A
 
 Data for node: n2      Num slots: 1    Max slots: 0    Num procs: 1
        Process OMPI jobid: [41586,1] App: 0 Process rank: 1 Bound: N/A
 
 Data for node: n3      Num slots: 1    Max slots: 0    Num procs: 1
        Process OMPI jobid: [41586,1] App: 0 Process rank: 2 Bound: N/A
 
 =============================================================
Hello from rank 3 of 4 on host n1 (PID 47993)
Hello from rank 0 of 4 on host n1 (PID 47992)
Hello from rank 2 of 4 on host n3 (PID 15761)
Hello from rank 1 of 4 on host n2 (PID 50866)
-----
n1
-rw-------. 1 saber em 9 Nov 30 23:00 /tmp/tmp.IaLCtkTerX
n1
n2
n3
-----

rank 0が n1、rank 1が n2, rank2が n3, rank3 が n1 と「--map-by node」が効いてrank毎にマシンを変えてます。加えて「--oversubscribe」の効果で「mpirun -np 4」が流れました。本来ならリソースが足らないとして怒られます.

srunを使う方法

本来はこちらが望ましいみたい。mpirunでのnodefileとか不要で、srunで動かすみたい

#SBATCH -J test_run         # --job-name=test_run ジョブの名称
#SBATCH -o output_%j.txt    # --output=output_test_run.txt
#SBATCH -e errors_%j.txt    # --error=errors_test_run.txt
#SBATCH -p workq            # いわゆる使用するキュー名
#SBATCH -n 3                # --ntasks         このジョブで3タスク(プロセス)を実行する
#SBATCH -c 3                # --cpus-per-task 1プロセス当たり3core使用する
 
module load mpi
opt="--display-map --bind-to none --map-by node --oversubscribe"
mpirun --mca orte_rsh_agent "srun" -np 4 $opt ./mpi_hello         # すべては srun が処理してくれます.
 
echo "-----"
hostname
echo "-----"

っで結果は下記のようになります. 「--map-by node」「--oversubscribe」も効いてます.

 Data for JOB [42060,1] offset 0 Total slots allocated 3
 
 ========================   JOB MAP   ========================
 
 Data for node: n1      Num slots: 1    Max slots: 0    Num procs: 2
        Process OMPI jobid: [42060,1] App: 0 Process rank: 0 Bound: N/A
        Process OMPI jobid: [42060,1] App: 0 Process rank: 3 Bound: N/A
 
 Data for node: n2      Num slots: 1    Max slots: 0    Num procs: 1
        Process OMPI jobid: [42060,1] App: 0 Process rank: 1 Bound: N/A
 
 Data for node: n3      Num slots: 1    Max slots: 0    Num procs: 1
        Process OMPI jobid: [42060,1] App: 0 Process rank: 2 Bound: N/A
 
 =============================================================
Hello from rank 0 of 4 on host n1 (PID 48478)
Hello from rank 3 of 4 on host n1 (PID 48479)
Hello from rank 2 of 4 on host n3 (PID 16093)
Hello from rank 1 of 4 on host n2 (PID 51200)
-----
n1
-----

srunを使うには firewall での特定ポートを解除する必要がありますので firewall 内で行うときはこの辺が注意.

最新の60件
2026-01-22 2026-01-18 2026-01-17 2026-01-16 2026-01-12 2026-01-11 2026-01-10 2026-01-09 2026-01-08 2026-01-06 2026-01-04 2026-01-01 2025-12-31 2025-12-28 2025-12-27 2025-12-12 2025-12-11 2025-12-09 2025-12-08 2025-12-07 2025-12-05 2025-11-30 2025-11-27 2025-11-24 2025-11-23 2025-11-18 2025-11-16 2025-11-05 2025-11-03 2025-11-02 2025-10-30 2025-10-29 2025-10-28 2025-10-26 2025-10-25 2025-10-24 2025-10-22 2025-10-21 2025-10-17 2025-10-13 2025-10-11 2025-10-06 2025-10-05

edit


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2025-11-30 (日) 23:26:16