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

Container Service for Kubernetes:Arenaを使用してKubernetesクラスターで分散TensorFlowトレーニングジョブを送信する

最終更新日:Oct 28, 2024

このトピックでは、Arenaクライアントを使用して、パラメーターサーバー (PS)-workerアーキテクチャで実行される分散TensorFlowトレーニングジョブを送信する方法について説明します。 TensorBoardを使用して、トレーニング結果を視覚化できます。

前提条件

背景情報

このトピックでは、ソーストレーニングコードはGitリポジトリからダウンロードされます。 データセットは、PVとPVCを使用してマウントされる共有Apsara File Storage NAS (NAS) ボリュームに保存されます。 この例では、training-dataという名前のPVCが作成されます。 PVCは共有PVを使用する。 データセットは、共有PVのtf_dataディレクトリに保存されます。

手順

  1. 次のコマンドを実行して、クラスターで使用可能な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アクセラレーションノードを使用してトレーニングジョブを実行できることを示しています。

  2. 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プロジェクトで定義されている環境変数をカスタマイズできます。

  3. 次のコマンドを実行して、送信されたすべてのジョブのステータスを照会します。

    arena list

    期待される出力:

    NAME     STATUS     TRAINER  AGE  NODE
    tf-dist  RUNNING    TFJOB    58s  192.1xx.x.xx
    tf-git   SUCCEEDED  TFJOB    2h   N/A
  4. 次のコマンドを実行して、ジョブで使用される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
  5. 次のコマンドを実行して、クラスター内の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%)
  6. 次のコマンドを実行して、タスクに関する詳細情報を照会します。

    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行は返されません。

  7. ブラウザを使用して、TensorBoardでトレーニング結果を表示します。

    1. 次のコマンドを実行して、TensorBoardをローカルポート9090にマッピングします。

      重要

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

      kubectl port-forward svc/tf-dist-tensorboard 9090:6006
    2. 訪問localhost:9090次の図に示すように、ブラウザでTensorBoardのデータを表示します。

      tf

  8. 次のコマンドを実行して、ジョブのログを印刷します。

    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.967

    arena 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