全部產品
Search
文件中心

Container Service for Kubernetes:基於Kubernetes使用TensorFlow進行分布式訓練

更新時間:Aug 16, 2024

本文展示如何使用Arena提交TensorFlow基於PS-Worker模式的分布式訓練作業,並通過TensorBoard可視化查看訓練作業。

前提條件

背景資訊

本文樣本從Git URL下載原始碼,資料集放在共用儲存系統(基於NAS的PV和PVC)中。樣本假設您已經獲得了一個名稱為training-data的PVC執行個體(一個共用儲存),裡面存在一個目錄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] command形式命令提交TensorFlow作業。

    通過以下程式碼範例提交PS-Worker模式下的TensorFlow分布式作業,它包含1個PS節點,2個Worker節點。

        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

    必選

    指定提交的作業名字,全域唯一,不能重複。

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

    可選

    同步代碼的模式,您可以指定gitrsync。本文使用Git模式。

    --sync-source

    可選

    同步代碼的倉庫地址,需要和--sync-mode一起使用。本文樣本使用Git模式,該參數可以為任何github專案地址。阿里雲code專案地址等支援Git的代碼託管地址。專案代碼將會被下載到--working-dir下的code/目錄中。本文樣本即為:/root/code/tensorflow-sample-code

    --ps

    分布式作業必選

    指定參數伺服器PS節點數。

    0

    --ps-image

    如果不指定--image,則必選。

    指定PS節點的鏡像地址。如果--image同時出現,則覆蓋--image

    --data

    可選

    掛載共用儲存卷PVC到運行環境中。它由兩部分組成,通過冒號(:)分割。冒號左側是您已經準備好的PVC名稱。您可以通過命令arena data list查看當前叢集可用的PVC列表;冒號右側是您想將PVC的掛載到運行環境中的路徑,也是您訓練代碼要讀取資料的本地路徑。這樣通過掛載的方式,您的代碼就可以訪問PVC的資料。

    說明

    執行arena data list查看本文樣本當前叢集可用的PVC列表。

    NAME           ACCESSMODE     DESCRIPTION  OWNER  AGE
    training-data  ReadWriteMany                      35m

    如果沒有可用的PVC,您可建立PVC。詳情請參見配置NAS共用儲存

    --tensorboard

    可選

    為訓練任務開啟一個TensorBoard服務,用作資料視覺效果,您可以結合--logdir指定TensorBoard要讀取的event路徑。不指定該參數,則不開啟TensorBoard服務。

    --logdir

    可選

    需要結合--tensorboard一起使用,該參數表示TensorBoard需要讀取event資料的路徑。

    /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提交的所有作業。

    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的Web訪問地址;如果沒有開啟TensorBoard,最後兩行資訊不存在。

  7. 通過瀏覽器查看TensorBoard。

    1. 在本地執行如下命令,將叢集中的TensorBoard映射到本地9090連接埠。

      重要

      請注意kubectl port-forward建立的連接埠轉寄不具備生產層級的可靠性、安全性和擴充性,因此僅適用於開發和調試目的,不適合在生產環境使用。更多關於Kubernetes叢集內生產可用的網路方案的資訊,請參見Ingress概述

      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

    預期輸出:

    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