Tous les produits
Search
Centre de documentation

Container Service for Kubernetes:Run elastic training with Horovod on Kubernetes

Dernière mise à jour :Aug 11, 2026

Horovod Elastic permet d'ajuster le nombre de nœuds de calcul (workers) à la hausse ou à la baisse pendant l'exécution d'un job, sans redémarrage ni restauration depuis un point de contrôle.

  • Votre cluster inclut des instances préemptibles qui peuvent être récupérées à tout moment

  • Vous souhaitez exploiter la capacité GPU inactive dès qu'elle devient disponible

  • Vous devez réduire les coûts d'entraînement en libérant les workers sous-utilisés en cours de job

Prérequis

Effectuez les opérations suivantes avant de commencer :

  • La suite AI cloud-native est déployée dans votre cluster ACK avec les options Elastic Training et Arena sélectionnées. Consultez Déploiement de la suite AI cloud-native.

  • Horovod est le framework d'entraînement distribué.

  • Un script d'entraînement basé sur Horovod est prêt.

  • Le client Arena est installé. Consultez Configuration du client Arena.

Soumettre un job d'entraînement élastique

Soumettez un job d'entraînement élastique :

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 gère l'entraînement élastique. Arena transmet les valeurs des paramètres sous forme de variables d'environnement, que horovodrun lit via les indicateurs -np, --min-np et --max-np.

Le script de découverte des hôtes situé à l'emplacement /etc/edl/discover_hosts.sh est créé par et-operator.

Paramètre Description
--name Nom du job d'entraînement. Doit être globalement unique.
--gpus Nombre de GPU alloués à chaque worker.
--workers Nombre initial de workers.
--max-workers Nombre maximal de workers.
--min-workers Nombre minimal de workers.
--image Image de conteneur pour le job.
--working-dir Répertoire de travail à l'intérieur du conteneur.
--np Nombre de workers. Calculé à partir de ${workers}*${gpus}.
--max-np Nombre maximal de workers. Calculé à partir de ${maxWorkers}*${gpus}.
--min-np Nombre minimal de workers. Calculé à partir de ${minWorkers}*${gpus}.
--host-discovery-script Chemin d'accès au script de découverte des hôtes. Créé par et-operator à l'emplacement /etc/edl/discover_hosts.sh.

Sortie attendue :

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

Vérifier le job en cours d'exécution

Vérifiez l'état du job :

arena get elastic-training

Sortie attendue :

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

Contrôlez la progression de l'entraînement :

arena logs elastic-training --tail 10

Sortie attendue :

[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

Mettre à l'échelle les workers à la hausse

Ajoutez des workers au job en cours d'exécution :

arena scaleout etjob --name="elastic-training" --count=1 --timeout=10m
Paramètre Description
--name Nom du job d'entraînement à mettre à l'échelle.
--count Nombre de workers à ajouter.
--timeout Délai d'expiration pour la mise à l'échelle ascendante. En cas de dépassement, le planificateur annule l'opération.

Sortie attendue :

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

Confirmez que le nouveau worker est en cours d'exécution :

arena get elastic-training

Sortie attendue :

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 est désormais actif. Les journaux affichent la sortie des trois workers (index [0], [1] et [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

Mettre à l'échelle les workers à la baisse

Supprimez des workers du job en cours d'exécution :

arena scalein etjob --name="elastic-training" --count=1 --timeout=10m
Paramètre Description
--name Nom du job d'entraînement à mettre à l'échelle.
--count Nombre de workers à supprimer.
--timeout Délai d'expiration pour la mise à l'échelle descendante.

Sortie attendue :

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

Confirmez que le worker a été supprimé :

arena get elastic-training

Sortie attendue :

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 ne figure plus dans la liste. Les journaux n'affichent que la sortie de deux workers :

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