Résoudre les problèmes liés à votre tâche de TPU Dataflow

Si vous rencontrez des problèmes lors de l'exécution de votre tâche Dataflow avec des TPU, suivez les étapes de dépannage ci-dessous pour résoudre le problème.

Résoudre les problèmes liés à votre image de conteneur

Il peut être utile de déboguer votre conteneur et votre logiciel TPU sur une VM autonome. Vous pouvez effectuer le débogage avec une VM créée par un pool de nœuds GKE ou sur une VM de nœud de calcul Dataflow en cours d'exécution.

Déboguer à l'aide d'une VM autonome

Pour déboguer votre conteneur sur une VM autonome, vous pouvez créer un pool de nœuds GKE qui utilise la même VM TPU pour les tests locaux. Par exemple, la création d'un pool de nœuds GKE avec un appareil TPU V5 Lite dans us-west1-c se présente comme suit :

  1. créer un cluster GKE ;

    gcloud container clusters create TPU_CLUSTER_NAME \
      --project PROJECT_ID \
      --release-channel=stable \
      --scopes=cloud-platform \
      --enable-ip-alias \
      --location us-west1-c
    
  2. Créez un pool de nœuds GKE.

    gcloud container node-pools create TPU_NODE_POOL_NAME \
      --project PROJECT_ID \
      --location=us-west1-c \
      --cluster=TPU_CLUSTER_NAME \
      --node-locations=us-west1-c \
      --machine-type=ct5lp-hightpu-1t \
      --num-nodes=1 \
      [ --reservation RESERVATION_NAME \
      --reservation-affinity=specific ]
    
  3. Recherchez le nom de la VM du nœud TPU dans le pool de nœuds dans l'interface utilisateur GKE ou à l'aide de la commande suivante.

    gcloud compute instances list --filter='metadata.kube-labels:"cloud.google.com/gke-nodepool=TPU_NODEPOOL_NAME"'
    
  4. Connectez-vous à une VM créée par le pool de nœuds GKE à l'aide de SSH :

    gcloud compute ssh --zone "us-west1-c" "VM_NAME" --project PROJECT_ID
    
  5. Après vous être connecté à une VM à l'aide de SSH, configurez Docker pour le dépôt Artifact Registry que vous utilisez.

    docker-credential-gcr configure-docker --registries=us-west1-docker.pkg.dev
    
  6. Ensuite, démarrez un conteneur à partir de l'image que vous utilisez.

    docker run --privileged --network=host -it --rm --entrypoint=/bin/bash IMAGE_NAME
    
  7. Dans le conteneur, vérifiez que les TPU sont accessibles.

    Par exemple, si vous disposez d'une image qui utilise PyTorch pour exploiter les TPU, ouvrez un interpréteur Python :

    python3
    

    Effectuez ensuite un calcul sur un appareil TPU :

    import torch
    import torch_xla.core.xla_model as xm
    dev = xm.xla_device()
    t1 = torch.randn(3,3,device=dev)
    t2 = torch.randn(3,3,device=dev)
    print(t1 + t2)
    

    Exemple de résultat :

    >>> tensor([[ 0.3355, -1.4628, -3.2610],
    >>>        [-1.4656,  0.3196, -2.8766],
    >>>        [ 0.8667, -1.5060,  0.7125]], device='xla:0')
    
  8. Si le calcul échoue, il est possible que votre image ne soit pas correctement configurée.

    Par exemple, vous devrez peut-être définir les variables d'environnement requises dans le fichier Dockerfile de l'image. Pour confirmer, réessayez le calcul après avoir défini manuellement les variables d'environnement comme suit :

    export TPU_SKIP_MDS_QUERY=1 # Don't query metadata
    export TPU_HOST_BOUNDS=1,1,1 # There's only one host
    export TPU_CHIPS_PER_HOST_BOUNDS=1,1,1 # 1 chips per host
    export TPU_WORKER_HOSTNAMES=localhost
    export TPU_WORKER_ID=0 # Always 0 for single-host TPUs
    export TPU_ACCELERATOR_TYPE=v5litepod-1 # Since we use v5e 1x1 accelerator.
    

    Si des dépendances PyTorch ou LibTPU sont manquantes, vous pouvez réessayer le calcul après les avoir installées à l'aide de la commande suivante :

    # Install PyTorch with TPU support
    pip install torch torch_xla[tpu] torchvision -f https://storage.googleapis.com/libtpu-releases/index.html
    

Déboguer à l'aide d'une VM Dataflow

Vous pouvez également vous connecter à l'instance de VM du nœud de calcul Dataflow à l'aide de SSH pendant l'exécution d'un job. Étant donné que les VM de nœud de calcul Dataflow s'arrêtent une fois le pipeline terminé, vous devrez peut-être augmenter artificiellement la durée d'exécution en effectuant un calcul qui attend pendant une longue période.

Étant donné qu'un appareil TPU ne peut pas être partagé entre plusieurs processus, vous devrez peut-être exécuter un pipeline qui n'effectue aucun calcul sur un TPU.

  1. Recherchez une VM pour le job TPU en cours d'exécution en recherchant l'ID du job Dataflow dans la barre de recherche de la console Google Cloud ou en utilisant la commande gcloud suivante :

    gcloud compute instances list --project PROJECT_ID --filter "STATUS='RUNNING' AND description ~ 'Created for Dataflow job: JOB_ID'"
    
  2. Après vous être connecté à une VM avec des TPU à l'aide de SSH, démarrez un conteneur à partir de l'image que vous utilisez. Pour obtenir un exemple, consultez Déboguer à l'aide d'une VM autonome.

  3. Dans le conteneur, reconfigurez les paramètres TPU et installez les bibliothèques nécessaires pour tester votre configuration. Pour obtenir un exemple, consultez Déboguer à l'aide d'une VM autonome.

Les nœuds de calcul ne démarrent pas

Avant de résoudre le problème, vérifiez que les options de pipeline suivantes sont correctement définies :

  • l'option --dataflow_service_option=worker_accelerator
  • l'option --worker_zone
  • l'option --machine_type

Vérifiez si les journaux de la console indiquent que les nœuds de calcul démarrent, mais que le job échoue avec un message semblable à ce qui suit :

  Workflow failed. Causes: The Dataflow job appears to be stuck because no worker
  activity has been seen in the last 25m.

Ces problèmes peuvent être liés à des problèmes de capacité ou de démarrage des nœuds de calcul.

  • Capacité : si vous utilisez une capacité TPU à la demande ou une réservation épuisée, il est possible que les nouveaux pipelines ne démarrent pas tant que la capacité n'est pas disponible. Si vous utilisez une réservation, vérifiez sa capacité restante sur la page Réservations Compute de la consoleGoogle Cloud ou à l'aide de la commande suivante :

    gcloud compute reservations describe RESERVATION_NAME --zone ZONE
    

    Vérifiez si votre job a démarré des VM de nœud de calcul. Lorsque votre job démarre un worker, les journaux tels que worker, worker_startup, kubelet et d'autres fournissent généralement des résultats. De plus, sur la page Métriques du job de la console Google Cloud , le nombre de nœuds de calcul actuels doit être supérieur à zéro.

  • Démarrage du nœud de calcul : consultez les journaux job-message et launcher. Si votre pipeline démarre des nœuds de calcul, mais qu'ils ne peuvent pas démarrer, vous avez peut-être des erreurs dans votre conteneur personnalisé.

  • Espace disque : vérifiez que votre job dispose de suffisamment d'espace disque. Pour augmenter l'espace disque, utilisez l'option --disk_size_gb.

La tâche échoue avec une erreur

Suivez les conseils de dépannage ci-dessous lorsque votre job échoue et génère une erreur.

Échec du démarrage du pool de nœuds de calcul

Si vous voyez l'erreur suivante, vérifiez que votre pipeline spécifie --worker_zone et que la zone correspond à celle de votre réservation.

JOB_MESSAGE_ERROR: Startup of the worker pool in zone ZONE failed to
bring up any of the desired 1 workers. [...] INVALID_FIELD_VALUE:
Instance 'INSTANCE_NAME' creation failed: Invalid value for field
'resource.reservationAffinity': '{ "consumeReservationType":
"SPECIFIC_ALLOCATION", "key":
"compute.googleapis.com/RESERVATION_NAME...'. Specified reservations
[RESERVATION_NAME] do not exist.

Les groupes d'instances gérés ne sont pas compatibles avec les Cloud TPU

Si l'erreur suivante s'affiche, contactez votre équipe chargée du compte pour vérifier si votre projet a été enregistré pour utiliser des TPU ou signalez un bug à l'aide de l'outil de suivi des problèmes Google.

apache_beam.runners.dataflow.dataflow_runner.DataflowRuntimeException: Dataflow
pipeline failed. State: FAILED, Error: Workflow failed. Causes: One or more
operations had an error [...]: [INVALID_FIELD_VALUE] 'Invalid value
for field 'resource.instanceTemplate': Managed Instance Groups do not support
Cloud TPUs. '.

Valeur incorrecte pour le champ

Si l'erreur suivante s'affiche, vérifiez que l'appel de votre pipeline définit l'option de service Dataflow worker_accelerator.

JOB_MESSAGE_ERROR: Workflow failed. Causes: One or more operations had an error:
'operation-[...]': [INVALID_FIELD_VALUE] 'Invalid value for field
'resource.instanceTemplate': 'projects/[...]-harness'. Regional
Managed Instance Groups do not support Cloud TPUs.'

Périphérique ou ressource occupé

Si l'erreur suivante s'affiche, cela signifie qu'un nœud de calcul Dataflow traitant votre pipeline exécute probablement plusieurs processus qui accèdent au TPU en même temps. Cette fonctionnalité n'est pas disponible. Pour en savoir plus, consultez TPU et parallélisme des nœuds de calcul.

RuntimeError: TPU initialization failed: open(/dev/vfio/0): Device or resource
busy: Device or resource busy; Couldn't open iommu group /dev/vfio/0

Si l'erreur précédente s'affiche lors du débogage de votre pipeline sur une VM, vous pouvez inspecter et arrêter le processus qui bloque la TPU à l'aide des commandes suivantes :

apt update ; apt install lsof
lsof -w /dev/vfio/0
kill -9 PROCESS_ID    # to terminate the process.

Les instances avec des accélérateurs invités ne sont pas compatibles avec la migration à chaud.

Si l'erreur suivante s'affiche, cela signifie probablement que le pipeline a été lancé avec un type de machine défini de manière explicite et comportant des accélérateurs, mais que la configuration des accélérateurs n'a pas été spécifiée correctement. Vérifiez que l'appel de votre pipeline définit l'option de service Dataflow worker_accelerator et assurez-vous que le nom de l'option ne contient pas de fautes de frappe.

JOB_MESSAGE_ERROR: Startup of the worker pool in zone ZONE failed to
bring up any of the desired 1 workers. [...] UNSUPPORTED_OPERATION:
Instance INSTANCE_ID creation failed: Instances with guest
accelerators do not support live migration.

Le workflow a été automatiquement refusé par le service.

Les erreurs suivantes peuvent également s'afficher si certaines options de pipeline requises sont manquantes ou incorrectes :

The workflow was automatically rejected by the service. The requested
accelerator type tpu-v5-lite-podslice;topology:1x1 requires setting
the worker machine type to ct5lp-hightpu-1t. Learn more at:
https://cloud.google.com/dataflow/docs/guides/configure-worker-vm

Délai d'attente dépassé lors de la mise à jour du nœud de calcul

Si vous lancez des pipelines sur des VM TPU avec beaucoup de vCPU et que vous ne réduisez pas le nombre par défaut de threads de nœud de calcul, le job peut rencontrer des erreurs telles que les suivantes :

Workflow failed. Causes WORK_ITEM failed.
The job failed because a work item has failed 4 times.
Root cause: Timed out waiting for an update from the worker.

Pour éviter cette erreur, réduisez le nombre de threads. Par exemple, vous pouvez définir : --number_of_worker_harness_threads=50.

Aucune utilisation de TPU

Si votre pipeline s'exécute correctement, mais que les appareils TPU ne sont pas utilisés ou ne sont pas accessibles, vérifiez que les frameworks que vous utilisez, tels que JAX ou PyTorch, peuvent accéder aux appareils associés. Pour résoudre les problèmes liés à votre image de conteneur sur une seule VM, consultez Déboguer à l'aide d'une VM autonome.