Résoudre les problèmes liés à la tâche de GPU Dataflow

Si vous rencontrez des problèmes lors de l'exécution de votre tâche Dataflow avec des GPU, procédez comme suit:

  1. Suivez le workflow décrit dans la section Bonnes pratiques pour l'utilisation des GPU Dataflow pour vous assurer que votre pipeline est correctement configuré.
  2. Vérifiez que votre tâche Dataflow utilise des GPU. Consultez la section Vérifier votre tâche Dataflow de la page "Exécuter un pipeline avec des GPU".
  3. Déboguer votre tâche, soit avec une VM autonome, soit à l'aide de Dataflow.
  4. Si le problème persiste, suivez les étapes de dépannage décrites sur cette page.

Déboguer votre tâche

Si possible, déboguez votre tâche avec une VM autonome, car le débogage avec une VM autonome est généralement plus rapide. Toutefois, si les règles de votre organisation vous empêchent de déboguer avec une VM autonome, vous pouvez déboguer à l'aide de Dataflow.

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

Lorsque vous concevez et itérez une image de conteneur adaptée à vos besoins, il peut être plus rapide de réduire la boucle de rétroaction en testant l'image de conteneur sur une VM autonome.

Vous pouvez déboguer votre conteneur personnalisé sur une VM autonome à l'aide de GPU en créant une VM Compute Engine qui exécute des GPU sur Container-Optimized OS, en installant des pilotes et en démarrant votre conteneur comme suit.

  1. Créez une instance de VM.

    gcloud compute instances create INSTANCE_NAME \
      --project "PROJECT" \
      --image-family cos-stable \
      --image-project=cos-cloud  \
      --zone=us-central1-f \
      --accelerator type=nvidia-tesla-t4,count=1 \
      --maintenance-policy TERMINATE \
      --restart-on-failure  \
      --boot-disk-size=200G \
      --scopes=cloud-platform
    
  2. Utilisez ssh pour vous connecter à la VM.

    gcloud compute ssh INSTANCE_NAME --project "PROJECT"
    
  3. Installez les pilotes de GPU. Une fois connecté à la VM à l'aide de ssh, exécutez les commandes suivantes sur la VM :

    # Run these commands on the virtual machine
    cos-extensions install gpu
    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    /var/lib/nvidia/bin/nvidia-smi
    
  4. Lancez votre conteneur personnalisé.

    Les conteneurs du SDK Apache Beam utilisent le point d'entrée /opt/apache/beam/boot. À des fins de débogage, vous pouvez lancer votre conteneur manuellement avec un point d'entrée différent :

    docker-credential-gcr configure-docker
    docker run --rm \
      -it \
      --entrypoint=/bin/bash \
      --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \
      --volume /var/lib/nvidia/bin:/usr/local/nvidia/bin \
      --privileged \
      IMAGE
    

    Remplacez IMAGE par le chemin d'accès à Artifact Registry pour votre image Docker.

  5. Vérifiez que les bibliothèques de GPU installées dans votre conteneur peuvent accéder aux appareils GPU.

    Si vous utilisez TensorFlow, vous pouvez imprimer les informations des appareils disponibles dans l'interpréteur Python à l'aide de la commande suivante :

    >>> import tensorflow as tf
    >>> print(tf.config.list_physical_devices("GPU"))
    

    Si vous utilisez PyTorch, vous pouvez inspecter les appareils disponibles dans l'interpréteur Python à l'aide de la commande suivante :

    >>> import torch
    >>> print(torch.cuda.is_available())
    >>> print(torch.cuda.device_count())
    >>> print(torch.cuda.get_device_name(0))
    

Pour effectuer une itération sur votre pipeline, vous pouvez lancer le pipeline sur Direct Runner. Vous pouvez également lancer des pipelines sur l'exécuteur Dataflow Runner à partir de cet environnement.

Déboguer à l'aide de Dataflow

Si des contraintes organisationnelles vous empêchent de déboguer sur une VM autonome, vous pouvez utiliser Dataflow.

Simplifiez votre pipeline afin qu'il ne serve qu'à détecter si des GPU sont présents, puis exécutez-le sur Dataflow. L'exemple suivant montre à quoi peut ressembler le code de ce pipeline:

def check_if_gpus_present(element):
  import torch
  import tensorflow as tf

  tensorflow_detects_gpus = tf.config.list_physical_devices("GPU")
  torch_detects_gpus = torch.cuda.is_available()
  if tensorflow_detects_gpus and torch_detects_gpus:
    return element

  if tensorflow_detects_gpus:
    raise Exception('PyTorch failed to detect GPUs with your setup')
  if torch_detects_gpus:
    raise Exception('Tensorflow failed to detect GPUs with your setup')
  raise Exception('Both Tensorflow and PyTorch failed to detect GPUs with your setup')

with beam.Pipeline() as p:
  _ = (p | beam.Create([1,2,3]) # Create a PCollection of the prompts.
         | beam.Map(check_if_gpus_present)
  )

Si votre pipeline réussit, votre code peut accéder aux GPU. Pour identifier le code problématique, insérez progressivement des exemples de plus en plus volumineux dans le code de votre pipeline, en exécutant votre pipeline après chaque modification.

Si votre pipeline ne parvient pas à détecter les GPU, suivez les étapes de la section Aucune utilisation de GPU de ce document.

Les nœuds de calcul ne démarrent pas

Si votre tâche est bloquée et que les nœuds de calcul Dataflow ne commencent jamais à traiter les données, le problème est sûrement lié à l'utilisation d'un conteneur personnalisé avec Dataflow. Pour en savoir plus, consultez le guide de dépannage des conteneurs personnalisés.

Si vous êtes un utilisateur Python, vérifiez que les conditions suivantes sont remplies :

  • La version mineure de l'interpréteur Python dans votre image de conteneur est la même que celle utilisée lors du lancement de votre pipeline. En cas d'incohérence, des erreurs telles que SystemError: unknown opcode peuvent s'afficher, avec une trace de pile impliquant apache_beam/internal/pickler.py.
  • Si vous utilisez le SDK Apache Beam 2.29.0 ou une version antérieure, pip doit être accessible sur l'image dans /usr/local/bin/pip.

Nous vous recommandons de réduire les personnalisations à une configuration fonctionnelle minimale lors de la première utilisation d'une image personnalisée. Utilisez les exemples d'images de conteneurs personnalisés fournis dans les exemples de cette page. Assurez-vous de pouvoir exécuter un pipeline Dataflow simple avec cette image de conteneur sans demander de GPU. Ensuite, effectuez une itération sur la solution.

Vérifiez que les nœuds de calcul disposent d'un espace disque suffisant pour télécharger votre image de conteneur. Ajustez la taille du disque si nécessaire. Le téléchargement d'images volumineuses prend plus de temps, ce qui augmente le temps de démarrage des nœuds de calcul.

La tâche échoue immédiatement au démarrage

Si vous rencontrez les erreurs ZONE_RESOURCE_POOL_EXHAUSTED ou ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS, procédez comme suit:

  • Ne spécifiez pas la zone de nœud de calcul et laissez Dataflow sélectionner la zone optimale pour vous.

  • Lancez le pipeline dans une autre zone ou à l'aide d'un autre type d'accélérateur.

La tâche échoue au moment de l'exécution

Si la tâche échoue au moment de l'exécution, vérifiez les éventuelles erreurs de mémoire saturée (OOM, Out Of Memory) sur le nœud de calcul et le GPU. Les erreurs OOM des GPU peuvent se manifester sous la forme d'erreurs cudaErrorMemoryAllocation out of memory dans les journaux des nœuds de calcul. Si vous utilisez TensorFlow, vérifiez que vous n'utilisez qu'un seul processus TensorFlow pour accéder à un appareil GPU. Pour en savoir plus, consultez la section GPU et parallélisme des nœuds de calcul.

Aucune utilisation du GPU

Si votre tâche ne semble pas utiliser de GPU, suivez la procédure décrite dans la section Déboguer votre tâche de ce document pour vérifier si des GPU sont disponibles avec votre image Docker.

Si les GPU sont disponibles, mais qu'ils ne sont pas utilisés, le problème est probablement lié au code du pipeline. Pour déboguer le code du pipeline, commencez par un pipeline simple qui utilise correctement les GPU, puis ajoutez progressivement du code au pipeline, en le testant à chaque ajout. Pour en savoir plus, consultez la section Déboguer dans Dataflow de ce document.

Si votre pipeline ne parvient pas à détecter les GPU, vérifiez les points suivants:

  • Les bibliothèques NVIDIA installées dans l'image de conteneur correspondent aux exigences du code utilisateur du pipeline et des bibliothèques qu'il utilise.
  • Les bibliothèques NVIDIA installées dans les images de conteneurs sont accessibles en tant que bibliothèques partagées.

Si les appareils ne sont pas disponibles, vous utilisez peut-être une configuration logicielle incompatible. Pour vérifier la configuration de l'image, exécutez un pipeline simple qui vérifie uniquement que les GPU sont disponibles et que les nœuds de calcul peuvent y accéder.

Résoudre les problèmes liés à TensorFlow

Si PyTorch détecte des GPU dans votre pipeline, mais que TensorFlow ne le fait pas, essayez les étapes de dépannage suivantes:

  • Vérifiez que vous disposez d'une combinaison compatible de TensorFlow, de la version CuDNN et de la version CUDA Toolkit. Pour en savoir plus, consultez la section Configurations de compilation testées dans la documentation TensorFlow.
  • Si possible, passez aux dernières versions compatibles de TensorFlow et de CUDA.
  • Consultez les problèmes connus de TensorFlow et de CUDA pour vérifier si un problème connu cause des problèmes dans votre pipeline. Par exemple, le problème connu suivant peut empêcher TensorFlow de détecter les GPU : TF 2.17.0 RC0 ne fonctionne pas avec les GPU.

Étape suivante