Tous les produits
Search
Centre de documentation

Container Service for Kubernetes:Entraînement distribué DeepSpeed

Dernière mise à jour :Aug 11, 2026

Exécutez des tâches d'entraînement distribué DeepSpeed avec Arena et visualisez les résultats à l'aide de TensorBoard.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

Fonctionnement

Une tâche DeepSpeed dans ACK s'exécute selon une topologie launcher-worker :

  • Le nœud Launcher coordonne l'exécution de l'entraînement distribué. Ce nœud n'utilise pas de GPU.

  • Les nœuds Worker exécutent l'entraînement proprement dit. Chaque worker reçoit un ou plusieurs GPU et exécute le script d'entraînement DeepSpeed.

Étant donné que la communication entre les nœuds utilise SSH, toutes les images doivent avoir OpenSSH installé.

Important

L'accès aux tâches d'entraînement se fait exclusivement via SSH sans mot de passe. Protégez les Secrets Kubernetes dans les environnements de production.

Exemple de configuration

Ce guide utilise un exemple qui entraîne un modèle de langage masqué. Le code source et le jeu de données provenant de microsoft/DeepSpeedExamples sont préemballés dans l'image registry.cn-beijing.aliyuncs.com/acs/deepspeed:hello-deepspeed. L'exemple utilise un PVC nommé training-data (adossé à un volume NAS partagé) pour stocker les résultats de l'entraînement.

Utiliser une image personnalisée

Pour utiliser votre propre code d'entraînement, choisissez l'une des approches suivantes :

  • Générer à partir de l'image de base DeepSpeed ACK :

    registry.cn-beijing.aliyuncs.com/acs/deepspeed:v072_base
  • Générer à partir de votre propre image de base : Suivez le Dockerfile et installez OpenSSH dans l'image.

Synchroniser le code depuis un dépôt Git privé

Transmettez les options --sync-mode=git et --sync-source pour extraire le code d'entraînement au moment de l'exécution. Arena utilise git-sync pour synchroniser le dépôt. Définissez les identifiants à l'aide des variables d'environnement GIT_SYNC_USERNAME et GIT_SYNC_PASSWORD.

Soumettre et surveiller une tâche DeepSpeed

Étape 1 : Vérifier les ressources GPU disponibles

arena top node

Résultat attendu :

NAME                       IPADDRESS      ROLE    STATUS  GPU(Total)  GPU(Allocated)
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   0           0
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   0           0
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   1           0
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   1           0
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   1           0
---------------------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
0/3 (0.0%)

Trois nœuds accélérés par GPU sont disponibles.

Étape 2 : Soumettre la tâche DeepSpeed

La commande suivante soumet une tâche nommée deepspeed-helloworld avec un nœud Launcher et trois nœuds worker, chacun utilisant un GPU :

arena submit deepspeedjob \
    --name=deepspeed-helloworld \
    --gpus=1 \
    --workers=3 \
    --image=registry.cn-beijing.aliyuncs.com/acs/deepspeed:hello-deepspeed \
    --data=training-data:/data \
    --tensorboard \
    --logdir=/data/deepspeed_data \
    "deepspeed /workspace/DeepSpeedExamples/HelloDeepSpeed/train_bert_ds.py --checkpoint_dir /data/deepspeed_data"

Paramètres

Paramètre Obligatoire Description Valeur par défaut
--name Oui Nom de la tâche, unique à l'échelle globale —
--image Oui Image de conteneur pour l'environnement d'exécution —
--gpus Non Nombre de GPU alloués à chaque nœud worker 0
--workers Non Nombre de nœuds worker 1
--data Non Monte un PVC dans l'environnement d'exécution. Format : <pvc-name>:<mount-path>. Exécutez arena data list pour afficher les PVC disponibles. —
--tensorboard Non Active un service TensorBoard. Doit être utilisé conjointement avec --logdir. —
--logdir Non Chemin d'accès depuis lequel TensorBoard lit les fichiers d'événements. Doit être utilisé conjointement avec --tensorboard. /training_logs

Pour synchroniser le code depuis un dépôt Git privé au lieu de l'empaqueter dans l'image, ajoutez les options suivantes :

arena submit deepspeedjob \
    ...
    --sync-mode=git \
    --sync-source=<private-git-repo-url> \
    --env=GIT_SYNC_USERNAME=<username> \
    --env=GIT_SYNC_PASSWORD=<password> \
    "deepspeed /workspace/DeepSpeedExamples/HelloDeepSpeed/train_bert_ds.py --checkpoint_dir /data/deepspeed_data"

Résultat attendu après la soumission :

trainingjob.kai.alibabacloud.com/deepspeed-helloworld created
INFO[0007] The Job deepspeed-helloworld has been submitted successfully
INFO[0007] You can run `arena get deepspeed-helloworld --type deepspeedjob` to check the job status

Étape 3 : Vérifier que la tâche est en cours d'exécution

Listez toutes les tâches d'entraînement Arena :

arena list

Résultat attendu :

NAME                  STATUS   TRAINER         DURATION  GPU(Requested)  GPU(Allocated)  NODE
deepspeed-helloworld  RUNNING  DEEPSPEEDJOB    3m        3               3               192.168.9.69

Consultez l'utilisation des GPU par tâche :

arena top job

Résultat attendu :

NAME                  STATUS   TRAINER         AGE  GPU(Requested)  GPU(Allocated)  NODE
deepspeed-helloworld  RUNNING  DEEPSPEEDJOB    4m   3               3               192.168.9.69

Total Allocated/Requested GPUs of Training Jobs: 3/3

Consultez l'utilisation des GPU à l'échelle du cluster :

arena top node

Résultat attendu :

NAME                       IPADDRESS      ROLE    STATUS  GPU(Total)  GPU(Allocated)
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   0           0
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   0           0
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   1           1
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   1           1
cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   1           1
---------------------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
3/3 (100%)

Étape 4 : Obtenir les détails de la tâche et l'URL TensorBoard

arena get deepspeed-helloworld

Résultat attendu :

Name:      deepspeed-helloworld
Status:    RUNNING
Namespace: default
Priority:  N/A
Trainer:   DEEPSPEEDJOB
Duration:  6m

Instances:
  NAME                           STATUS   AGE  IS_CHIEF  GPU(Requested)  NODE
  ----                           ------   ---  --------  --------------  ----
  deepspeed-helloworld-launcher  Running  6m   true      0               cn-beijing.192.1xx.x.x
  deepspeed-helloworld-worker-0  Running  6m   false     1               cn-beijing.192.1xx.x.x
  deepspeed-helloworld-worker-1  Running  6m   false     1               cn-beijing.192.1xx.x.x
  deepspeed-helloworld-worker-2  Running  6m   false     1               cn-beijing.192.1xx.x.x

Your tensorboard will be available on:
http://192.1xx.x.xx:31870

Les deux dernières lignes n'apparaissent que si TensorBoard est activé.

Étape 5 : Afficher les résultats de l'entraînement dans TensorBoard

  1. Redirigez le service TensorBoard vers un port local :

    kubectl port-forward svc/deepspeed-helloworld-tensorboard 9090:6006
  2. Ouvrez localhost:9090 dans un navigateur.

    TensorBoard training results

Étape 6 : Consulter les journaux d'entraînement

Affichez tous les journaux de la tâche :

arena logs deepspeed-helloworld

Résultat attendu :

deepspeed-helloworld-worker-0: [2023-03-31 08:38:11,201] [INFO] [logging.py:68:log_dist] [Rank 0] step=7050, skipped=24, lr=[0.0001], mom=[(0.9, 0.999)]
deepspeed-helloworld-worker-0: [2023-03-31 08:38:11,254] [INFO] [timer.py:198:stop] 0/7050, RunningAvgSamplesPerSec=142.69733028759384, CurrSamplesPerSec=136.08094834473613, MemAllocated=0.06GB, MaxMemAllocated=1.68GB
deepspeed-helloworld-worker-0: 2023-03-31 08:38:11.255 | INFO     | __main__:log_dist:53 - [Rank 0] Loss: 6.7574
deepspeed-helloworld-worker-0: [2023-03-31 08:38:13,103] [INFO] [logging.py:68:log_dist] [Rank 0] step=7060, skipped=24, lr=[0.0001], mom=[(0.9, 0.999)]
deepspeed-helloworld-worker-0: [2023-03-31 08:38:13,134] [INFO] [timer.py:198:stop] 0/7060, RunningAvgSamplesPerSec=142.69095076844823, CurrSamplesPerSec=151.8552037291255, MemAllocated=0.06GB, MaxMemAllocated=1.68GB
deepspeed-helloworld-worker-0: 2023-03-31 08:38:13.136 | INFO     | __main__:log_dist:53 - [Rank 0] Loss: 6.7570
deepspeed-helloworld-worker-0: [2023-03-31 08:38:14,924] [INFO] [logging.py:68:log_dist] [Rank 0] step=7070, skipped=24, lr=[0.0001], mom=[(0.9, 0.999)]
deepspeed-helloworld-worker-0: [2023-03-31 08:38:14,962] [INFO] [timer.py:198:stop] 0/7070, RunningAvgSamplesPerSec=142.69048436022115, CurrSamplesPerSec=152.91029839772997, MemAllocated=0.06GB, MaxMemAllocated=1.68GB
deepspeed-helloworld-worker-0: 2023-03-31 08:38:14.963 | INFO     | __main__:log_dist:53 - [Rank 0] Loss: 6.7565

Pour diffuser les journaux en temps réel, utilisez l'option -f. Pour afficher uniquement les N dernières lignes, utilisez l'option -t N :

# Stream logs in real time
arena logs deepspeed-helloworld -f

# Print the last 5 lines
arena logs deepspeed-helloworld -t 5

Résultat attendu pour l'option -t 5 :

deepspeed-helloworld-worker-0: [2023-03-31 08:47:08,694] [INFO] [launch.py:318:main] Process 80 exits successfully.
deepspeed-helloworld-worker-2: [2023-03-31 08:47:08,731] [INFO] [launch.py:318:main] Process 44 exits successfully.
deepspeed-helloworld-worker-1: [2023-03-31 08:47:08,946] [INFO] [launch.py:318:main] Process 44 exits successfully.
/opt/conda/lib/python3.8/site-packages/apex/pyprof/__init__.py:5: FutureWarning: pyprof will be removed by the end of June, 2022
  warnings.warn("pyprof will be removed by the end of June, 2022", FutureWarning)

Exécutez arena logs --help pour voir toutes les options de journalisation disponibles.