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