Soumettez une tâche d'entraînement distribué TensorFlow en mode PS-Worker et suivez sa progression avec TensorBoard.
Prérequis
Vérifiez que vous disposez des éléments suivants :
Un cluster Kubernetes avec des nœuds GPU est créé.
Les nœuds du cluster disposent d'un accès au réseau public.
Le client Arena est installé.
Une revendication de volume persistant (PVC) nommée
training-datacontient le jeu de données MNIST soustf_data. Consultez la rubrique Configurer un stockage NAS partagé.
Étape 1 : Vérifier les ressources GPU disponibles
Consultez la disponibilité des GPU sur tous les nœuds :
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%)
Le cluster dispose de deux nœuds GPU, chacun offrant deux GPU inactifs.
Étape 2 : Soumettre une tâche d'entraînement distribué TensorFlow
Le format de la commande est arena submit tfjob/tf [--flag] command.
Paramètres requis pour le mode PS-Worker :
--name: nom unique de la tâche--ps: nombre de nœuds de serveur de paramètres (PS)--workers: nombre de nœuds de travail (worker)--ps-image: image du nœud PS (ou--imagesi l'image est partagée)--worker-image: image du nœud worker (ou--imagesi l'image est partagée)--gpus: nombre de GPU par worker (requis pour les charges de travail GPU)
Soumettez une tâche d'entraînement distribué avec un nœud PS et deux nœuds worker :
arena submit tf \
--name=tf-mnist-dist \
--namespace=default \
--working-dir=/root \
--ps=1 \
--ps-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
--workers=2 \
--worker-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
--gpus=1 \
--sync-mode=git \
--sync-source=https://github.com/kubeflow/arena.git \
--env=GIT_SYNC_BRANCH=master \
--data=training-data:/mnt \
--tensorboard \
--logdir=/mnt/tf_data/logs \
"python /root/code/arena/examples/tensorflow/mnist/main.py --data /mnt/tf_data/mnist.npz --dir /mnt/tf_data/logs"
Résultat attendu :
service/tf-mnist-dist-tensorboard created
deployment.apps/tf-mnist-dist-tensorboard created
tfjob.kubeflow.org/tf-mnist-dist created
INFO[0004] The Job tf-mnist-dist has been submitted successfully
INFO[0004] You can run `arena get tf-mnist-dist --type tfjob -n default` to check the job status
Le tableau ci-dessous répertorie les principaux paramètres. Pour obtenir la liste complète des options, exécutez arena submit tf --help.
| Paramètre | Obligatoire | Description | Valeur par défaut |
|---|---|---|---|
--name |
Oui | Nom unique de la tâche au sein du cluster. | Aucune |
--working-dir |
Non | Répertoire de travail pour la commande d'entraînement. Le code synchronisé est placé sous code/. |
/root |
--gpus |
Non | Nombre de GPU alloués par nœud worker. | 0 |
--workers |
Non | Nombre de nœuds worker. | 1 |
--image |
Requis sauf si --worker-image et --ps-image sont définis |
Image de conteneur pour les nœuds worker et PS. Elle est remplacée par --worker-image ou --ps-image. |
Aucune |
--worker-image |
Requis sauf si --image est défini |
Image du nœud worker. Elle a priorité sur --image. |
Aucune |
--ps |
Oui (tâches distribuées) | Nombre de nœuds PS. | 0 |
--ps-image |
Requis sauf si --image est défini |
Image du nœud PS. Elle a priorité sur --image. |
Aucune |
--sync-mode |
Non | Mode de synchronisation : git ou rsync. |
Aucune |
--sync-source |
Non | URL du dépôt source. À utiliser avec --sync-mode. Le code est téléchargé dans code/ sous --working-dir. |
Aucune |
--data |
Non | Monte un PVC. Format : <pvc-name>:<mount-path>. Exécutez arena data list pour afficher les PVC disponibles. |
Aucune |
--tensorboard |
Non | Active TensorBoard. Utilisez --logdir pour définir le chemin des données d'événement. |
Aucune |
--logdir |
Non | Chemin des données d'événement TensorBoard. À utiliser avec --tensorboard. |
/training_logs |
Utilisation d'un dépôt Git privé
Arena utilise git-sync pour extraire le code source. Pour les dépôts privés, transmettez les identifiants sous forme de variables d'environnement :
arena submit tf \
--name=tf-mnist-dist \
--namespace=default \
--working-dir=/root \
--ps=1 \
--ps-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
--workers=2 \
--worker-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
--gpus=1 \
--sync-mode=git \
--sync-source=https://github.com/kubeflow/arena.git \
--env=GIT_SYNC_BRANCH=master \
--env=GIT_SYNC_USERNAME=<your-username> \
--env=GIT_SYNC_PASSWORD=<your-password> \
--data=training-data:/mnt \
--tensorboard \
--logdir=/mnt/tf_data/logs \
"python /root/code/arena/examples/tensorflow/mnist/main.py --data /mnt/tf_data/mnist.npz --dir /mnt/tf_data/logs"
Définissez n'importe quelle variable d'environnement issue du projet git-sync à l'aide de --env.
Si l'extraction depuis GitHub échoue en raison de problèmes réseau, l'image de démonstration contient le code à l'emplacement /code/github.com/kubeflow/arena/examples/tensorflow/mnist/main.py. Soumettez la tâche sans --sync-mode ni --sync-source :
arena submit tf \
--name=tf-mnist-dist \
--namespace=default \
--working-dir=/root \
--ps=1 \
--ps-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
--workers=2 \
--worker-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
--gpus=1 \
--data=training-data:/mnt \
--tensorboard \
--logdir=/mnt/tf_data/logs \
"python /code/github.com/kubeflow/arena/examples/tensorflow/mnist/main.py --data /mnt/tf_data/mnist.npz --dir /mnt/tf_data/logs"
Étape 3 : Surveiller la tâche d'entraînement
Répertoriez toutes les tâches soumises :
arena list
Résultat attendu :
NAME STATUS TRAINER AGE NODE
tf-dist RUNNING TFJOB 58s 192.1xx.x.xx
Vérifiez les détails de la tâche :
arena get -n default tf-mnist-dist
Résultat attendu :
STATUS: RUNNING
NAMESPACE: default
PRIORITY: N/A
TRAINING DURATION: 1m
NAME STATUS TRAINER AGE INSTANCE NODE
tf-dist RUNNING TFJOB 1m tf-dist-ps-0 192.1xx.x.xx
tf-dist RUNNING TFJOB 1m tf-dist-worker-0 192.1xx.x.xx
tf-dist RUNNING TFJOB 1m tf-dist-worker-1 192.1xx.x.xx
Your tensorboard will be available on:
http://192.1xx.x.xx:31870
Les lignes indiquant le point de terminaison TensorBoard n'apparaissent que si l'option --tensorboard est activée.
Vérifiez l'allocation des GPU par tâche :
arena top job
Résultat attendu :
NAME GPU(Requests) GPU(Allocated) STATUS TRAINER AGE NODE
tf-dist 2 2 RUNNING tfjob 1m 192.1xx.x.x
tf-git 1 0 SUCCEEDED tfjob 2h N/A
Total Allocated GPUs of Training Job:
2
Total Requested GPUs of Training Job:
3
Vérifiez l'allocation des GPU sur tous les nœuds :
arena top node
Résultat attendu :
NAME IPADDRESS ROLE STATUS GPU(Total) GPU(Allocated)
cn-huhehaote.192.1xx.x.xx 192.1xx.x.xx master ready 0 0
cn-huhehaote.192.1xx.x.xx 192.1xx.x.xx master ready 0 0
cn-huhehaote.192.1xx.x.xx 192.1xx.x.xx master ready 0 0
cn-huhehaote.192.1xx.x.xx 192.1xx.x.xx <none> ready 2 1
cn-huhehaote.192.1xx.x.xx 192.1xx.x.xx <none> ready 2 1
cn-huhehaote.192.1xx.x.xx 192.1xx.x.xx <none> ready 2 0
-----------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
2/6 (33%)
Étape 4 : Consulter TensorBoard
La commande kubectl port-forward est réservée au développement et au débogage. Pour la mise en production, utilisez la gestion des ingress.
-
Redirigez TensorBoard vers le port local 9090 :
kubectl port-forward -n default svc/tf-dist-tensorboard 9090:6006 Ouvrez
localhost:9090dans un navigateur.

Étape 5 : Afficher les journaux de la tâche d'entraînement
Par défaut, arena logs diffuse en continu les journaux de worker-0. Pour afficher d'autres instances, répertoriez-les avec arena get et spécifiez-en une avec -i.
Affichez les journaux par défaut (worker-0) :
arena logs -n default tf-dist
Résultat attendu :
WARNING:tensorflow:From code/tensorflow-sample-code/tfjob/docker/mnist/main.py:120: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.
Instructions for updating:
...
Accuracy at step 960: 0.9691
Accuracy at step 970: 0.9677
Accuracy at step 980: 0.9687
Accuracy at step 990: 0.968
Adding run metadata for 999
Total Train-accuracy=0.968
Affichez les journaux d'une instance spécifique :
# Get the instance list
arena get tf-dist
Résultat attendu :
STATUS: SUCCEEDED
NAMESPACE: default
PRIORITY: N/A
TRAINING DURATION: 1m
NAME STATUS TRAINER AGE INSTANCE NODE
tf-dist SUCCEEDED TFJOB 5m tf-dist-ps-0 192.16x.x.xx
tf-dist SUCCEEDED TFJOB 5m tf-dist-worker-0 192.16x.x.xx
tf-dist SUCCEEDED TFJOB 5m tf-dist-worker-1 192.16x.x.xx
Your tensorboard will be available on:
http://192.16x.x.xx:31870
# View logs from a specific worker instance
arena logs tf-dist -i tf-dist-worker-1
Résultat attendu :
WARNING:tensorflow:From code/tensorflow-sample-code/tfjob/docker/mnist/main.py:120: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.
Instructions for updating:
...
Accuracy at step 970: 0.9676
Accuracy at step 980: 0.968
Accuracy at step 990: 0.967
Adding run metadata for 999
Total Train-accuracy=0.967
Autres commandes de journalisation :
| Commande | Description |
|---|---|
arena logs <job> -f |
Diffuse en continu la sortie des journaux en temps réel |
arena logs <job> -t N |
Affiche les N dernières lignes des journaux |
arena logs --help |
Répertorie toutes les options de journalisation |
Affichez les 5 dernières lignes :
arena logs tf-dist -t 5
Résultat attendu :
Accuracy at step 9970: 0.9834
Accuracy at step 9980: 0.9828
Accuracy at step 9990: 0.9816
Adding run metadata for 9999
Total Train-accuracy=0.9816
(Facultatif) Étape 6 : Nettoyer les ressources
Une fois la tâche terminée, supprimez-la pour libérer les ressources :
arena delete -n default tf-mnist-dist
Résultat attendu :
INFO[0002] The training job tf-mnist-dist has been deleted successfully