Elastic Horovod は、実行中のジョブを再起動したり、チェックポイントから復元したりすることなく、ワーカーをスケールアップまたはスケールダウンします。
-
ご利用のクラスターに、いつでも回収される可能性のあるプリエンプティブルインスタンスが含まれている場合
-
アイドル状態の GPU 容量が利用可能になったときに、それを利用して拡張したい場合
-
ジョブの実行中に使用率の低いワーカーを解放することで、トレーニングコストを削減する必要があります。
前提条件
開始する前に、次の項目を完了してください:
-
クラウドネイティブ AI スイートが、Elastic Training と Arena を選択して、ご利用の Container Service for Kubernetes (ACK) クラスターにデプロイされていること。詳細は、「クラウドネイティブ AI スイートのデプロイ」をご参照ください。
-
Horovod が分散トレーニングフレームワークであること。
-
Horovod ベースのトレーニングスクリプトが準備されていること。
-
Arena クライアントがインストールされていること。詳細は、「Arena クライアントの設定」をご参照ください。
弾性トレーニングジョブの送信
弾性トレーニングジョブを送信します:
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
"
horovodrun は弾性トレーニングを管理します。Arena はパラメーター値を環境変数として渡し、horovodrun は -np、--min-np、および --max-np フラグを介してこれらの値を読み取ります。
/etc/edl/discover_hosts.sh にあるホスト検出スクリプトは、et-operator によって作成されます。
| パラメーター | 説明 |
|---|---|
--name |
トレーニングジョブの名前。グローバルに一意である必要があります。 |
--gpus |
各ワーカーに割り当てられる GPU の数。 |
--workers |
初期ワーカー数。 |
--max-workers |
ワーカーの最大数。 |
--min-workers |
ワーカーの最小数。 |
--image |
ジョブのコンテナイメージ。 |
--working-dir |
コンテナ内の作業ディレクトリ。 |
--np |
ワーカー数。${workers}*${gpus} から計算されます。 |
--max-np |
最大ワーカー数。${maxWorkers}*${gpus} から計算されます。 |
--min-np |
最小ワーカー数。${minWorkers}*${gpus} から計算されます。 |
--host-discovery-script |
ホスト検出スクリプトへのパス。et-operator によって /etc/edl/discover_hosts.sh に作成されます。 |
想定される出力:
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
想定される出力:
名前: elastic-training
ステータス: RUNNING
名前空間: default
優先度: N/A
トレーナー: ETJOB
期間: 3m
インスタンス:
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
トレーニングの進捗を確認します:
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 |
追加するワーカーの数。 |
--timeout |
スケールアウトのタイムアウト。超過した場合、スケジューラはロールバックします。 |
想定される出力:
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
elastic-training-worker-2 がアクティブになりました。ログには、3 つすべてのワーカー (インデックス [0]、[1]、[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
ワーカーのスケールイン
実行中のジョブからワーカーを削除します:
arena scalein etjob --name="elastic-training" --count=1 --timeout=10m
| パラメーター | 説明 |
|---|---|
--name |
スケールするトレーニングジョブの名前。 |
--count |
削除するワーカーの数。 |
--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
elastic-training-worker-2 はリストに表示されなくなりました。ログには、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