本文展示如何使用Arena提交TensorFlow基於PS-Worker模式的分布式訓練作業,並通過TensorBoard可視化查看訓練作業。
前提條件
已建立包含GPU的Kubernetes叢集。具體操作,請參見建立包含GPU的Kubernetes叢集。
叢集節點可以訪問公網。具體操作,請參見為叢集開啟訪問公網的能力。
已安裝Arena工具。具體操作,請參見配置Arena用戶端。
建立一個名為
training-data的PVC執行個體,並在路徑tf_data下存放MNIST資料集。具體操作,請參見配置NAS共用儲存。
背景資訊
本文樣本從Git URL下載原始碼,資料集放在共用儲存系統(基於NAS的PV和PVC)中。樣本假設您已經獲得了一個名稱為training-data的PVC執行個體(一個共用儲存),裡面存在一個目錄tf_data,存放了樣本所使用的資料集。
操作步驟
步驟一:查看 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卡可用於運行訓練作業。
步驟二:提交 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專案地址。阿里雲code專案地址等支援Git的代碼託管地址。專案代碼將會被下載到--working-dir下的code/目錄中。本文樣本即為:/root/code/tensorflow-sample-code。 | 無 |
--ps | 分布式作業必選 | 指定參數伺服器PS節點數。 | 0 |
--ps-image | 如果不指定--image,則必選。 | 指定PS節點的鏡像地址。如果--image同時出現,則覆蓋--image。 | 無 |
--data | 可選 | 掛載共用儲存卷PVC到運行環境中。它由兩部分組成,通過冒號( 說明 執行 如果沒有可用的PVC,您可建立PVC。詳情請參見配置NAS共用儲存。 | 無 |
--tensorboard | 可選 | 為訓練任務開啟一個TensorBoard服務,用作資料視覺效果,您可以結合--logdir指定TensorBoard要讀取的event路徑。不指定該參數,則不開啟TensorBoard服務。 | 無 |
--logdir | 可選 | 需要結合--tensorboard一起使用,該參數表示TensorBoard需要讀取event資料的路徑。 | /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"步驟三:查看 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,在上述作業詳情中最後兩行,可以看到TensorBoard的Web訪問地址;如果沒有開啟TensorBoard,最後兩行資訊不存在。
執行以下命令檢查叢集所使用的GPU資源。
執行以下命令擷取任務詳情。
步驟四:查看 TensorBoard
通過瀏覽器查看TensorBoard。
在本地執行如下命令,將叢集中的TensorBoard映射到本地9090連接埠。
在瀏覽器中訪問
localhost:9090,即可查看TensorBoard。如下圖所示。
請注意kubectl port-forward建立的連接埠轉寄不具備生產層級的可靠性、安全性和擴充性,因此僅適用於開發和調試目的,不適合在生產環境使用。更多關於Kubernetes叢集內生產可用的網路方案的資訊,請參見Ingress管理。
kubectl port-forward -n default svc/tf-dist-tensorboard 9090:6006步驟五:查看訓練作業日誌
執行以下命令擷取作業日誌資訊。
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(可選)步驟六:環境清理
訓練作業執行結束後如不再需要,執行如下命令進行刪除:
arena delete -n default tf-mnist-dist預期輸出:
INFO[0002] The training job tf-mnist-dist has been deleted successfully