メインコンテンツまでスキップ

Slurm からの移行

備考

プレビュー

この機能は パブリック プレビュー段階です。

このガイドでは、分散トレーニング ワークロードを Slurm から AI Runtime に移行する方法について説明します。主要な概念の説明、ランの監視と制御の方法の提示、および Slurm バッチ スクリプトの翻訳の解説を行います。

AI Runtime では、YAML ワークロードの構成で、GPU タイプ、総 GPU 数、環境、および各ノードで実行するコマンドを定義します。databricks air run --file train.yaml でその構成を送信すると、AI ランタイム はランのスケジューリング、プロビジョニング、およびリソースのクリーンアップを処理します。

開始する前に、Databricks CLI をインストールし、認証を設定し、クイックスタートに従ってください。

Slurm と AI ランタイム の概念​

GPUリソース​

Slurmでは、ジョブはパーティションからノードとGPUの割り当てを受け取ります。AI Runtime では、ランごとに GPU の種類と GPU の総数をリクエストします。defaultでは、サービスはオンデマンドでそのコンピュートをプロビジョニングします。

compute.num_accelerators を合計 GPU 数に設定します。compute.accelerator_type によって、各ノードが持つ GPU の数が決まります。たとえば、GPU_8xH100 はノードあたり 8基の H100 GPU を提供するため、16個の GPU を要求すると 2つのノードになります。合計は、ノードあたりの GPU の数の倍数である必要があります。

トレーニング プロセス​

Slurm では、sbatch はノードと GPU を要求するジョブを送信し、srun は割り当てられたノードでタスクを起動します。分散 PyTorch トレーニングの一般的なパターンは、srun を使用してノードごとに 1 つの torchrun ランチャーを起動することです。各ランチャーは、GPU ごとに 1 つのトレーニングプロセスを開始します。

AI Runtime は、各ノードで同じ command を 1 回実行します。そのコマンドで torchrun を使用して、トレーニングプロセスを起動します。AI ランタイム は、各ノードのランクと、ノードが連携するために必要な接続情報を提供します。torchrun は、各トレーニングプロセスに RANK、LOCAL_RANK、および WORLD_SIZE を割り当てます。2 つのノードとノードあたり 8 個の GPU を使用する場合、これにより 2 つのランチャーと 16 のトレーニングプロセスが提供されます。

ストレージとリトライ​

ランを維持する必要がある共有データセットとチェックポイントには、Unity Catalog ボリューム(/Volumes/<catalog>/<schema>/<volume>/...)を使用します。各ノードのローカルディスクを一時的な作業スペースとして扱います。

timeout_minutes は各試行を制限し、max_retries は失敗したワークロードが再試行される回数を制御します。再試行するたびにコマンドが再度実行されます。チェックポイントからトレーニングを継続するには、トレーニング コードで保存された状態を読み込む必要があります。チェックポイントとリカバリ パターンについては、「Improve training performance and resiliency on AI Runtime」を参照してください。

ランの監視と制御​

Slurm

AI Runtime

squeue

databricks air list runs

sacct, scontrol show job <id>

databricks air get run <run-id>

tail -f slurm-<id>.out

databricks air logs <run-id> --node <n>

scancel <id>

databricks air cancel <run-id>

Slurm

AI Runtime

squeue

databricks air list runs

sacct, scontrol show job <id>

databricks air get run <run-id>

tail -f slurm-<id>.out

databricks air logs <run-id> --node <n>

scancel <id>

databricks air cancel <run-id>

各ワークロードには、Logs と自動的に収集されたシステム メトリクスを持つ MLflow ランがあります。トレーニング コードで MLflow を使用して、パラメーター、トレーニング メトリクス、アーティファクトをログに記録します。MLflow とジョブ実行ページでのランの追跡を参照してください。

例: sbatch スクリプトを翻訳する​

それぞれ 8 個の GPU を持つ 2 つのノード(合計 16 個の GPU)の Slurm 起動スクリプト:

Bash
#!/bin/bash
#SBATCH --job-name=llama-sft
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=1
#SBATCH --gpus-per-node=8
#SBATCH --time=02:00:00

srun bash -c '
torchrun \
--nnodes="$SLURM_NNODES" \
--node_rank="$SLURM_NODEID" \
--nproc_per_node=8 \
--master_addr="$(scontrol show hostnames "$SLURM_JOB_NODELIST" | head -n1)" \
--master_port=29500 \
train.py
'

対応する AI ランタイム train.yaml:

YAML
experiment_name: llama-sft

environment:
version: '4'
dependencies:
- transformers>=4.45
- datasets>=3.0

# 16 GPUs across 2 nodes (GPU_8xH100 = 8 H100 per node).
compute:
num_accelerators: 16
accelerator_type: GPU_8xH100

code_source:
type: snapshot
snapshot:
root_path: .

command: |
cd "$CODE_SOURCE_PATH"
# AI Runtime sets these rendezvous variables on each node.
torchrun \
--nnodes="$NUM_NODES" \
--node_rank="$NODE_RANK" \
--nproc_per_node="${LOCAL_WORLD_SIZE:-8}" \
--master_addr="$MASTER_ADDR" \
--master_port="$MASTER_PORT" \
train.py

timeout_minutes: 120
max_retries: 1

送信してフォローします:

Bash
databricks air run --file train.yaml --watch

トレーニング スクリプトを含む完全に実行可能なバージョンについては、FSDP を使用したマルチノード LLM ファインチューニングを参照してください。

移行に関する考慮事項​

  • module load および環境のアクティベーション手順を environment 構成に置き換えます。管理対象環境のバージョンを選択し、environment.dependencies、インライン、または requirements.txt ファイルへの -r 参照を通じて追加のパッケージを宣言します。カスタム スタックの場合は、カスタム Docker イメージを使用します。
  • code_source.snapshot.root_path をローカルプロジェクトディレクトリに設定します。ワークロードを送信すると、Databricks CLI がそれをuploadします。$CODE_SOURCE_PATH を使用してuploadされたファイルを参照します。
  • 環境変数には env_variables を使用し、Databricks シークレット参照には secrets を使用します。
  • 各構成に対して個別のランを送信し、databricks air run --override key=value を使用して送信間でフィールドを変更します。

その他のリソース​