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からジョブの進行状況を監視し、必要に応じてジョブを停止することができます。