HPC メモ
目次
Slurm
Simple Linux Utility for Resource Management
ステータス確認
# ノードのスペック確認
scontrol show node
# ノードの状態確認
nice watch -n 10 sinfo
# ノード障害の原因確認
sinfo -R
# キューの状態確認
# cf. https://slurm.schedmd.com/squeue.html
nice watch -n 2 squeue --format=\"%.7i %.9P %.8j %.8u %.2t %.10M %.12N %.5C %.15B\"
ジョブ投入
srun の例
srun --job-name=train --partition=part01 --nodelist=node01 \
--gres gpu:2 --cpus-per-task=4 --output="logs/train.log" \
bash train.sh &
sbatch の例: sbatch -vv sbatch.sh
#!/bin/bash
#SBATCH --job-name=train
#SBATCH --cpus-per-task 8
#SBATCH --gres gpu:2
#SBATCH --partition=part01
#SBATCH --output=logs/train.log
#SBATCH --exclusive
module load cuda 12.2
module load cuda 12.2/cudnn
eval "$(conda shell.bash hook)"
conda activate torch
srun python train.py
Tips
- マルチプログラミングのパラダイムの基礎
- 構成単位はジョブ・ステップ・タスク
sbatchでジョブ作成・バッチ内のsrunで新規ステップ作成sbatchで複数のジョブを作成する場合は以降のアレイジョブを参照- ステップ毎に複数のタスクを持つ・タスクごとに複数のCPUを割り当てることができる
- 複数のタスク数は例えば複数のバックグラウンド処理の分配に影響
- ジョブ->ステップの順でリソース(ノード数・タスク数・CPU数・GPU数等)確保
- sbatch の実行対象スクリプトの
#SBATCHディレクティブで”ジョブ全体”のリソースを確保 - 上記スクリプト内の srun で”各ステップのリソース”を確保。必要に応じて”各タスクに割り当てるリソース”も指定。
- 各ステップをバックグラウンド実行(&)する場合は slurm 側でリソース(タスク数・CPU数等)が適宜管理される
- sbatch の実行対象スクリプトの
- 構成単位はジョブ・ステップ・タスク
- GPU の割当
- 各ノードで確保するGPU数は
--gresor--gpus-per-nodeで確保(#SBATCHで指定) - 各ジョブで確保するGPU数は
--gpusで確保(#SBATCHで指定・アレイジョブの場合) - 各タスクで確保するGPU数は
--gpus-per-taskで確保する(srunで指定)
- 各ノードで確保するGPU数は
- アレイジョブによる実行
- 公式ドキュメントの解説
- -a オプションで実行
- インデックスは
${SLURM_ARRAY_TASK_ID}で参照可能 - 投げられたジョブは
(ジョブID)_(タスクID)となりscancel (ジョブID)で一括終了ができる - 複数の configuration で実行する際に便利
Environment Modules
マルチコア/GPU 処理
- OpenMP: マルチコア処理
- GCC でも標準搭載
- OpenACC: (シングル)GPU処理
- コンパイラは NVIDIA HPC SDK の nvc++ を使用すること
マルチ GPU 処理
- PyTorch Distributed Data Parallel
- Data Parallel より高速
- 実装例
- Torch.Distributed
- バックエンドを NCCL にする場合は環境構築が必要
- Difference between two kinds of distributed training paradigm
- node, world, and local and global rank