すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Arena を使用して分散 PyTorch トレーニングジョブを送信する

最終更新日:Mar 04, 2025

PyTorch は、さまざまなディープ ラーニング モデルのトレーニングジョブで広く使用されているオープンソースの深層学習フレームワークです。このトピックでは、Arena を使用して複数の GPU を使用する PyTorch トレーニングジョブを送信する方法と、TensorBoard を使用してトレーニングジョブを視覚化する方法について説明します。

前提条件

背景情報

リモート Git リポジトリからトレーニングコードをダウンロードし、NAS ファイルシステム (NAS) に基づく永続ボリューム (PV) と永続ボリューム要求 (PVC) を含む共有ストレージシステムからトレーニングデータを読み取る必要があります。torchrun は、分散トレーニングジョブを簡素化および管理するために PyTorch によって提供されるコマンドラインツールです。この例では、torchrun を使用して、複数の GPU を使用する PyTorch トレーニングジョブを実行します。トレーニングコードの詳細については、「main.py」をご参照ください。

ステップ 1: GPU リソースを表示する

次のコマンドを実行して、クラスタで使用可能な GPU リソースをクエリします。

arena top node

予想される出力:

NAME                        IPADDRESS        ROLE    STATUS  GPU(Total)  GPU(Allocated)
cn-beijing.192.168.xxx.xxx  192.168.xxx.xxx  <none>  Ready   0           0
cn-beijing.192.168.xxx.xxx  192.168.xxx.xxx  <none>  Ready   0           0
cn-beijing.192.168.xxx.xxx  192.168.xxx.xxx  <none>  Ready   2           0
cn-beijing.192.168.xxx.xxx  192.168.xxx.xxx  <none>  Ready   2           0
---------------------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
0/4 (0.0%)

出力は、クラスタに 2 つの GPU アクセラレーテッドノードが含まれていることを示しています。各 GPU アクセラレーテッドノードには、トレーニングジョブの実行に使用できる 2 つのアイドル GPU が含まれています。

ステップ 2: PyTorch トレーニングジョブを送信する

arena submit pytorch コマンドを実行して、複数の GPU を使用する PyTorch トレーニングジョブを送信します。ジョブには 2 つのワーカーポッドが含まれ、各ワーカーポッドは 2 つの GPU カードを使用します。

arena submit pytorch \
    --name=pytorch-mnist \
    --namespace=default \
    --workers=2 \
    --gpus=2 \
    --nproc-per-node=2 \
    --clean-task-policy=None \
    --working-dir=/root \
    --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/pytorch-with-tensorboard:2.5.1-cuda12.4-cudnn9-runtime \
    --sync-mode=git \
    --sync-source=https://github.com/kubeflow/arena.git \
    --env=GIT_SYNC_BRANCH=v0.13.1 \
    --data=training-data:/mnt \
    --tensorboard \
    --logdir=/mnt/pytorch_data/logs \
    "torchrun /root/code/arena/examples/pytorch/mnist/main.py --epochs 10 --backend nccl --data /mnt/pytorch_data  --dir /mnt/pytorch_data/logs"

予想される出力:

service/pytorch-mnist-tensorboard created
deployment.apps/pytorch-mnist-tensorboard created
pytorchjob.kubeflow.org/pytorch-mnist created
INFO[0002] The Job pytorch-mnist has been submitted successfully
INFO[0002] You can run `arena get pytorch-mnist --type pytorchjob -n default` to check the job status
説明

スタンドアロンのトレーニングと比較して、PyTorch の分散トレーニングジョブには、追加の --workers パラメーターと --nproc-per-node パラメーターが必要です。パラメーターは、分散トレーニングに参加するポッドの数と、各ノードで開始されるプロセスの数を示します。分散トレーニングジョブには複数のノードが含まれています。ノード名は <job_name>-<role_name>-<index> 形式です。<job_name> はジョブ名を示し、<role_name> は分散トレーニングにおけるノードのロール ( masterworker など) を示し、<index> はノードのシーケンス番号を示します。たとえば、pytorch-mnist という名前のトレーニングジョブに --workers=3 パラメーターと --nproc-per-node=2 パラメーターを設定すると、3 つのトレーニングノードが作成され、各ノードで 2 つのプロセスが開始されます。ノード名は pytorch-mnist-master-0pytorch-mnist-worker-0pytorch-mnist-worker-1 です。対応する環境変数が各ノードに挿入されます。次の表に示すように:

環境変数/ノード名

pytorch-mnist-master-0

pytorch-mnist-worker-0

pytorch-mnist-worker-1

MASTER_ADDR

pytorch-mnist-master-0

MASTER_PORT

23456

WORLD_SIZE

6

RANK

0

1

2

PET_MASTER_ADDR

pytorch-mnist-master-0

PET_MASTER_PORT

23456

PET_NNODES

3

PET_NODE_RANK

0

1

2

説明

非公開の Git リポジトリを使用している場合は、GIT_SYNC_USERNAME 環境変数と GIT_SYNC_PASSWORD 環境変数を設定することで、Git のユーザー名とパスワードを指定できます。

  arena submit pytorch \
        ...
        --sync-mode=git \
        --sync-source=https://github.com/kubeflow/arena.git \
        --env=GIT_SYNC_BRANCH=v0.13.1 \
        --env=GIT_SYNC_USERNAME=<username> \
        --env=GIT_SYNC_PASSWORD=<password> \
        "torchrun /root/code/arena/examples/pytorch/mnist/main.py --epochs 10 --backend nccl --data /mnt/pytorch_data  --dir /mnt/pytorch_data/logs"

arena コマンドは、git-sync を使用してソースコードを同期します。これにより、git-sync プロジェクトで定義されている環境変数を使用できます。

重要

この例では、ソースコードは GitHub リポジトリからプルされます。ネットワーク関連の理由でコードをプルできない場合は、共有ストレージシステムにコードを手動でダウンロードできます。NAS の /code/github.com/kubeflow/arena パスにコードをダウンロードした後、次のコードを使用してトレーニングジョブを送信できます。

arena submit pytorch \
    --name=pytorch-mnist \
    --namespace=default \
    --workers=2 \
    --gpus=2 \
    --nproc-per-node=2 \
    --clean-task-policy=None \
    --working-dir=/root \
    --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/pytorch-with-tensorboard:2.5.1-cuda12.4-cudnn9-runtime \
    --data=training-data:/mnt \
    --tensorboard \
    --logdir=/mnt/pytorch_data/logs \
    "torchrun /mnt/code/github.com/kubeflow/arena/examples/pytorch/mnist/main.py --epochs 10 --backend nccl --data /mnt/pytorch_data  --dir /mnt/pytorch_data/logs"

次の表にパラメーターを示します。

パラメーター

必須

説明

デフォルト値

--name

はい

ジョブの名前。グローバルに一意である必要があります。

該当なし

--namespace

いいえ

ポッドが属する名前空間。

default

--workers

いいえ

ワーカーノードの数を指定します。マスターノードが含まれます。たとえば、値 3 は、トレーニングジョブが 1 つのマスターノードと 2 つのワーカーノードで実行されることを示します。

0

--gpus

いいえ

トレーニングジョブが実行されるワーカーノードで使用される GPU の数を指定します。

0

--working-dir

いいえ

コマンドが実行されるディレクトリを指定します。

/root

--image

はい

ランタイムのデプロイに使用されるイメージのアドレスを指定します。

該当なし

--sync-mode

いいえ

同期モードを指定します。有効な値: git および rsync。この例では、git モードが使用されます。

該当なし

--sync-source

いいえ

ソースコードの同期元のレポジトリのアドレスを指定します。このパラメーターは、--sync-mode パラメーターと一緒に使用されます。この例では、git モードが使用されます。GitHub プロジェクトや Alibaba Cloud Code プロジェクトなど、Git をサポートするアドレスを指定する必要があります。プロジェクトコードは、--working-dir の下の code/ ディレクトリにダウンロードされます。この例では、/root/code/arena が使用されます。

該当なし

--data

いいえ

トレーニングジョブが実行されるランタイムに共有 PV をマウントします。このパラメーターの値は、コロン (:) で区切られた 2 つの部分で構成されます。コロンの右側に PVC の名前を指定します。PVC の名前をクエリするには、arena data list コマンドを実行します。このコマンドは、指定されたクラスタで使用可能な PVC をクエリします。コロンの右側に、PVC によって要求された PV のマウントパスを指定します。これにより、トレーニングジョブは PVC によって要求された PV に保存されているデータを取得できます。

説明

arena data list コマンドを実行して、指定されたクラスタで使用可能な PVC をクエリします。

NAME           ACCESSMODE     DESCRIPTION  OWNER  AGE
training-data  ReadWriteMany                      35m

使用可能な PVC がない場合は、PVC を作成できます。詳細については、「共有 NAS ボリュームを設定する」をご参照ください。

該当なし

--tensorboard

いいえ

TensorBoard を使用してトレーニング結果を視覚化することを指定します。--logdir パラメーターを設定して、TensorBoard がイベントファイルを読み取るパスを指定できます。このパラメーターを設定しない場合、TensorBoard は使用されません。

該当なし

--logdir

いいえ

TensorBoard がイベントファイルを読み取るパス。--tensorboard パラメーターとこのパラメーターを指定する必要があります。

/training_logs

ステップ 3: PyTorch トレーニングジョブを表示する

  1. 次のコマンドを実行して、Arena を使用して送信されたすべてのトレーニングジョブをクエリします。

    arena list -n default

    予想される出力:

    NAME           STATUS   TRAINER     DURATION  GPU(Requested)  GPU(Allocated)  NODE
    pytorch-mnist  RUNNING  PYTORCHJOB  48s       4               4               192.168.xxx.xxx
  2. 次のコマンドを実行して、ジョブで使用されている GPU リソースをクエリします。

    arena top job -n default

    予想される出力:

    NAME           STATUS   TRAINER     AGE  GPU(Requested)  GPU(Allocated)  NODE
    pytorch-mnist  RUNNING  PYTORCHJOB  55s  4               4               192.168.xxx.xxx
    
    Total Allocated/Requested GPUs of Training Jobs: 4/4
  3. 次のコマンドを実行して、クラスタ内の GPU リソースをクエリします。

    arena top node

    予想される出力:

    NAME                        IPADDRESS        ROLE    STATUS  GPU(Total)  GPU(Allocated)
    cn-beijing.192.168.xxx.xxx  192.168.xxx.xxx  <none>  Ready   0           0
    cn-beijing.192.168.xxx.xxx  192.168.xxx.xxx  <none>  Ready   0           0
    cn-beijing.192.168.xxx.xxx  192.168.xxx.xxx  <none>  Ready   2           2
    cn-beijing.192.168.xxx.xxx  192.168.xxx.xxx  <none>  Ready   2           2
    ---------------------------------------------------------------------------------------------------
    Allocated/Total GPUs In Cluster:
    4/4 (100.0%)

    コマンド出力は、4 つの GPU すべてが割り当てられていることを示しています。

  4. 次のコマンドを実行して、ジョブの詳細情報をクエリします。

    arena get pytorch-mnist -n default

    予想される出力:

    Name:        pytorch-mnist
    Status:      RUNNING
    Namespace:   default
    Priority:    N/A
    Trainer:     PYTORCHJOB
    Duration:    1m
    CreateTime:  2025-02-12 13:54:51
    EndTime:
    
    Instances:
      NAME                    STATUS   AGE  IS_CHIEF  GPU(Requested)  NODE
      ----                    ------   ---  --------  --------------  ----
      pytorch-mnist-master-0  Running  1m   true      2               cn-beijing.192.168.xxx.xxx
      pytorch-mnist-worker-0  Running  1m   false     2               cn-beijing.192.168.xxx.xxx
    
    Tensorboard:
      Your tensorboard will be available on:
      http://192.168.xxx.xxx:32084

    コマンド出力は、ジョブに pytorch-mnist-master-0 という名前のマスターポッドと pytorch-mnist-worker-0 という名前のワーカーポッドが含まれていることを示しています。ポッドはそれぞれトレーニングジョブ全体に参加するために 2 つの GPU をリクエストします。

    説明

    トレーニングジョブで TensorBoard が使用されている場合、TensorBoard インスタンスの URL がジョブの詳細に表示されます。それ以外の場合、URL は表示されません。

ステップ 4: TensorBoard インスタンスを表示する

  1. オンプレミスマシンで次のコマンドを実行して、クラスタ内の TensorBoard のポート 6006 をオンプレミスポート 9090 にマップします。

    重要

    kubectl port-forward を使用して設定されたポート フォワーディングは、本番環境では信頼性、安全性、または拡張性がありません。開発とデバッグのみを目的としています。本番環境でポート フォワーディングを設定するために、このコマンドを使用しないでください。ACK クラスタの本番で使用されるネットワーキングソリューションの詳細については、「Ingress 管理」をご参照ください。

    kubectl port-forward -n default svc/pytorch-mnist-tensorboard 9090:6006
  2. http://127.0.0.1:9090 を Web ブラウザーのアドレスバーに入力して、TensorBoard にアクセスします。

    pytorch单机

    説明

    この例では、スタンドアロンの PyTorch ジョブの送信に使用されるソースコードは、10 エポックごとにトレーニング結果がイベントに書き込まれることを示しています。--epochs の値を変更する場合は、値を 10 の倍数に設定します。それ以外の場合、トレーニング結果は TensorBoard で視覚化できません。

ステップ 5: トレーニングジョブログを表示する

  1. 次のコマンドを実行して、トレーニングジョブのマスターポッドログをクエリします。

    arena logs -n default pytorch-mnist 

    予想される出力:

    {'PID': 40, 'MASTER_ADDR': 'pytorch-mnist-master-0', 'MASTER_PORT': '23456', 'LOCAL_RANK': 0, 'RANK': 0, 'GROUP_RANK': 0, 'ROLE_RANK': 0, 'LOCAL_WORLD_SIZE': 2, 'WORLD_SIZE': 4, 'ROLE_WORLD_SIZE': 4}
    {'PID': 41, 'MASTER_ADDR': 'pytorch-mnist-master-0', 'MASTER_PORT': '23456', 'LOCAL_RANK': 1, 'RANK': 1, 'GROUP_RANK': 0, 'ROLE_RANK': 1, 'LOCAL_WORLD_SIZE': 2, 'WORLD_SIZE': 4, 'ROLE_WORLD_SIZE': 4}
    Using cuda:0.
    Using cuda:1.
    Train Epoch: 1 [0/60000 (0%)]   Loss: 2.283599
    Train Epoch: 1 [0/60000 (0%)]   Loss: 2.283599
    ...
    Train Epoch: 10 [59520/60000 (99%)]     Loss: 0.007343
    Train Epoch: 10 [59520/60000 (99%)]     Loss: 0.007343
    
    Accuracy: 9919/10000 (99.19%)
    
    
    Accuracy: 9919/10000 (99.19%)
  2. インデックスが 0 のワーカーポッドのログを表示します。

    arena logs -n default -i pytorch-mnist-worker-0 pytorch-mnist

    予想される出力:

    {'PID': 39, 'MASTER_ADDR': 'pytorch-mnist-master-0', 'MASTER_PORT': '23456', 'LOCAL_RANK': 0, 'RANK': 2, 'GROUP_RANK': 1, 'ROLE_RANK': 2, 'LOCAL_WORLD_SIZE': 2, 'WORLD_SIZE': 4, 'ROLE_WORLD_SIZE': 4}
    {'PID': 40, 'MASTER_ADDR': 'pytorch-mnist-master-0', 'MASTER_PORT': '23456', 'LOCAL_RANK': 1, 'RANK': 3, 'GROUP_RANK': 1, 'ROLE_RANK': 3, 'LOCAL_WORLD_SIZE': 2, 'WORLD_SIZE': 4, 'ROLE_WORLD_SIZE': 4}
    Using cuda:0.
    Using cuda:1.
    Train Epoch: 1 [0/60000 (0%)]   Loss: 2.283599
    Train Epoch: 1 [0/60000 (0%)]   Loss: 2.283599
    ...
    Train Epoch: 10 [58880/60000 (98%)]     Loss: 0.051877Train Epoch: 10 [58880/60000 (98%)]       Loss: 0.051877
    
    Train Epoch: 10 [59520/60000 (99%)]     Loss: 0.007343Train Epoch: 10 [59520/60000 (99%)]       Loss: 0.007343
    
    
    Accuracy: 9919/10000 (99.19%)
    
    
    Accuracy: 9919/10000 (99.19%)
    説明
    • ジョブログをリアルタイムで表示する場合は、-f パラメーターを追加します。

    • ログの最後の行のみを表示する場合は、-t N または --tail N パラメーターを追加します。

    • 詳細については、arena logs --help をご参照ください。

(オプション) ステップ 6: 環境をクリアする

トレーニングジョブが不要になった場合は、次のコマンドを実行してトレーニングジョブを削除します。

arena delete pytorch-mnist -n default

予想される出力:

INFO[0001] The training job pytorch-mnist has been deleted successfully