彈性模型訓練通過對接Horovod的Elastic模式,可以讓Horovod運行的分布式訓練任務具備動態調整訓練Workers數量的能力。您可以通過實時的彈性模型訓練,并結合搶占實例,充分利用空閑的算力資源,以降低單位時間的訓練成本。本文介紹如何部署彈性模型訓練任務,以及如何擴容和縮容訓練任務。
前提條件
已安裝云原生AI套件,并選中彈性訓練和Arena組件。具體操作,請參見部署云原生AI套件。
使用Horovod作為分布式訓練框架。更多信息,請參見在Kubernetes上運行彈性深度學習訓練任務。
已安裝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
指定運行彈性模型訓練。在運行時需要指定np、max-np和min-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參與訓練。