Arena est un outil en ligne de commande destiné à la gestion des charges de travail de machine learning sur Kubernetes. Ce guide explique comment soumettre une tâche d'entraînement PyTorch autonome sur un cluster Container Service for Kubernetes (ACK), en utilisant soit un seul GPU, soit plusieurs GPU sur un même nœud, et comment visualiser la progression de l'entraînement avec TensorBoard.
À l'issue de ce guide, vous aurez :
Vérifié la disponibilité des GPU dans votre cluster
Soumis une tâche d'entraînement PyTorch à l'aide de
arena submit pytorchSurveillé le statut de la tâche et l'utilisation des GPU
Accédé à TensorBoard pour visualiser les résultats de l'entraînement
Consulté les journaux d'entraînement
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un cluster ACK avec des nœuds accélérés par GPU. Pour les instructions de configuration, consultez Créer un cluster ACK contenant des nœuds accélérés par GPU
L'accès Internet activé pour les nœuds du cluster. Consultez Activer l'accès Internet pour un cluster ACK existant
Le composant Arena installé et configuré. Consultez Configurer le client Arena
Une revendication de volume persistant (PVC) nommée
training-datacontenant le jeu de données MNIST stocké à l'emplacement/pytorch_data. Consultez Configurer un volume NAS partagé
Fonctionnement de torchrun et git-sync dans ce guide
Ce guide utilise torchrun, le lanceur intégré de PyTorch pour l'entraînement sur un nœud unique. Il gère le lancement des processus et l'initialisation distribuée, vous offrant ainsi le même flux de travail, que vous utilisiez un seul GPU ou plusieurs GPU sur le même nœud.
Le code d'entraînement est extrait d'un dépôt Git distant à l'aide de git-sync. Les données d'entraînement sont lues depuis un volume File Storage NAS (NAS) partagé, monté via un volume persistant (PV) et une PVC. L'exemple s'appuie sur le fichier main.py issu du dépôt Arena.
GPU unique ou multiples : Utilisez un seul GPU pour les modèles standards qui tiennent dans la mémoire d'un GPU. Optez pour plusieurs GPU sur un même nœud lorsque votre modèle ou la taille de lot dépasse la capacité mémoire d'un seul GPU, ou si vous souhaitez accélérer l'entraînement grâce au parallélisme des données. Basculez d'une configuration à l'autre en ajustant les paramètres --gpus et --nproc-per-node.
Étape 1 : Vérifier la disponibilité des GPU
Exécutez la commande suivante pour connaître le nombre de GPU disponibles dans le cluster :
arena top node
Résultat attendu :
NAME IPADDRESS ROLE STATUS GPU(Total) GPU(Allocated)
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 0 0
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 0 0
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 2 0
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 2 0
---------------------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
0/4 (0.0%)
La sortie indique deux nœuds accélérés par GPU, chacun disposant de deux GPU inactifs, soit quatre GPU au total disponibles pour l'entraînement.
Étape 2 : Soumettre une tâche d'entraînement PyTorch
Tâche sur GPU unique
Exécutez la commande suivante pour soumettre une tâche d'entraînement PyTorch autonome utilisant un seul GPU :
arena submit pytorch \
--name=pytorch-mnist \
--namespace=default \
--workers=1 \
--gpus=1 \
--working-dir=/root \
--image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/pytorch-with-tensorboard:2.5.1-cuda12.4-cudnn9-runtime \
--sync-mode=git \
--sync-source=https://github.com/kubeflow/arena.git \
--env=GIT_SYNC_BRANCH=v0.13.1 \
--data=training-data:/mnt \
--tensorboard \
--logdir=/mnt/pytorch_data/logs \
"torchrun /root/code/arena/examples/pytorch/mnist/main.py --epochs 10 --backend nccl --data /mnt/pytorch_data --dir /mnt/pytorch_data/logs"
Résultat attendu :
service/pytorch-mnist-tensorboard created
deployment.apps/pytorch-mnist-tensorboard created
pytorchjob.kubeflow.org/pytorch-mnist created
INFO[0002] The Job pytorch-mnist has been submitted successfully
INFO[0002] You can run `arena get pytorch-mnist --type pytorchjob -n default` to check the job status
Tâche multi-GPU
Pour utiliser deux GPU sur le même nœud, définissez --gpus=2 et --nproc-per-node=2. torchrun lance alors deux processus d'entraînement, un par GPU :
arena submit pytorch \
--name=pytorch-mnist \
--namespace=default \
--workers=1 \
--gpus=2 \
--nproc-per-node=2 \
--working-dir=/root \
--image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/pytorch-with-tensorboard:2.5.1-cuda12.4-cudnn9-runtime \
--sync-mode=git \
--sync-source=https://github.com/kubeflow/arena.git \
--env=GIT_SYNC_BRANCH=v0.13.1 \
--data=training-data:/mnt \
--tensorboard \
--logdir=/mnt/pytorch_data/logs \
"torchrun /root/code/arena/examples/pytorch/mnist/main.py --epochs 10 --backend nccl --data /mnt/pytorch_data --dir /mnt/pytorch_data/logs"
Paramètres
| Paramètre | Obligatoire | Description | Par défaut |
|---|---|---|---|
--name |
Oui | Nom de la tâche. Doit être unique dans le cluster. | Sans objet |
--namespace |
Non | Namespace Kubernetes | default |
--workers |
Non | Nombre de nœuds de calcul. Le nœud maître est inclus — une valeur de 1 signifie que la tâche s'exécute uniquement sur le nœud maître. |
1 |
--gpus |
Non | Nombre de GPU alloués à chaque nœud de calcul | 0 |
--nproc-per-node |
Non | Nombre de processus d'entraînement par nœud. Définissez cette valeur égale à --gpus pour obtenir un processus par GPU. |
Sans objet |
--working-dir |
Non | Répertoire dans lequel la commande d'entraînement s'exécute | /root |
--image |
Oui | Image de conteneur utilisée pour exécuter la tâche d'entraînement | Sans objet |
--sync-mode |
Non | Mode de synchronisation du code source. Valeurs valides : git, rsync. |
Sans objet |
--sync-source |
Non | URL du dépôt pour la synchronisation du code source. Utilisé conjointement avec --sync-mode. Le code est téléchargé dans le répertoire code/ situé sous --working-dir. |
Sans objet |
--data |
Non | Monte une PVC dans le conteneur d'entraînement. Format : <pvc-name>:<mount-path>. Exécutez arena data list pour afficher les PVC disponibles. |
Sans objet |
--tensorboard |
Non | Active TensorBoard pour la visualisation des résultats d'entraînement. Requiert le paramètre --logdir. |
Sans objet |
--logdir |
Non | Chemin où TensorBoard lit les fichiers d'événements. | /training_logs |
Utilisation d'un dépôt Git privé
Si votre dépôt nécessite une authentification, transmettez les identifiants via les variables d'environnement git-sync :
arena submit pytorch \
...
--sync-mode=git \
--sync-source=https://github.com/kubeflow/arena.git \
--env=GIT_SYNC_BRANCH=v0.13.1 \
--env=GIT_SYNC_USERNAME=<username> \
--env=GIT_SYNC_PASSWORD=<password> \
"torchrun /root/code/arena/examples/pytorch/mnist/main.py --epochs 10 --backend nccl --data /mnt/pytorch_data --dir /mnt/pytorch_data/logs"
Toutes les variables d'environnement prises en charge par git-sync peuvent être transmises de cette manière. Consultez la documentation git-sync pour la liste complète.
Si le dépôt GitHub est inaccessible
Si le code ne peut pas être extrait de GitHub en raison de problèmes réseau, téléchargez-le manuellement sur votre volume NAS à l'emplacement /code/github.com/kubeflow/arena. Soumettez ensuite la tâche sans spécifier --sync-mode :
arena submit pytorch \
--name=pytorch-mnist \
--namespace=default \
--workers=1 \
--gpus=1 \
--working-dir=/root \
--image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/pytorch-with-tensorboard:2.5.1-cuda12.4-cudnn9-runtime \
--data=training-data:/mnt \
--tensorboard \
--logdir=/mnt/pytorch_data/logs \
"torchrun /mnt/code/github.com/kubeflow/arena/examples/pytorch/mnist/main.py --epochs 10 --backend nccl --data /mnt/pytorch_data --dir /mnt/pytorch_data/logs"
Étape 3 : Surveiller la tâche d'entraînement
Répertorier les tâches
Exécutez la commande suivante pour lister toutes les tâches Arena dans le namespace :
arena list -n default
Résultat attendu :
NAME STATUS TRAINER DURATION GPU(Requested) GPU(Allocated) NODE
pytorch-mnist RUNNING PYTORCHJOB 11s 1 1 192.168.xxx.xxx
Vérifier l'utilisation des GPU
Exécutez la commande suivante pour afficher l'allocation des GPU pour les tâches en cours d'exécution :
arena top job -n default
Résultat attendu :
NAME STATUS TRAINER AGE GPU(Requested) GPU(Allocated) NODE
pytorch-mnist RUNNING PYTORCHJOB 18s 1 1 192.168.xxx.xxx
Total Allocated/Requested GPUs of Training Jobs: 1/1
Exécutez la commande suivante pour visualiser l'utilisation des GPU sur tous les nœuds du cluster :
arena top node
Résultat attendu :
NAME IPADDRESS ROLE STATUS GPU(Total) GPU(Allocated)
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 0 0
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 0 0
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 2 1
cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 2 0
---------------------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
1/4 (25.0%)
Un GPU est désormais alloué.
Afficher les détails de la tâche
Exécutez la commande suivante pour afficher les détails complets de la tâche, y compris l'URL TensorBoard :
arena get pytorch-mnist -n default
Résultat attendu :
Name: pytorch-mnist
Status: RUNNING
Namespace: default
Priority: N/A
Trainer: PYTORCHJOB
Duration: 45s
CreateTime: 2025-02-12 11:20:10
EndTime:
Instances:
NAME STATUS AGE IS_CHIEF GPU(Requested) NODE
---- ------ --- -------- -------------- ----
pytorch-mnist-master-0 Running 45s true 1 cn-beijing.192.168.xxx.xxx
Tensorboard:
Your tensorboard will be available on:
http://192.168.xxx.xxx:31949
L'URL TensorBoard apparaît dans les détails de la tâche uniquement si le paramètre --tensorboard a été spécifié lors de la soumission de la tâche.
Étape 4 : Accéder à TensorBoard
-
Sur votre machine locale, redirigez le port 6006 du service TensorBoard vers le port local 9090 :
ImportantLa commande
kubectl port-forwardest destinée uniquement au développement et au débogage. Elle n'est ni fiable, ni sécurisée, ni évolutive pour un usage en production. Pour des solutions de mise en réseau adaptées à la production dans les clusters ACK, consultez la section Gestion Ingress.kubectl port-forward -n default svc/pytorch-mnist-tensorboard 9090:6006 -
Ouvrez <http://127.0.0.1:9090> dans un navigateur web pour accéder à TensorBoard.
RemarqueLe code d'entraînement écrit les résultats dans des fichiers d'événements toutes les 10 époques. Si vous modifiez le paramètre
--epochs, définissez-le comme un multiple de 10 ; sinon, TensorBoard n'affichera aucun résultat d'entraînement.
Étape 5 : Consulter les journaux d'entraînement
Exécutez la commande suivante pour afficher les journaux d'entraînement :
arena logs pytorch-mnist -n default
Résultat attendu :
Train Epoch: 10 [55680/60000 (93%)] Loss: 0.025778
Train Epoch: 10 [56320/60000 (94%)] Loss: 0.086488
Train Epoch: 10 [56960/60000 (95%)] Loss: 0.003240
Train Epoch: 10 [57600/60000 (96%)] Loss: 0.046731
Train Epoch: 10 [58240/60000 (97%)] Loss: 0.010752
Train Epoch: 10 [58880/60000 (98%)] Loss: 0.010934
Train Epoch: 10 [59520/60000 (99%)] Loss: 0.065813
Accuracy: 9921/10000 (99.21%)
Pour diffuser les journaux en temps réel, ajoutez l'option -f. Pour afficher uniquement les N dernières lignes, utilisez -t N ou --tail N. Pour consulter toutes les options disponibles, exécutez arena logs --help.
(Facultatif) Étape 6 : Nettoyer les ressources
Pour supprimer la tâche d'entraînement et libérer les ressources GPU :
arena delete pytorch-mnist -n default
Résultat attendu :
INFO[0001] The training job pytorch-mnist has been deleted successfully