このトピックでは、Arenaクライアントを使用して、パラメーターサーバー (PS)-workerアーキテクチャで実行される分散TensorFlowトレーニングジョブを送信する方法について説明します。 TensorBoardを使用して、トレーニング結果を視覚化できます。
前提条件
GPU高速化ノードを含むContainer Service for Kubernetes (ACK) クラスターが作成されました。
ACKクラスターに対して永続ボリューム要求 (PVC) が作成され、このトピックで使用されるデータセットが対応する永続ボリューム (PV) にダウンロードされます。 詳細については、「Configure a shared NAS volume」をご参照ください。
背景情報
このトピックでは、ソーストレーニングコードはGitリポジトリからダウンロードされます。 データセットは、PVとPVCを使用してマウントされる共有Apsara File Storage NAS (NAS) ボリュームに保存されます。 この例では、training-dataという名前のPVCが作成されます。 PVCは共有PVを使用する。 データセットは、共有PVのtf_dataディレクトリに保存されます。
手順
次のコマンドを実行して、クラスターで使用可能なGPUリソースを照会します。
arena top node期待される出力:
NAME IPADDRESS ROLE STATUS GPU(Total) GPU(Allocated) cn-huhehaote.192.16x.x.xx 192.1xx.x.xx master ready 0 0 cn-huhehaote.192.16x.x.xx 192.1xx.x.xx master ready 0 0 cn-huhehaote.192.16x.x.xx 192.1xx.x.xx master ready 0 0 cn-huhehaote.192.16x.x.xx 192.1xx.x.xx <none> ready 2 0 cn-huhehaote.192.16x.x.xx 192.1xx.x.xx <none> ready 2 0 cn-huhehaote.192.16x.x.xx 192.1xx.x.xx <none> ready 2 0 ----------------------------------------------------------------------------------------- Allocated/Total GPUs In Cluster: 0/6 (0%)出力は、3つのGPUアクセラレーションノードを使用してトレーニングジョブを実行できることを示しています。
arena submit tfjob/tf [-- flag]コマンドを実行して、分散TensorFlowトレーニングジョブを送信します。次のサンプルコードは、PS-workerアーキテクチャで実行される分散TensorFlowトレーニングジョブを送信する方法の例を示しています。 トレーニングジョブは、1つのPSノードと2つのワーカーノードで実行されます。
arena submit tf --name=tf-dist \ --working-dir=/root \ --gpus=1 \ --workers=2 \ --worker-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow:1.5.0-devel-gpu \ --sync-mode=git \ --sync-source=https://code.aliyun.com/xiaozhou/tensorflow-sample-code.git \ --ps=1 \ --ps-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow:1.5.0-devel \ --data=training-data:/mnt \ --tensorboard \ --logdir=/mnt/tf_data/logs \ "python code/tensorflow-sample-code/tfjob/docker/mnist/main.py --log_dir /mnt/tf_data/logs --data_dir /mnt/tf_data/"期待される出力:
configmap/tf-dist-tfjob created configmap/tf-dist-tfjob labeled service/tf-dist-tensorboard created deployment.apps/tf-dist-tensorboard created tfjob.kubeflow.org/tf-dist created INFO[0000] The Job tf-dist has been submitted successfully INFO[0000] You can run `arena get tf-dist --type tfjob` to check the job statusを確認できます。
次の表に、前述のサンプルコードブロックのパラメーターを示します。
パラメーター
必須
説明
デフォルト
-- name
必須
送信するジョブの名前を指定します。 名前はグローバルに一意である必要があります。
非該当
-- 働くdir
選択可能
コマンドを実行するディレクトリを指定します。
/ルート
-- gpus
選択可能
トレーニングジョブが実行されるワーカーノードで使用されるGPUの数を指定します。
0
-- 労働者
選択可能
ワーカーノードの数を指定します。
1
-- イメージ
このパラメーターは、ワーカーノードに -- worker-imageを、psノードに -- PS-imageを指定しない場合に必要です。
ランタイムのデプロイに使用するイメージのアドレスを指定します。 -- worker-imageまたは -- ps-imageを指定しない場合、ワーカーノードとPSノードの両方が同じイメージアドレスを使用します。
非該当
-- workerイメージ
このパラメーターは、-- imageを指定しない場合に必要です。
ワーカーノードのイメージのアドレスを指定します。 -- imageも指定した場合、このパラメーターは -- imageパラメーターを上書きします。
非該当
-- syncモード
選択可能
同期モードを指定します。 有効な値: gitおよびrsync この例ではgitモードが使用されています。
非該当
-- syncソース
選択可能
ソースコードが同期されるリポジトリのアドレス。 このパラメーターは、-- sync-modeパラメーターと組み合わせて使用されます。 この例ではgitモードが使用されています。 したがって、GitHubまたはAlibaba Cloud上のプロジェクトのURLなど、Gitリポジトリアドレスを指定する必要があります。 ソースコードは、-- working-dirの下のcode/ ディレクトリにダウンロードされます。 この例では、ディレクトリは /root/code/tensorflow-sample-codeです。
非該当
-- ps
このパラメーターは、分散TensorFlowトレーニングジョブに必要です。
PSノードの数を指定します。
0
-- psイメージ
このパラメーターは、-- imageを指定しない場合に必要です。
PSノードのイメージアドレスを指定します。 -- imageも指定した場合、このパラメーターは -- imageパラメーターを上書きします。
非該当
-- データ
選択可能
トレーニングジョブが実行されるランタイムに共有PVをマウントします。 このパラメーターの値は、コロン (
:) で区切られた2つの部分で構成されます。 コロンの左側にあるPVCの名前を指定します。 PVCの名前を取得するには、arena data listコマンドを実行します。 このコマンドは、指定されたクラスターで使用可能なPVCを照会します。 PVCによって要求されたPVがコロンの右側にマウントされるパスを指定します。 このようにして、トレーニングジョブは、PVCによって要求された対応するPVに格納されたデータを取得できます。説明arena data listコマンドを実行して、指定されたクラスターで使用可能なPVCを照会します。NAME ACCESSMODEの説明所有者の年齢 トレーニング-データReadWriteMany 35m使用可能なPVCがない場合は、PVCを作成できます。 詳細については、「Configure a shared NAS volume」をご参照ください。
非該当
-- tensorboard
選択可能
TensorBoardを使用してトレーニング結果を視覚化することを指定します。 -- logdirパラメーターを設定して、TensorBoardがイベントファイルを読み取るパスを指定できます。 このパラメーターを指定しない場合、TensorBoardは使用されません。
非該当
-- logdir
選択可能
TensorBoardがイベントファイルを読み取るパスを指定します。 このパラメーターと -- tensorboardパラメーターの両方を指定する必要があります。
/training_logs
重要非公開のGitリポジトリを使用する場合は、次のコマンドを実行してトレーニングジョブを送信します。
arena submit tf \ ... --sync-mode=git \ --sync-source=https://code.aliyun.com/xiaozhou/tensorflow-sample-code.git \ --env=GIT_SYNC_USERNAME=yourname \ --env=GIT_SYNC_PASSWORD=yourpwd \ "python code/tensorflow-sample-code/tfjob/docker/mnist/main.py上記のコードブロックでは、Arenaクライアントはgit-syncプロジェクトを使用してソースコードを同期します。 git-syncプロジェクトで定義されている環境変数をカスタマイズできます。
次のコマンドを実行して、送信されたすべてのジョブのステータスを照会します。
arena list期待される出力:
NAME STATUS TRAINER AGE NODE tf-dist RUNNING TFJOB 58s 192.1xx.x.xx tf-git SUCCEEDED TFJOB 2h N/A次のコマンドを実行して、ジョブで使用される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: 3次のコマンドを実行して、クラスター内のGPUリソースを照会します。
arena 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 tf-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が使用されています。 したがって、TensorBoardのURLは、ジョブ情報の最後の2行にあります。 TensorBoardを使用しない場合、最後の2行は返されません。
ブラウザを使用して、TensorBoardでトレーニング結果を表示します。
次のコマンドを実行して、TensorBoardをローカルポート9090にマッピングします。
重要kubectl Port-forwardを使用して設定されたポート転送は、運用環境では信頼性、安全性、拡張性がありません。 開発とデバッグ用のみです。 本番環境では、このコマンドを使用してポート転送を設定しないでください。 ACKクラスターの運用に使用されるネットワークソリューションの詳細については、「Ingress overview」をご参照ください。
kubectl port-forward svc/tf-dist-tensorboard 9090:6006訪問
localhost:9090次の図に示すように、ブラウザでTensorBoardのデータを表示します。
次のコマンドを実行して、ジョブのログを印刷します。
arena logs 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.967arena logs $job_name -fコマンドを実行してジョブログをリアルタイムで印刷し、arena logs $job_name -t Nコマンドを実行してログの下部からN行を印刷します。arena logs -- helpコマンドを実行して、ログを印刷するためのパラメーターを照会することもできます。次のサンプルコードは、ログの下部からN行を出力する方法の例を示しています。
arena logs tf-dist -t 5期待される出力:
ステップ9970の
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