KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

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
  1. ソースの取得
bashcd /tmp
git clone https://github.com/chaos/slurm-spank-lua.git
cd slurm-spank-lua
  1. SLURMのヘッダーパスを確認してビルド
    bash# slurm.hの場所を確認
rpm -ql slurm-devel | grep spank.h

ビルド

make

確認

file spank_lua.so
  1. 配置
    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