SLURM spankの導入について
| 登録日 | :2026/06/17 00:05 |
|---|---|
| カテゴリ | :SLURM |
spank-lua の導入手順
前提確認
bash# SLURMバージョン確認
sinfo --version
OSバージョン確認
cat /etc/rocky-release
既存のSPANKプラグイン確認
ls /usr/lib64/slurm/*.so
方法A:パッケージから導入(推奨)
Rocky Linux の場合、slurm-spank-lua は SLURM本体と同じリポジトリに含まれていることが多いです。
bash# まずパッケージを検索
dnf search slurm | grep -i lua
dnf search slurm-spank
見つかった場合
sudo dnf install slurm-spank-lua
方法B:ソースからビルド(パッケージが無い場合)
1. ビルド依存パッケージの導入
bash
sudo dnf install gcc make lua lua-devel slurm-devel
- ソースの取得
bashcd /tmp
git clone https://github.com/chaos/slurm-spank-lua.git
cd slurm-spank-lua
- SLURMのヘッダーパスを確認してビルド
bash# slurm.hの場所を確認
rpm -ql slurm-devel | grep spank.h
ビルド
make
確認
file spank_lua.so
- 配置
bash# プラグインディレクトリへコピー
sudo cp spank_lua.so /usr/lib64/slurm/
全計算ノードへ配布(pdshやansibleがあれば)
pdsh -g all_nodes "scp headnode:/usr/lib64/slurm/spank_lua.so /usr/lib64/slurm/"
plugstack.conf の設定
bash# ファイルが存在しない場合は新規作成
sudo vi /etc/slurm/plugstack.conf
# /etc/slurm/plugstack.conf
required /usr/lib64/slurm/spank_lua.so /etc/slurm/spank.lua
required vs optional
required:プラグインのロード失敗でジョブが失敗する
optional:失敗しても続行する
開発中は optional で始めて、安定したら required に切り替えるのが安全です。
Luaスクリプトの配置
sudo vi /etc/slurm/spank.lua
sudo chmod 644 /etc/slurm/spank.lua
先ほどのGPUモード切り替えスクリプトを配置します。
全計算ノードへの配布
plugstack.conf と spank.lua も全ノードに必要です。
bash# pdshの場合
pdsh -g compute_nodes "mkdir -p /etc/slurm"
pdcp -g compute_nodes /etc/slurm/plugstack.conf /etc/slurm/
pdcp -g compute_nodes /etc/slurm/spank.lua /etc/slurm/
ansibleの場合
ansible compute -m copy -a "src=/etc/slurm/spank.lua dest=/etc/slurm/spank.lua"
SLURMデーモンの再起動
bash# ヘッドノード
sudo systemctl restart slurmctld
全計算ノード
sudo systemctl restart slurmd
または
pdsh -g compute_nodes "systemctl restart slurmd"
動作確認
bash# プラグインのロード確認
sudo slurmctld -D -vvv 2>&1 | grep -i spank
slurmd側の確認
sudo slurmd -D -vvv 2>&1 | grep -i spank
sbatchオプションが追加されているか確認
sbatch --help | grep gpu-exclusive
luaの導入
# Rocky Linux / RHEL系
sudo dnf install slurm-spank-lua
# または自前ビルド
# https://github.com/chaos/slurm-spank-lua
plugstack.conf への登録
*optionalにしておけば、GPUがあるときに飲みluaを読み込む(CPUへのインストールは不要。plugstack.confの展開は必要)
(参考)requireにすると必ず必要になり、CPU機にも導入が必要になる
# ファイルが存在しない場合は新規作成
sudo vi /etc/slurm/plugstack.conf
# /etc/slurm/plugstack.conf
optional /usr/lib64/slurm/spank_lua.so /etc/slurm/spank.lua
sudo vi /etc/slurm/spank.lua
sudo chmod 644 /etc/slurm/spank.lua
/etc/slurm/spank.luaの内容
-- sbatchオプションの定義
local options = {
{
name = "gpu-exclusive",
usage = "Set GPU to EXCLUSIVE_PROCESS mode for this job",
has_arg = false,
}
}
-- オプション登録
function slurm_spank_init(spank)
for _, opt in ipairs(options) do
spank:option_register(opt)
end
return ESPANK_SUCCESS
end
-- ジョブ開始前(root権限)
function slurm_spank_job_prolog(spank)
-- オプション指定がなければスキップ
local val = spank:getenv("SLURM_SPANK_GPU_EXCLUSIVE")
if not val then
return ESPANK_SUCCESS
end
local cuda_devs = spank:getenv("CUDA_VISIBLE_DEVICES")
if not cuda_devs then
return ESPANK_SUCCESS
end
for dev in cuda_devs:gmatch("[^,]+") do
os.execute(string.format("nvidia-smi -i %s -c EXCLUSIVE_PROCESS", dev))
SPANK.log_info("gpu_mode: EXCLUSIVE_PROCESS set on GPU %s", dev)
end
return ESPANK_SUCCESS
end
-- ジョブ終了後(root権限)
function slurm_spank_job_epilog(spank)
local cuda_devs = spank:getenv("CUDA_VISIBLE_DEVICES")
if not cuda_devs then
return ESPANK_SUCCESS
end
for dev in cuda_devs:gmatch("[^,]+") do
os.execute(string.format("nvidia-smi -i %s -c DEFAULT", dev))
SPANK.log_info("gpu_mode: DEFAULT restored on GPU %s", dev)
end
return ESPANK_SUCCESS
end
使い方
#SBATCH --gres=gpu:1
#SBATCH --gpu-exclusive