このトピックでは、Arena を使用して PS-Worker モデルに基づく TensorFlow 分散トレーニングジョブをサブミットし、TensorBoard を使用してトレーニングジョブを可視化する方法について説明します。
前提条件
GPU を含む Kubernetes クラスターが作成されていること。詳細については、「GPU を含む Kubernetes クラスターの作成」をご参照ください。
クラスターノードがパブリックネットワークにアクセスできること。詳細については、「クラスターのインターネットアクセス有効化」をご参照ください。
Arena クライアントがインストールされていること。詳細については、「Arena クライアントの設定」をご参照ください。
training-dataという名前の永続ボリューム要求 (PVC) インスタンスが作成され、MNIST データセットが tf_data パスに保存されていること。詳細については、「NAS 共有ストレージの設定」をご参照ください。
背景情報
この例では、Git URL からソースコードをダウンロードします。データセットは共有ストレージシステム (NAS ベースの PV および PVC) に保存されます。この例では、training-data という名前の PVC インスタンス (共有ストレージ) があることを前提としています。このインスタンスには、この例で使用されるデータセットを格納する tf_data ディレクトリが含まれています。
操作手順
ステップ 1: 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 ノードがあることを示しています。各ノードには、トレーニングジョブに使用できる 2 つのアイドル状態の GPU があります。
ステップ 2: TensorFlow トレーニングジョブのサブミット
arena submit tfjob/tf [--flag] command の形式のコマンドを実行して、TensorFlow ジョブをサブミットします。
次のコード例を使用して、PS-Worker モードで TensorFlow 分散トレーニングジョブをサブミットします。これには、1 つの PS ノードと 2 つの Worker ノードが含まれます。
arena submit tf \
--name=tf-mnist-dist \
--namespace=default \
--working-dir=/root \
--ps=1 \
--ps-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
--workers=2 \
--worker-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
--gpus=1 \
--sync-mode=git \
--sync-source=https://github.com/kubeflow/arena.git \
--env=GIT_SYNC_BRANCH=master \
--data=training-data:/mnt \
--tensorboard \
--logdir=/mnt/tf_data/logs \
"python /root/code/arena/examples/tensorflow/mnist/main.py --data /mnt/tf_data/mnist.npz --dir /mnt/tf_data/logs"出力例:
service/tf-mnist-dist-tensorboard created
deployment.apps/tf-mnist-dist-tensorboard created
tfjob.kubeflow.org/tf-mnist-dist created
INFO[0004] The Job tf-mnist-dist has been submitted successfully
INFO[0004] You can run `arena get tf-mnist-dist --type tfjob -n default` to check the job statusパラメーターの説明は次の表をご参照ください。
パラメーター | 必須 | 説明 | デフォルト値 |
--name | 必須 | サブミットするジョブの名前を指定します。グローバルに一意である必要があり、重複はできません。 | なし |
--working-dir | 任意 | 現在のコマンドが実行されるディレクトリを指定します。 | /root |
--gpus | 任意 | ジョブの Worker ノードが使用する GPU カードの数を指定します。 | 0 |
--workers | 任意 | ジョブの Worker ノードの数を指定します。 | 1 |
--image | --worker-image と --ps-image が個別に指定されていない場合は必須です。 | トレーニング環境のイメージアドレスを指定します。--worker-image または --ps-image が指定されていない場合、Worker ノードと PS ノードの両方がこのイメージアドレスを使用します。 | なし |
--worker-image | --image が指定されていない場合は必須です。 | ジョブの Worker ノードが使用するイメージアドレスを指定します。--image も存在する場合、--image を上書きします。 | なし |
--sync-mode | 任意 | コードの同期モード。git または rsync を指定できます。このトピックでは Git モードを使用します。 | なし |
--sync-source | 任意 | コード同期用のリポジトリアドレス。--sync-mode と一緒に使用します。この例では Git モードを使用します。このパラメーターには、任意の GitHub プロジェクトアドレスや、Alibaba Cloud Code プロジェクトアドレスなどの Git 対応のコードホスティングアドレスを指定できます。プロジェクトコードは --working-dir の下の code/ ディレクトリにダウンロードされます。この例では、/root/code/tensorflow-sample-code です。 | なし |
--ps | 分散ジョブでは必須 | パラメータサーバ (PS) ノードの数を指定します。 | 0 |
--ps-image | --image が指定されていない場合は必須です。 | PS ノードのイメージアドレスを指定します。--image も存在する場合、--image を上書きします。 | なし |
--data | 任意 | 共有ストレージボリューム PVC を実行環境にマウントします。コロン ( 説明
使用可能な PVC がない場合は、作成してください。詳細については、「NAS 共有ストレージの設定」をご参照ください。 | なし |
--tensorboard | 任意 | データビジュアライゼーションのために、トレーニングタスクの TensorBoard サービスを有効にします。--logdir を使用して、TensorBoard が読み取るイベントパスを指定します。このパラメーターを指定しない場合、TensorBoard サービスは有効になりません。 | なし |
--logdir | 任意 | --tensorboard と一緒に使用します。このパラメーターは、TensorBoard がイベントデータを読み取るパスを指定します。 | /training_logs |
非公開 Git リポジトリを使用する場合は、環境変数 GIT_SYNC_USERNAME と GIT_SYNC_PASSWORD を設定して Git のユーザー名とパスワードを設定します。
arena submit tf \
--name=tf-mnist-dist \
--namespace=default \
--working-dir=/root \
--ps=1 \
--ps-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
--workers=2 \
--worker-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
--gpus=1 \
--sync-mode=git \
--sync-source=https://github.com/kubeflow/arena.git \
--env=GIT_SYNC_BRANCH=master \
--env=GIT_SYNC_USERNAME=yourname \
--env=GIT_SYNC_PASSWORD=yourpwd \
--data=training-data:/mnt \
--tensorboard \
--logdir=/mnt/tf_data/logs \
"python /root/code/arena/examples/tensorflow/mnist/main.py --data /mnt/tf_data/mnist.npz --dir /mnt/tf_data/logs"arena コマンドは git-sync を使用してソースコードを同期します。git-sync プロジェクトで定義されている環境変数を設定できます。
この例では、GitHub リポジトリからソースコードをプルします。ネットワークの問題やその他の理由でコードのプルに失敗した場合は、手動でコードを共有ストレージシステムにダウンロードしてください。このトピックで提供されるデモイメージには、すでにサンプルコード /code/github.com/kubeflow/arena/examples/tensorflow/mnist/main.py が含まれています。次のようにトレーニングジョブを直接サブミットできます。
arena submit tf \
--name=tf-mnist-dist \
--namespace=default \
--working-dir=/root \
--ps=1 \
--ps-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
--workers=2 \
--worker-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
--gpus=1 \
--data=training-data:/mnt \
--tensorboard \
--logdir=/mnt/tf_data/logs \
"python /code/github.com/kubeflow/arena/examples/tensorflow/mnist/main.py --data /mnt/tf_data/mnist.npz --dir /mnt/tf_data/logs"ステップ 3: TensorFlow トレーニングジョブの表示
Arena を通じてサブミットされたすべてのトレーニングジョブを表示します。
arena list出力例:
NAME STATUS TRAINER AGE NODE tf-dist RUNNING TFJOB 58s 192.1xx.x.xx次のコマンドを実行して、ジョブが使用する GPU リソースを確認します。
arena top job出力例:
NAME GPU(Requests) GPU(Allocated) STATUS TRAINER AGE NODE tf-dist 2 2 RUNNING tfjob 1m 192.1xx.x.x tf-git 1 0 SUCCEEDED tfjob 2h N/A Total Allocated GPUs of Training Job: 2 Total Requested GPUs of Training Job: 3arena top job出力例:
NAME GPU(Requests) GPU(Allocated) STATUS TRAINER AGE NODE tf-dist 2 2 RUNNING tfjob 1m 192.1xx.x.x tf-git 1 0 SUCCEEDED tfjob 2h N/A Total Allocated GPUs of Training Job: 2 Total Requested GPUs of Training Job: 3arena top node出力例:
NAME IPADDRESS ROLE STATUS GPU(Total) GPU(Allocated) cn-huhehaote.192.1xx.x.xx 192.1xx.x.xx master ready 0 0 cn-huhehaote.192.1xx.x.xx 192.1xx.x.xx master ready 0 0 cn-huhehaote.192.1xx.x.xx 192.1xx.x.xx master ready 0 0 cn-huhehaote.192.1xx.x.xx 192.1xx.x.xx <none> ready 2 1 cn-huhehaote.192.1xx.x.xx 192.1xx.x.xx <none> ready 2 1 cn-huhehaote.192.1xx.x.xx 192.1xx.x.xx <none> ready 2 0 ----------------------------------------------------------------------------------------- Allocated/Total GPUs In Cluster: 2/6 (33%)arena get -n default tf-mnist-dist出力例
STATUS: RUNNING NAMESPACE: default PRIORITY: N/A TRAINING DURATION: 1m NAME STATUS TRAINER AGE INSTANCE NODE tf-dist RUNNING TFJOB 1m tf-dist-ps-0 192.1xx.x.xx tf-dist RUNNING TFJOB 1m tf-dist-worker-0 192.1xx.x.xx tf-dist RUNNING TFJOB 1m tf-dist-worker-1 192.1xx.x.xx Your tensorboard will be available on: http://192.1xx.x.xx:31870説明このトピックでは、TensorBoard を有効にする例を示します。上記のジョブ詳細では、最後の 2 行が TensorBoard の Web エンドポイントを示しています。TensorBoard を有効にしない場合、これらの 2 行は表示されません。
次のコマンドを実行して、クラスターが使用する GPU リソースを確認します。
次のコマンドを実行して、タスクの詳細を取得します。
ステップ 4: TensorBoard の表示
ブラウザで TensorBoard を表示します。
ローカルで次のコマンドを実行して、クラスター内の TensorBoard をローカルポート 9090 にマッピングします。
ご利用のブラウザで
localhost:9090にアクセスして TensorBoard を表示します。次の図は TensorBoard を示しています。
kubectl port-forward -n default svc/tf-dist-tensorboard 9090:6006ステップ 5: トレーニングジョブログの表示
次のコマンドを実行して、ジョブログ情報を取得します。
arena logs -n default tf-dist出力例:
WARNING:tensorflow:From code/tensorflow-sample-code/tfjob/docker/mnist/main.py:120: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.
Instructions for updating:
...
Accuracy at step 960: 0.9691
Accuracy at step 970: 0.9677
Accuracy at step 980: 0.9687
Accuracy at step 990: 0.968
Adding run metadata for 999
Total Train-accuracy=0.968上記のコマンドを使用してジョブログ情報を取得すると、デフォルトで worker-0 ノードのログが出力されます。分散トレーニングタスクの特定のノードのログを表示するには、まずジョブの詳細を表示してジョブノードのリストを取得し、次にコマンド arena logs $job_name -i $instance_name を使用して特定のインスタンスのログを表示します。
コード例は次のとおりです。
arena get tf-dist出力例:
STATUS: SUCCEEDED
NAMESPACE: default
PRIORITY: N/A
TRAINING DURATION: 1m
NAME STATUS TRAINER AGE INSTANCE NODE
tf-dist SUCCEEDED TFJOB 5m tf-dist-ps-0 192.16x.x.xx
tf-dist SUCCEEDED TFJOB 5m tf-dist-worker-0 192.16x.x.xx
tf-dist SUCCEEDED TFJOB 5m tf-dist-worker-1 192.16x.x.xx
Your tensorboard will be available on:
http://192.16x.x.xx:31870次のコマンドを実行して、ジョブログを取得します。
arena logs tf-dist -i tf-dist-worker-1出力例:
WARNING:tensorflow:From code/tensorflow-sample-code/tfjob/docker/mnist/main.py:120: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.
Instructions for updating:
...
Accuracy at step 970: 0.9676
Accuracy at step 980: 0.968
Accuracy at step 990: 0.967
Adding run metadata for 999
Total Train-accuracy=0.967また、コマンド arena logs $job_name -f を実行して、ジョブのリアルタイムログ出力を表示することもできます。コマンド arena logs $job_name -t N を実行して、ログの最後の N 行を表示します。arena logs --help を実行して、より多くのパラメーターの使用法を照会します。
ログの最後の N 行を表示するためのコード例は次のとおりです。
arena logs tf-dist -t 5出力例:
Accuracy at step 9970: 0.9834
Accuracy at step 9980: 0.9828
Accuracy at step 9990: 0.9816
Adding run metadata for 9999
Total Train-accuracy=0.9816(任意) ステップ 6: 環境のクリーンアップ
トレーニングジョブが完了し、不要になった場合は、次のコマンドを実行して削除します。
arena delete -n default tf-mnist-dist出力例:
INFO[0002] The training job tf-mnist-dist has been deleted successfully