GPUをGRESとして定義する
目標
slurm.confとgres.confを一緒に作成してGPUをGRESとして定義し、2つのファイルの個数の一致を検証します。
なぜ重要なのか
GRESの設定ミスの第1位は、slurm.confのGPUの個数とgres.confのデバイスの個数の不一致です。slurm.confにgpu:a100:8と書いたのに、gres.confがFile=/dev/nvidia[0-3]だと4個しかなく、slurmdがcount reported lower than configuredを残してノードをDRAINにします。この検証は、デプロイ前にスクリプトで自動化すべき代表的な項目です。
また、Cores=でNUMAアフィニティを伝えると、SlurmがGPUとCPUを同じソケットに配置して、PCIeの往復を減らします。大規模な学習では、この差が数パーセントになります。
前のラボ(slurm-conf)で作成した/etc/slurm/slurm.confを引き続き使います。
ステップ
/etc/slurm/slurm.confにGresTypes=gpuを追加してください。- 3台のノードの
NodeName行にGres=gpu:a100:4を追加してください。 /etc/slurm/gres.confを作成してください。3台のノードそれぞれについて、NodeName=、Name=gpu、Type=a100、File=を含む行が必要で、Fileはデバイス4個を指す必要があります。gpu-node01については、デバイスを1つずつ4行に分けて書き、/dev/nvidia0と/dev/nvidia1はCores=0-15、/dev/nvidia2と/dev/nvidia3はCores=16-31に指定してください。(残りの2台のノードは、ステップ3の範囲表記のままでかまいません。)/etc/slurm/slurm.confにGPU専用のパーティションgpuを追加してください。Nodes=は3台すべて、MaxTime=72:00:00、State=UPです。/root/slurm/gres-check.txtを次の2行で作成してください。値は、設定ファイルをパースして得た実際の個数です。SLURM_CONF_GPUS=<slurm.conf 의 Gres 로 선언된 GPU 총 개수>/GRES_CONF_DEVICES=<gres.conf 의 File 이 가리키는 장치 총 개수>(プレースホルダーは、slurm.confのGresで宣言されたGPUの総数と、gres.confのFileが指すデバイスの総数です) 2つの値は同じである必要があります。/root/slurm/autodetect.txtを次の3行で作成してください。AUTODETECT=nvml/NEEDS=nvml-library/MANUAL_PRO=reproducible/root/slurm/gres-report.txtを次の4行で作成してください。GRESTYPES=gpu/NODES=3/GPUS_PER_NODE=4/PARTITIONS=<slurm.conf 의 PartitionName 줄 수>(プレースホルダーは、slurm.confのPartitionName行の数です)
参考
File=/dev/nvidia[0-3]はデバイス4個を意味します。範囲表記を展開して数える必要があります。- 実際のトポロジーは、
nvidia-smi topo -mで確認します。 - ステップ6の個数の計算は、シェルやpython3でパースして求めてください。手で数えてもかまいませんが、スクリプトで行うとステップ8まで再利用できます。
- よくある間違い1: ステップ2で1台のノードだけを直して、残りを入れ忘れる場合です。3台すべてに必要です。
- よくある間違い2: ステップ4でデバイスを4行に分けたあと、ステップ3の範囲表記の行を消さずに、
gpu-node01のデバイスが8個として数えられる場合です。
GRESタイプを宣言する
/etc/slurm/slurm.confにGresTypes=gpuを追加してください。
slurm.confの最上部の領域に1行あれば十分です。複数のタイプはカンマで区切ります。
ノードごとのGPUを宣言する
3台のノードのNodeName行にGres=gpu:a100:4を追加してください。
NodeName行にGres=を追加します。形式は名前:タイプ:個数です。
gres.confを作成する
/etc/slurm/gres.confを作成してください。3台のノードそれぞれについて、NodeName=、Name=gpu、Type=a100、File=を含む行が必要で、Fileはデバイス4個を指す必要があります。
ノードごとに1行ずつ書くことも、デバイスごとに1行ずつ書くこともできます。範囲表記を使うと簡潔です。
NUMAアフィニティを記述する
gpu-node01については、デバイスを1つずつ4行に分けて書き、/dev/nvidia0と/dev/nvidia1はCores=0-15、/dev/nvidia2と/dev/nvidia3はCores=16-31に指定してください。(残りの2台のノードは、ステップ3の範囲表記のままでかまいません。)
各GPUに近いコアの範囲を書きます。デバイスを半分ずつに分けて、2つのソケットに振り分けてください。
GPU専用のパーティション
/etc/slurm/slurm.confにGPU専用のパーティションgpuを追加してください。Nodes=は3台すべて、MaxTime=72:00:00、State=UPです。
既存のパーティションとは別に、もう1つ定義します。最大時間は長めにしてください。
個数の一致を検証する
/root/slurm/gres-check.txtを次の2行で作成してください。値は、設定ファイルをパースして得た実際の個数です。
SLURM_CONF_GPUS=<slurm.conf 의 Gres 로 선언된 GPU 총 개수> / GRES_CONF_DEVICES=<gres.conf 의 File 이 가리키는 장치 총 개수>(プレースホルダーは、slurm.confのGresで宣言されたGPUの総数と、gres.confのFileが指すデバイスの総数です)
2つの値は同じである必要があります。
slurm.confのGresの個数の合計と、gres.confのFileの範囲から出てくるデバイス数を比較してください。
AutoDetectの比較メモ
/root/slurm/autodetect.txtを次の3行で作成してください。
AUTODETECT=nvml / NEEDS=nvml-library / MANUAL_PRO=reproducible
自動検出と手動定義のトレードオフを、キー=値の形でまとめます。
GRES設計レポート
/root/slurm/gres-report.txtを次の4行で作成してください。
GRESTYPES=gpu / NODES=3 / GPUS_PER_NODE=4 / PARTITIONS=<slurm.conf 의 PartitionName 줄 수>(プレースホルダーは、slurm.confのPartitionName行の数です)
値は、作成した設定をパースして得る必要があります。