全部產品
Search
文件中心

Container Service for Kubernetes:基於Kubernetes使用Horovod進行彈性訓練

更新時間:Aug 08, 2024

彈性模型訓練通過對接Horovod的Elastic模式,可以讓Horovod啟動並執行分布式訓練任務具備動態調整訓練Workers數量的能力。您可以通過即時的彈性模型訓練,並結合搶佔執行個體,充分利用閒置算力資源,以降低單位時間的訓練成本。本文介紹如何部署彈性模型訓練任務,以及如何擴容和縮容訓練任務。

前提條件

  • 已安裝雲原生AI套件,並選中彈性訓練Arena組件。具體操作,請參見部署雲原生AI套件

  • 使用Horovod作為分布式訓練架構。

  • 已安裝Arena用戶端。具體操作,請參見配置Arena用戶端

背景資訊

傳統分布式深度學習任務,一旦提交訓練任務,無法在運行中動態調整Workers的數量。

模型訓練是深度學習中重要的環節,模型複雜的訓練任務有已耗用時間長、算力需求大的特徵。通過彈性模型訓練,可以為深度學習的模型訓練任務提供動態修改Workers數量的能力。

部署彈性模型訓練任務

提交訓練任務

使用以下程式碼範例提交一個訓練任務。

arena submit etjob \
    --name=elastic-training \
    --gpus=1 \
    --workers=3 \
    --max-workers=9 \
    --min-workers=1 \
    --image=registry.cn-hangzhou.aliyuncs.com/ai-samples/horovod:0.20.0-tf2.3.0-torch1.6.0-mxnet1.6.0.post0-py3.7-cuda10.1 \
    --working-dir=/examples \
    "horovodrun \
    -np \$((\${workers}*\${gpus})) \
    --min-np \$((\${minWorkers}*\${gpus})) \
    --max-np \$((\${maxWorkers}*\${gpus})) \
    --host-discovery-script /etc/edl/discover_hosts.sh \
    python /examples/elastic/tensorflow2_mnist_elastic.py
    "

本文樣本是一個Horovod任務,通過horovodrun指定運行彈性模型訓練。在運行時需要指定npmax-npmin-np,Arena會將這些資訊寫入環境變數,所以在提交時指定環境變數即可。

參數解釋如下表所示。

參數名

說明

--name

指定訓練任務名稱,全域唯一,不能重複。

--gpus

指定每個worker的GPU數。

--max-workers

指定訓練任務最大Workers節點數。

--min-workers

指定訓練任務最小Workers節點數。

--image

指定訓練任務啟動並執行容器鏡像。

--working-dir

指定當前執行命令所在的目錄。

--np

運行時的Workers數。

--max-np

運行時的最大Workers數。

--min-np

運行時的最小Workers數。

--host-discovery-script

et-operator/etc/edl/discover_hosts.sh位置將建立一個服務發現指令碼, 該檔案路徑通過host-discovery-script指定。

系統輸出類似以下結果:

configmap/elastic-training-etjob created
configmap/elastic-training-etjob labeled
trainingjob.kai.alibabacloud.com/elastic-training created
INFO[0000] The Job elastic-training has been submitted successfully
INFO[0000] You can run `arena get elastic-training --type etjob` to check the job status

查看訓練任務

執行以下命令查看訓練任務:

arena get elastic-training

系統輸出類似以下結果:

Name:        elastic-training
Status:      RUNNING
Namespace:   default
Priority:    N/A
Trainer:     ETJOB
Duration:    13s

Instances:
  NAME                       STATUS   AGE  IS_CHIEF  GPU(Requested)  NODE
  ----                       ------   ---  --------  --------------  ----
  elastic-training-launcher  Running  13s  true      0               cn-huhehaote.192.168.0.173
  elastic-training-worker-0  Running  13s  false     1               cn-huhehaote.192.168.0.174
  elastic-training-worker-1  Running  13s  false     1               cn-huhehaote.192.168.0.174

查看訓練日誌

執行以下命令查看訓練日誌:

arena logs elastic-training --tail 10

系統輸出類似以下結果:

[0]<stdout>:Step #340    Loss: 0.047924
[1]<stdout>:Step #340    Loss: 0.116303
[0]<stdout>:Step #350    Loss: 0.068762
[1]<stdout>:Step #350    Loss: 0.040847
[0]<stdout>:Step #360    Loss: 0.057501
[1]<stdout>:Step #360    Loss: 0.111952
[0]<stdout>:Step #370    Loss: 0.085895
[1]<stdout>:Step #370    Loss: 0.075529
[0]<stdout>:Step #380    Loss: 0.063450
[1]<stdout>:Step #380    Loss: 0.054253

擴容彈性模型訓練任務

提交擴容任務

執行以下命令提交一個擴容任務:

arena scaleout etjob --name="elastic-training" --count=1 --timeout=10m
  • --name:指定操作的訓練任務。

  • --count:指定擴容的Workers數量。

  • --timeout:指定擴容的逾時時間。

如果在指定時間內未成功建立Workers,部署彈性任務的調度器會復原擴容操作。

系統輸出類似以下結果:

configmap/elastic-training-1609914643-scaleout created
configmap/elastic-training-1609914643-scaleout labeled
scaleout.kai.alibabacloud.com/elastic-training-1609914643 created
INFO[0003] The scaleout job elastic-training-1609914643 has been submitted successfully

查看訓練任務

執行以下命令查看訓練任務:

arena get elastic-training

系統輸出類似以下結果:

Name:        elastic-training
Status:      RUNNING
Namespace:   default
Priority:    N/A
Trainer:     ETJOB
Duration:    3m 

Instances:
  NAME                       STATUS   AGE  IS_CHIEF  GPU(Requested)  NODE
  ----                       ------   ---  --------  --------------  ----
  elastic-training-launcher  Running  3m   true      0               cn-huhehaote.192.168.0.173
  elastic-training-worker-0  Running  3m   false     1               cn-huhehaote.192.168.0.174
  elastic-training-worker-1  Running  3m   false     1               cn-huhehaote.192.168.0.174
  elastic-training-worker-2  Running  1m   false     1               cn-huhehaote.192.168.0.173

從以上輸出的資訊,可以看到新部署的Workerelastic-training-worker-2

查看訓練日誌

執行以下命令查看訓練日誌:

arena logs elastic-training --tail 10

系統輸出類似以下結果:

[1]<stdout>:Step #1670    Loss: 0.131210
[2]<stdout>:Step #1680    Loss: 0.020876
[0]<stdout>:Step #1680    Loss: 0.030605
[1]<stdout>:Step #1680    Loss: 0.074515
[2]<stdout>:Step #1690    Loss: 0.029105
[0]<stdout>:Step #1690    Loss: 0.015216
[1]<stdout>:Step #1690    Loss: 0.022670
[0]<stdout>:Step #1700    Loss: 0.105407
[1]<stdout>:Step #1700    Loss: 0.037623
[2]<stdout>:Step #1700    Loss: 0.032874

從以上輸出的日誌資訊,可以看到當前共有3個Workers參與訓練。

縮容彈性模型訓練任務

提交縮容任務

執行以下命令提交一個縮容任務:

arena scalein etjob --name="elastic-training" --count=1 --timeout=10m
  • --name:指定操作的訓練任務。

  • --count:指定縮容的Workers數量。

  • --timeout:指定縮容時間,即等待進程結束的時間。

系統輸出類似以下結果:

configmap/elastic-training-1609914720-scalein created
configmap/elastic-training-1609914720-scalein labeled
scalein.kai.alibabacloud.com/elastic-training-1609914720 created
INFO[0002] The scalein job elastic-training-1609914720 has been submitted successfully

查看訓練任務

執行以下命令查看訓練任務:

arena get elastic-training

系統輸出類似以下結果:

Name:        elastic-training
Status:      RUNNING
Namespace:   default
Priority:    N/A
Trainer:     ETJOB
Duration:    3m

Instances:
  NAME                       STATUS   AGE  IS_CHIEF  GPU(Requested)  NODE
  ----                       ------   ---  --------  --------------  ----
  elastic-training-launcher  Running  3m   true      0               cn-huhehaote.192.168.0.173
  elastic-training-worker-0  Running  3m   false     1               cn-huhehaote.192.168.0.174
  elastic-training-worker-1  Running  3m   false     1               cn-huhehaote.192.168.0.174

從以上輸出的資訊,可以看到Workerelastic-training-worker-2已被回收。

查看訓練日誌

執行以下命令查看訓練日誌:

arena logs elastic-training --tail 10

系統輸出類似以下結果:

[1]<stdout>:Step #2180    Loss: 0.001739
[0]<stdout>:Step #2180    Loss: 0.004853
[0]<stdout>:Step #2190    Loss: 0.000846
[1]<stdout>:Step #2190    Loss: 0.007900
[0]<stdout>:Step #2200    Loss: 0.039376
[1]<stdout>:Step #2200    Loss: 0.024672
[0]<stdout>:Step #2210    Loss: 0.012985
[1]<stdout>:Step #2210    Loss: 0.010956
[0]<stdout>:Step #2220    Loss: 0.009604
[1]<stdout>:Step #2220    Loss: 0.002531

從以上輸出的日誌資訊,可以看到當前僅有2個Workers參與訓練。