Container Service for Kubernetes (ACK) は、elastic Horovodを統合したエラスティックモデルのトレーニングを提供します。 これにより、Horovodは、ACKクラスターで実行される分散トレーニングタスクのワーカー数を動的に調整できます。 プリエンプティブルインスタンスのクラスターに対してリアルタイムのエラスティックトレーニングを有効にして、アイドル状態のコンピューティングリソースを最大限に活用し、トレーニングコストを削減できます。 このトピックでは、エラスティックモデルのトレーニングタスクをデプロイする方法と、トレーニングタスクのリソースをスケーリングする方法について説明します。
前提条件
クラウドネイティブAIスイートがACKクラスターにデプロイされます。 クラウドネイティブAIスイートをデプロイすると、Elastic TrainingとArenaが選択されます。 詳細については、「クラウドネイティブAIスイートのデプロイ」をご参照ください。
Horovodは、分散トレーニングフレームワークとして使用されます。
Arenaクライアントがインストールされています。 詳細については、「Arenaクライアントの設定」をご参照ください。
背景情報
ワーカーの数は、従来の分散ディープラーニングタスクの送信後に動的に調整することはできません。
モデルトレーニングは、ディープラーニングの重要なステップです。 複雑なモデルのトレーニングには長い時間がかかり、大量の計算能力が必要になります。 エラスティックモデルトレーニングを使用すると、モデルトレーニングタスクのワーカー数を動的に調整できます。
弾性モデルのトレーニングタスクの展開
トレーニングタスクの送信
次のコマンドを実行して、トレーニングタスクを送信します。
アリーナはetjob \を提出します
-- name=elastic-トレーニング \
-- gpus=1 \
-- workers=3 \
-- max-workers=9 \
-- min-workers=1 \
-- imag e=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
"この例では、horovdrunラッパーを使用して、Horovodを使用してエラスティックトレーニングタスクを実行します。 タスクを実行するには、np、max-np、およびmin-npパラメーターが必要です。 Arenaはパラメーター値を環境変数に書き込みます。 タスクの送信時に環境変数を指定できます。
下表に、各パラメーターを説明します。
パラメーター | 説明 |
-- name | トレーニングタスクの名前。 名前はグローバルに一意である必要があります。 |
-- gpus | ワーカーあたりのGPUの数。 |
-- max-workers | トレーニングタスクを実行するワーカーの最大数。 |
-- min-workers | トレーニングタスクを実行するワーカーの最小数。 |
-- イメージ | トレーニングタスクの実行に使用されるコンテナーイメージ。 |
-- 働くdir | コマンドが実行されるディレクトリ。 |
-- np | タスクに使用されるワーカーの数。 |
-- max-np | タスクに使用されるワーカーの最大数。 |
-- min-np | タスクに使用するワーカーの最小数。 |
-- ホスト検出スクリプト | host-discovery-scriptパラメーターは、/etc/edl/discover_hosts.shのet-operatorコンポーネントによって作成されるホスト検出スクリプトのパスを指定します。 |
期待される出力:
configmap/elastic-training-etjobが作成されました
configmap/elastic-training-etjobラベル
作成されたtrainingjob.kai.alibabacloud.com/elastic-training
INFO[0000] ジョブ弾性トレーニングが正常に提出されました
INFO[0000] 「arena get elastic-training -- type etjob」を実行してジョブステータスを確認できますトレーニングタスクの照会
次のコマンドを実行して、トレーニングタスクを照会します。
アリーナ取得弾性-トレーニング期待される出力:
名: elastic-training
ステータス: RUNNING
名前空間: デフォルト
優先順位: N/A
トレーナー: ETJOB
期間: 13秒
インスタンス:
名前ステータス年齢IS_CHIEF GPU (要求された) ノード
---- ------ --- -------- -------------- ----
elastic-training-launcherランニング13s true 0 cn-huhehaote.192.168.0.173
elastic-training-worker-0ランニング13s false 1 cn-huhehaote.192.168.0.174
elastic-training-worker-1ランニング13s false 1 cn-huhehaote.192.168.0。174 トレーニングログの照会
次のコマンドを実行して、トレーニングログを照会します。
アリーナログ弾性トレーニング-テール10期待される出力:
[0]<stdout>: ステップ #340損失: 0.047924
[1]<stdout>: ステップ #340損失: 0.116303
[0]<stdout>: ステップ #350損失: 0.068762
[1]<stdout>: ステップ #350損失: 0.040847
[0]<stdout>: ステップ #360損失: 0.057501
[1]<stdout>: ステップ #360損失: 0.111952
[0]<stdout>: ステップ #370損失: 0.085895
[1]<stdout>: ステップ #370損失: 0.075529
[0]<stdout>: ステップ #380損失: 0.063450
[1]<stdout>: ステップ #380損失: 0.054253 トレーニングタスクのワーカーを追加する
スケールアウトタスクの送信
次のコマンドを実行して、スケールアウトタスクを送信します。
アリーナscaleout etjob -- name="elastic-training" -- count=1 -- timeout=10m-- name: ワーカーを追加するトレーニングタスクの名前。
-- count: トレーニングタスクに追加するワーカーの数。
-- timeout: スケールアウト操作のタイムアウト期間。
タイムアウト期間が終了する前にワーカーが作成されない場合、スケジューラはスケールアウト操作をロールバックします。
期待される出力:
configmap/elastic-training-1609914643-scaleout作成
ラベル付きconfigmap/elastic-training-1609914643-scaleout
作成されたscaleout.kai.alibabacloud.com/elastic-training-1609914643
INFO[0003] scaleoutジョブelastic-training-1609914643が正常に提出されましたトレーニングタスクの照会
次のコマンドを実行して、トレーニングタスクを照会します。
アリーナ取得弾性-トレーニング期待される出力:
名: elastic-training
ステータス: RUNNING
名前空間: デフォルト
優先順位: N/A
トレーナー: ETJOB
期間: 3m
インスタンス:
名前ステータス年齢IS_CHIEF GPU (要求された) ノード
---- ------ --- -------- -------------- ----
elastic-training-launcher 3m true 0 cn-huhehaote.192.168.0.173
elastic-training-worker-0ランニング3m false 1 cn-huhehaote.192.168.0.174
elastic-training-worker-1ランニング3m偽1 cn-huhehaote.192.168.0.174
elastic-training-worker-2ランニング1m偽1 cn-huhehaote.192.168.0。173 上記の出力は、トレーニングタスクを実行するためにelastic-training-worker-2という名前のワーカーがデプロイされていることを示しています。
トレーニングログの照会
次のコマンドを実行して、トレーニングログを照会します。
アリーナログ弾性トレーニング-テール10期待される出力:
[1]<stdout>: ステップ #1670損失: 0.131210
[2]<stdout>: ステップ #1680損失: 0.020876
[0]<stdout>: ステップ #1680損失: 0.030605
[1]<stdout>: ステップ #1680損失: 0.074515
[2]<stdout>: ステップ #1690損失: 0.029105
[0]<stdout>: ステップ #1690損失: 0.015216
[1]<stdout>: ステップ #1690損失: 0.022670
[0]<stdout>: ステップ #1700損失: 0.105407
[1]<stdout>: ステップ #1700損失: 0.037623
[2]<stdout>: ステップ #1700損失: 0.032874 上記の出力は、3つのワーカーがタスクを実行していることを示します。
トレーニングタスクからワーカーを削除する
スケールインタスクの送信
次のコマンドを実行して、スケールインタスクを送信します。
arena scalein etjob -- name="elastic-training" -- count=1 -- timeout=10m-- name: ワーカーを削除するトレーニングタスクの名前。
-- count: トレーニングタスクから削除するワーカーの数。
-- timeout: スケールイン操作のタイムアウト期間。
期待される出力:
configmap/elastic-training-1609914720-scalein作成
ラベル付きconfigmap/elastic-training-1609914720-scalein
作成されたscalein.kai.alibabacloud.com/elastic-training-1609914720
INFO[0002] scaleinジョブelastic-training-1609914720が正常に提出されましたトレーニングタスクの照会
次のコマンドを実行して、トレーニングタスクを照会します。
アリーナ取得弾性-トレーニング期待される出力:
名: elastic-training
ステータス: RUNNING
名前空間: デフォルト
優先順位: N/A
トレーナー: ETJOB
期間: 3m
インスタンス:
名前ステータス年齢IS_CHIEF GPU (要求された) ノード
---- ------ --- -------- -------------- ----
elastic-training-launcher 3m true 0 cn-huhehaote.192.168.0.173
elastic-training-worker-0ランニング3m false 1 cn-huhehaote.192.168.0.174
elastic-training-worker-1ランニング3m偽1 cn-huhehaote.192.168.0。174 上記の出力は、elastic-training-worker-2という名前のワーカーが削除されたことを示しています。
トレーニングログの照会
次のコマンドを実行して、トレーニングログを照会します。
アリーナログ弾性トレーニング-テール10期待される出力:
[1]<stdout>: ステップ #2180損失: 0.001739
[0]<stdout>: ステップ #2180損失: 0.004853
[0]<stdout>: ステップ #2190損失: 0.000846
[1]<stdout>: ステップ #2190損失: 0.007900
[0]<stdout>: ステップ #2200損失: 0.039376
[1]<stdout>: ステップ #2200損失: 0.024672
[0]<stdout>: ステップ #2210損失: 0.012985
[1]<stdout>: ステップ #2210損失: 0.010956
[0]<stdout>: ステップ #2220損失: 0.009604
[1]<stdout>: ステップ #2220損失: 0.002531 上記の出力は、2つのワーカーのみがタスクを実行していることを示しています。