すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Kubernetes 上で Horovod を使用したエラスティックトレーニング

最終更新日:Mar 27, 2026

従来の分散トレーニングジョブでは、サブミット時にワーカー数が固定されます。Elastic Horovod はこの制約を解消し、ジョブの実行中に再起動したり、チェックポイントから復元したりすることなく、ワーカーをスケールアップまたはスケールダウンできます。この機能は、次のような場合に使用します:

  • クラスターに、いつでも回収される可能性のあるプリエンプティブルインスタンスが含まれている場合

  • 利用可能になったアイドル GPU 容量を活用して拡張したい場合

  • ジョブの途中で使用率の低いワーカーを解放してトレーニングコストを削減する必要がある場合

前提条件

開始する前に、次のものが準備できていることを確認してください:

  • ご利用の ACK クラスターにクラウドネイティブ AI スイートがデプロイされており、デプロイメント中に [エラスティックトレーニング][Arena] が選択されていること。詳細については、「クラウドネイティブ 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

インスタンス:
  名前                       ステータス   実行時間  チーフ      GPU (要求)      ノード
  ----                       ------   ---  --------  --------------  ----
  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-フフホト.192.168.0.173
  elastic-training-worker-0  Running  3m   false     1               cn-フフホト.192.168.0.174
  elastic-training-worker-1  Running  3m   false     1               cn-フフホト.192.168.0.174
  elastic-training-worker-2  Running  1m   false     1               cn-フフホト.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-フフホト.192.168.0.173
  elastic-training-worker-0  Running  3m   false     1               cn-フフホト.192.168.0.174
  elastic-training-worker-1  Running  3m   false     1               cn-フフホト.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