Volcanoを使ったマルチノードジョブの起動
このチュートリアルでは、Kubernetes上でW&BとVolcanoを使ってマルチノードトレーニングジョブを起動する手順を紹介します。
概要
このチュートリアルでは、W&B Launchを使ってKubernetes上でマルチノードジョブを起動する方法を学びます。以下のステップに従います:
- Weights & BiasesアカウントとKubernetesクラスターを用意する
- Volcanoジョブ用のローンチキューを作成する
- KubernetesクラスターにLaunchエージェントをデプロイする
- 分散トレーニングジョブを作成する
- 分散トレーニングを開始する
前提条件
開始する前に、以下が必要です:
- Weights & Biasesアカウント
- Kubernetesクラスター
ローンチキューを作成
最初のステップはローンチキューを作成することです。wandb.ai/launchにアクセスし、画面の右上にある青いCreate a queueボタンをクリックします。右側からキュー作成ドロワーが表示されます。エンティティを選択し、名前を入力し、キューのタイプとしてKubernetesを選択します。
設定セクションには、volcano jobテンプレートを入力します。ここから起動する任意のrunsは、このジョブ仕様を使用して作成されるため、この設定をカスタマイズしてジョブを調整することができます。
この設定ブロックは、Kubernetesジョブ仕様、Volcanoジョブ仕様、または他の任意のカスタムリソース定義(CRD)を受け入れることができます。設定ブロックでのマクロの使用により、このスペックの内容を動的に設定できます。
このチュートリアルでは、volcanoのpytorchプラグインを使用したマルチノードpytorchトレーニングの設定を使用します。以下の設定をYAMLまたはJSONとしてコピーして貼り付けることができます:
- YAML
- JSON
kind: Job
spec:
tasks:
- name: master
policies:
- event: TaskCompleted
action: CompleteJob
replicas: 1
template:
spec:
containers:
- name: master
image: ${image_uri}
imagePullPolicy: IfNotPresent
restartPolicy: OnFailure
- name: worker
replicas: 1
template:
spec:
containers:
- name: worker
image: ${image_uri}
workingDir: /home
imagePullPolicy: IfNotPresent
restartPolicy: OnFailure
plugins:
pytorch:
- --master=master
- --worker=worker
- --port=23456
minAvailable: 1
schedulerName: volcano
metadata:
name: wandb-job-${run_id}
labels:
wandb_entity: ${entity_name}
wandb_project: ${project_name}
namespace: wandb
apiVersion: batch.volcano.sh/v1alpha1
{
"kind": "Job",
"spec": {
"tasks": [
{
"name": "master",
"policies": [
{
"event": "TaskCompleted",
"action": "CompleteJob"
}
],
"replicas": 1,
"template": {
"spec": {
"containers": [
{
"name": "master",
"image": "${image_uri}",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "OnFailure"
}
}
},
{
"name": "worker",
"replicas": 1,
"template": {
"spec": {
"containers": [
{
"name": "worker",
"image": "${image_uri}",
"workingDir": "/home",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "OnFailure"
}
}
}
],
"plugins": {
"pytorch": [
"--master=master",
"--worker=worker",
"--port=23456"
]
},
"minAvailable": 1,
"schedulerName": "volcano"
},
"metadata": {
"name": "wandb-job-${run_id}",
"labels": {
"wandb_entity": "${entity_name}",
"wandb_project": "${project_name}"
},
"namespace": "wandb"
},
"apiVersion": "batch.volcano.sh/v1alpha1"
}
ドロワーの下部にあるCreate queueボタンをクリックして、キューの作成を完了します。
Volcanoのインストール
KubernetesクラスターにVolcanoをインストールするには、公式インストールガイドに従ってください。
Launchエージェントのデプロイ
キューを作成したので、次は作成したキューからジョブを取得して実行するLaunchエージェントをデプロイする必要があります。最も簡単な方法は、W&Bの公式launch-agent
チャートを使うことです。READMEの指示に従って、このチャートをKubernetesクラスターにインストールし、先ほど作成したキューをポーリングするようにエージェントを設定してください。
トレーニングジョブの作成
Volcanoのpytorchプラグインは、pytorch ddpが動作するために必要な環境変数(例:MASTER_ADDR
、RANK
、WORLD_SIZE
など)を自動的に設定します。pytorchコードが正しくDDPを使用している限り、他の操作はそのまま動作します。DDPの使用方法については、pytorchのドキュメントを参照してください。
Volcanoのpytorchプラグインは、PyTorch Lightningの Trainer
を使ったマルチノードトレーニングとも互換性があります。
起動 🚀
キューとクラスターの設定が完了したので、いよいよ分散トレーニングを開始します!最初に使用するのは、volcanoのpytorchプラグインを使ってランダムデータ上でシンプルな多層パーセプトロンをトレーニングするジョブです。このジョブのソースコードはこちらから入手できます。
このジョブを起動するには、ジョブのページにアクセスし、画面の右上のLaunchボタンをクリックします。ジョブを起動するキューを選択するように求められます。
- 任意のジョブパラメータを設定します。
- 先ほど作成したキューを選択します。
- Resource configセクションでvolcanoジョブを修正し、ジョブのパラメータを変更します。例えば、
worker
タスクのreplicas
フィールドを変更してワーカーの数を変更できます。 - Launchをクリックします 🚀
W&B UIからジョブの進行状況を監視し、必要に応じてジョブを停止することができます。