PyTorch は、さまざまなディープ ラーニング モデルのトレーニングジョブで広く使用されているオープンソースの深層学習フレームワークです。このトピックでは、Arena を使用して複数の GPU を使用する PyTorch トレーニングジョブを送信する方法と、TensorBoard を使用してトレーニングジョブを視覚化する方法について説明します。
前提条件
GPU アクセラレーテッドノードを含む Container Service for Kubernetes (ACK) クラスタが作成されていること。詳細については、「GPU アクセラレーテッドノードを含む ACK クラスタを作成する」をご参照ください。
クラスタ内のノードでインターネットアクセスが有効になっていること。詳細については、「既存の ACK クラスタがインターネットにアクセスできるようにする」をご参照ください。
Arena コンポーネントがインストールされていること。詳細については、「Arena クライアントを設定する」をご参照ください。
training-dataという名前の永続ボリューム要求 (PVC) インスタンスが作成され、MNIST データセットが/pytorch_dataパスに保存されていること。詳細については、「共有 NAS ボリュームを設定する」をご参照ください。
背景情報
リモート 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> は分散トレーニングにおけるノードのロール ( master と worker など) を示し、<index> はノードのシーケンス番号を示します。たとえば、pytorch-mnist という名前のトレーニングジョブに --workers=3 パラメーターと --nproc-per-node=2 パラメーターを設定すると、3 つのトレーニングノードが作成され、各ノードで 2 つのプロセスが開始されます。ノード名は pytorch-mnist-master-0、pytorch-mnist-worker-0、pytorch-mnist-worker-1 です。対応する環境変数が各ノードに挿入されます。次の表に示すように:
環境変数/ノード名 | pytorch-mnist-master-0 | pytorch-mnist-worker-0 | pytorch-mnist-worker-1 |
| pytorch-mnist-master-0 | ||
| 23456 | ||
| 6 | ||
| 0 | 1 | 2 |
| pytorch-mnist-master-0 | ||
| 23456 | ||
| 3 | ||
| 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"次の表にパラメーターを示します。
パラメーター | 必須 | 説明 | デフォルト値 |
| はい | ジョブの名前。グローバルに一意である必要があります。 | 該当なし |
| いいえ | ポッドが属する名前空間。 |
|
| いいえ | ワーカーノードの数を指定します。マスターノードが含まれます。たとえば、値 3 は、トレーニングジョブが 1 つのマスターノードと 2 つのワーカーノードで実行されることを示します。 |
|
| いいえ | トレーニングジョブが実行されるワーカーノードで使用される GPU の数を指定します。 |
|
| いいえ | コマンドが実行されるディレクトリを指定します。 |
|
| はい | ランタイムのデプロイに使用されるイメージのアドレスを指定します。 | 該当なし |
| いいえ | 同期モードを指定します。有効な値: git および rsync。この例では、git モードが使用されます。 | 該当なし |
| いいえ | ソースコードの同期元のレポジトリのアドレスを指定します。このパラメーターは、--sync-mode パラメーターと一緒に使用されます。この例では、git モードが使用されます。GitHub プロジェクトや Alibaba Cloud Code プロジェクトなど、Git をサポートするアドレスを指定する必要があります。プロジェクトコードは、--working-dir の下の | 該当なし |
| いいえ | トレーニングジョブが実行されるランタイムに共有 PV をマウントします。このパラメーターの値は、コロン ( 説明
使用可能な PVC がない場合は、PVC を作成できます。詳細については、「共有 NAS ボリュームを設定する」をご参照ください。 | 該当なし |
| いいえ | TensorBoard を使用してトレーニング結果を視覚化することを指定します。--logdir パラメーターを設定して、TensorBoard がイベントファイルを読み取るパスを指定できます。このパラメーターを設定しない場合、TensorBoard は使用されません。 | 該当なし |
| いいえ | TensorBoard がイベントファイルを読み取るパス。--tensorboard パラメーターとこのパラメーターを指定する必要があります。 |
|
ステップ 3: PyTorch トレーニングジョブを表示する
次のコマンドを実行して、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次のコマンドを実行して、ジョブで使用されている 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次のコマンドを実行して、クラスタ内の 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 すべてが割り当てられていることを示しています。
次のコマンドを実行して、ジョブの詳細情報をクエリします。
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 インスタンスを表示する
オンプレミスマシンで次のコマンドを実行して、クラスタ内の TensorBoard のポート 6006 をオンプレミスポート 9090 にマップします。
重要kubectl port-forward を使用して設定されたポート フォワーディングは、本番環境では信頼性、安全性、または拡張性がありません。開発とデバッグのみを目的としています。本番環境でポート フォワーディングを設定するために、このコマンドを使用しないでください。ACK クラスタの本番で使用されるネットワーキングソリューションの詳細については、「Ingress 管理」をご参照ください。
kubectl port-forward -n default svc/pytorch-mnist-tensorboard 9090:6006http://127.0.0.1:9090 を Web ブラウザーのアドレスバーに入力して、TensorBoard にアクセスします。
説明この例では、スタンドアロンの PyTorch ジョブの送信に使用されるソースコードは、10 エポックごとにトレーニング結果がイベントに書き込まれることを示しています。--epochs の値を変更する場合は、値を 10 の倍数に設定します。それ以外の場合、トレーニング結果は TensorBoard で視覚化できません。
ステップ 5: トレーニングジョブログを表示する
次のコマンドを実行して、トレーニングジョブのマスターポッドログをクエリします。
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%)インデックスが 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