1. はじめに
松尾研LLM開発コンペ2025に参加した際の知見共有として、slurmの基本的な使い方について紹介させていただきます。
2. slurmとは
slurmはジョブスケジューラの一種です。
チーム開発を実施する際に計算リソース(CPUコア数, メモリ, GPU使用数など)をいい感じにコントロールしてくれるソフトウェア
のように考えるとよいかと思います。
今回は、slurmを使用する際の基本的な概念とコマンドについて記載したいと思います。
3. 基本概念
slurmは以下の階層構造でリソースを管理しています。
ノード(計算資源)
実際に計算を行う物理/仮想マシンを指します。
複数のCPUコア、メモリ、GPUなどを搭載した1台のマシンと考えてもらうとよいかと思います。
パーティション(ノードを集めたもの)
複数のノードをグループ化した概念です。例えば、
| チーム名 | パーティション名 | 使用ノード |
|---|---|---|
| チームA | partition_a | node0 ~ node2(3ノード) |
| チームB | partition_b | node3 ~ node7(5ノード) |
のようにチームによって使用するノードを分けるといった使い方が出来ます。これにより、どのチームがどのノードを使用するかの管理を簡単にすることが可能となります。
ジョブ(処理単位)
ユーザーがslurmに投入する処理要求です。
ジョブを投入する際には、使用するCPUコア数、メモリ、GPU数、ノード数、実行時間などのリソースを指定します。
4. 基本コマンド
ここでは、slurmにおいて使用するコマンドについて説明します。
リソース状態の確認(sinfo)
sinfoコマンドを使用することで現在使用可能なパーティションとノードの確認を出来ます。下記のように表示されます。
$ sinfo -s
PARTITION AVAIL TIMELIMIT NODES(A/I/O/T) NODELIST
debug* up infinite 0/1/0/3 gpu[01-03]
NODESは下記のような意味を持ちます。
| 記号 | 非省略名称 | 意味 |
|---|---|---|
| A | Allocated | 使用中のノード数 |
| I | Idle | 空きノード数 |
| O | Other | スケジュール管理から除外されているノード数 |
| T | Total | トータルノード数 |
上記の場合は、debugパーティションに「トータルで3ノードあり、1ノード空いている」という意味になります。
バッチジョブの投入(sbatch)
ジョブをスクリプトに記載して実行する方式です。
主に長い時間がかかる処理を実施する際に記載します。
下記がコマンド例です。下記のコマンドをtrain.shに保存してsbatch train.shを実行するとジョブを投入することが出来ます。
#!/bin/bash
# == batch起動設定 ==
#SBATCH --job-name=job_name # ジョブ名を指定
#SBATCH -p P01 # sinfoで調べたパーティション名
#SBATCH --nodelist=osk-gpu[01,03] # 使用するノードを明示的に指定(通常は不要)
#SBATCH --nodes=2 # ノード数を指定
#SBATCH --ntasks-per-node=2 # 各ノードに使用するタスク数
#SBATCH --gpus-per-node=8 # 1ノードに対するGPU数を指定
#SBATCH --cpus-per-task=64 # 各タスクで使用するCPU数
#SBATCH --time=6-00:00:00 # ジョブ占有時間
#SBATCH --mem=256GB # 使用メモリ数の指定
#SBATCH --output=./info.out # 標準出力の出力先
#SBATCH --error=./error.err # エラー出力の出力先
# ====
# この下に実行したい処理を書く。
python train.py
その他のオプションについては、こちらなどを参考にするとよいかもしれないです。
インタラクティブジョブの開始(srun)
デバッグやライブラリのインストールなど、対話的に作業を行いたい場合に使用します。
下記のコマンドで計算ノード上でbashシェルを起動できます。
$ srun --partition=P01 \
--nodes=1 \
--cpus-per-task=100 \
--gpus-per-node=0 \
--time=05:00:00 \
--pty bash -l
実行すると計算ノードにログインした状態になり、終了するにはexitコマンドを使用します。
注意: ログインノードと計算ノードは共有ファイルシステム(/homeなど)を使用しているため、ログインノードで構築した仮想環境やインストールしたライブラリは計算ノードでもそのまま利用できます。
# 例:計算ノード1で環境構築
(計算ノード1)$ conda create -n myenv python=3.10
(計算ノード1)$ conda activate myenv
(計算ノード1)$ pip install torch
# 他の計算ノードでも同じ環境を使用可能
$ srun --partition=P01 ... --pty bash -l
(計算ノード2)$ conda activate myenv # そのまま使える
ジョブの状態確認(squeue)
squeueコマンドで投入したジョブを確認することが出来ます。
例えば、下記のような形です。
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
12 patition_a test slurm-en R INVALID 1 node_name
それぞれのカラムは、下記のような意味です。
| カラム名 | 意味 |
|---|---|
| JOBID | ジョブID |
| PARTITION | パーティション名 |
| NAME | ジョブ名 |
| USER | ユーザ名 |
| ST | ジョブの状態(R=実行中, PD=待機中など) |
| TIME | ジョブの実行時間 |
| NODES | 割り当てられたノード数 |
| NODELIST(REASON) | 割り当てあれたノード名リスト |
ジョブのキャンセル(scancel)
実行中または待機中のジョブをキャンセルできます。
# 特定のジョブをキャンセル
$ scancel 12
# 自分の全ジョブをキャンセル
$ scancel -u $USER
# 特定のジョブ名をキャンセル
$ scancel --name=job_name
JOBID はsqueueコマンドで確認できます。
本プロジェクトは、国立研究開発法人新エネルギー・産業技術総合開発機構(以下「NEDO」)の「日本語版医療特化型LLMの社会実装に向けた安全性検証・実証」における基盤モデルの開発プロジェクトの一環として行われます