Fehlerbehebung bei Dataflow-GPU-Jobs

Wenn beim Ausführen Ihres Dataflow-Jobs mit GPUs Probleme auftreten, führen Sie die folgenden Schritte aus:

  1. Folgen Sie dem Workflow unter Best Practices für die Arbeit mit Dataflow-GPUs, um sicherzustellen, dass Ihre Pipeline ordnungsgemäß konfiguriert ist.
  2. Prüfen Sie, ob Ihr Dataflow-Job GPUs verwendet. Weitere Informationen finden Sie unter Dataflow-Job prüfen in „Pipeline mit GPUs ausführen“.
  3. Job debuggen, entweder mit einer eigenständigen VM oder mit Dataflow.
  4. Wenn das Problem weiterhin besteht, folgen Sie den restlichen Schritten der Fehlerbehebung auf dieser Seite.

Job debuggen

Wenn möglich, beheben Sie Fehler in Ihrem Job mit einer eigenständigen VM, da dies in der Regel schneller geht. Wenn Sie jedoch aufgrund von Organisationsrichtlinien keine Debugging-Vorgänge mit einer eigenständigen VM ausführen können, können Sie Dataflow zum Debuggen verwenden.

Fehler mit einer eigenständigen VM beheben

Während Sie ein Container-Image entwerfen und weiterentwickeln, das für Sie geeignet ist, kann es schneller sein, die Feedbackschleife zu verringern. Testen Sie dazu das Container-Image auf einer eigenständigen VM.

Sie können Ihren benutzerdefinierten Container auf einer eigenständigen VM mit GPUs debuggen, indem Sie eine Compute Engine-VM erstellen, auf der GPUs unter Container-Optimized OS ausgeführt, Treiber installiert und Ihr Container folgendermaßen gestartet wird.

  1. Erstellen Sie eine VM-Instanz.

    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. Stellen Sie mit ssh eine Verbindung zur VM her.

    gcloud compute ssh INSTANCE_NAME --project "PROJECT"
    
  3. Installieren Sie die GPU-Treiber. Nachdem Sie mit ssh eine Verbindung zur VM hergestellt haben, führen Sie auf der VM die folgenden Befehle aus:

    # 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. Starten Sie Ihren benutzerdefinierten Container.

    Apache Beam SDK-Container verwenden den Einstiegspunkt /opt/apache/beam/boot. Für die Fehlerbehebung können Sie Ihren Container manuell mit einem anderen Einstiegspunkt starten:

    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
    

    Ersetzen Sie IMAGE durch den Artifact Registry-Pfad des Docker-Images.

  5. Prüfen Sie, ob die im Container installierten GPU-Bibliotheken auf GPU-Geräte zugreifen können.

    Wenn Sie TensorFlow verwenden, können Sie verfügbare Geräte im Python-Interpreter folgendermaßen drucken:

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

    Wenn Sie PyTorch verwenden, können Sie die verfügbaren Geräte im Python-Interpreter so prüfen:

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

Für eine Iteration in Ihrer Pipeline können Sie sie in Direct Runner starten. In dieser Umgebung können Sie auch Pipelines in Dataflow Runner starten.

Mit Dataflow debuggen

Wenn Sie aufgrund von Einschränkungen in Ihrer Organisation nicht auf einer eigenständigen VM debuggen können, können Sie Dataflow zum Debuggen verwenden.

Vereinfachen Sie Ihre Pipeline so, dass sie nur erkennt, ob GPUs vorhanden sind, und führen Sie die Pipeline dann in Dataflow aus. Das folgende Beispiel zeigt, wie der Code für diese Pipeline aussehen könnte:

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)
  )

Wenn Ihre Pipeline erfolgreich ausgeführt wird, kann Ihr Code auf GPUs zugreifen. Um den problematischen Code zu identifizieren, fügen Sie nach und nach immer größere Beispiele in Ihren Pipelinecode ein und führen Sie die Pipeline nach jeder Änderung aus.

Wenn in Ihrer Pipeline keine GPUs erkannt werden, folgen Sie der Anleitung im Abschnitt Keine GPU-Nutzung in diesem Dokument.

Worker starten nicht

Wenn Ihr Job hängen bleibt und die Dataflow-Worker nie mit der Verarbeitung von Daten beginnen, besteht wahrscheinlich ein Problem mit der Verwendung eines benutzerdefinierten Containers mit Dataflow. Weitere Informationen finden Sie im Leitfaden zur Fehlerbehebung für benutzerdefinierte Container.

Prüfen Sie als Python-Nutzer, ob die folgenden Bedingungen erfüllt sind:

  • Die Nebenversion des Python-Interpreters in Ihrem Container-Image ist dieselbe Version, die Sie auch beim Starten der Pipeline verwenden. Wenn es eine Abweichung gibt, werden möglicherweise Fehler wie SystemError: unknown opcode mit einem Stacktrace mit apache_beam/internal/pickler.py angezeigt.
  • Wenn Sie das Apache Beam SDK 2.29.0 oder niedriger verwenden, muss pip für das Image in /usr/local/bin/pip zugänglich sein.

Wir empfehlen, die Anpassungen der Arbeitskonfiguration zu minimieren, wenn Sie zum ersten Mal ein benutzerdefiniertes Image verwenden. Verwenden Sie die benutzerdefinierten Container-Images, die in den Beispielen auf dieser Seite bereitgestellt sind. Achten Sie darauf, dass Sie mit diesem Container-Image eine einfache Dataflow-Pipeline ausführen können, ohne GPUs anzufordern. Entwickeln Sie dann die Lösung weiter.

Achten Sie darauf, dass die Worker über genügend Speicherplatz verfügen, um das Container-Image herunterzuladen. Passen Sie die Laufwerksgröße bei Bedarf an. Der Download großer Images dauert länger, was die Worker-Startzeit verlängert.

Job schlägt beim Start sofort fehl

Wenn einer der Fehler ZONE_RESOURCE_POOL_EXHAUSTED oder ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS auftritt, können Sie so vorgehen:

  • Geben Sie die Worker-Zone nicht an, damit Dataflow die optimale Zone für Sie auswählt.

  • Starten Sie die Pipeline in einer anderen Zone oder mit einem anderen Beschleunigertyp.

  • Konfigurieren Sie ein Bereitstellungsmodell wie „Flex-Start“. Weitere Informationen finden Sie unter Bereitstellungsmodell konfigurieren.

Job schlägt zur Laufzeit fehl

Wenn der Job zur Laufzeit fehlschlägt, schließen Sie OOM-Fehler (Out-of-Memory) auf dem Worker-Computer und der GPU aus. GPU-OOM-Fehler können als cudaErrorMemoryAllocation out of memory-Fehler in Worker-Logs sichtbar werden. Wenn Sie TensorFlow verwenden, achten Sie darauf, dass Sie nur einen TensorFlow-Prozess verwenden, um auf ein GPU-Gerät zuzugreifen. Weitere Informationen finden Sie unter GPUs und Worker-Parallelität.

Keine GPU-Nutzung

Wenn Ihr Job anscheinend keine GPUs verwendet, folgen Sie der Anleitung im Abschnitt Fehlerbehebung bei Ihrem Job in diesem Dokument, um zu prüfen, ob GPUs mit Ihrem Docker-Image verfügbar sind.

Wenn GPUs verfügbar sind, aber nicht verwendet werden, liegt das Problem wahrscheinlich am Pipelinecode. Beginnen Sie mit einer einfachen Pipeline, in der GPUs erfolgreich verwendet werden, und fügen Sie dann nach und nach Code hinzu. Testen Sie die Pipeline nach jeder neuen Ergänzung. Weitere Informationen finden Sie im Abschnitt Debugging in Dataflow in diesem Dokument.

Wenn in Ihrer Pipeline keine GPUs erkannt werden, prüfen Sie Folgendes:

  • Im Container-Image installierte NVIDIA-Bibliotheken entsprechen den Anforderungen des Pipeline-Nutzercodes und der verwendeten Bibliotheken.
  • Installierte NVIDIA-Bibliotheken in Container-Images sind als gemeinsam genutzte Bibliotheken zugänglich.

Wenn die Geräte nicht verfügbar sind, verwenden Sie möglicherweise eine inkompatible Softwarekonfiguration. Zum Prüfen der Image-Konfiguration sollten Sie eine einfache Pipeline ausführen, die überprüft, ob GPUs verfügbar und für die Worker zugänglich sind.

TensorFlow-Probleme beheben

Wenn PyTorch GPUs in Ihrer Pipeline erkennt, TensorFlow jedoch nicht, versuchen Sie es mit den folgenden Schritten zur Fehlerbehebung:

  • Prüfen Sie, ob Sie eine kompatible Kombination aus TensorFlow, cuDNN-Version und CUDA Toolkit-Version haben. Weitere Informationen finden Sie in der TensorFlow-Dokumentation unter Getestete Build-Konfigurationen.
  • Führen Sie nach Möglichkeit ein Upgrade auf die neuesten kompatiblen TensorFlow- und CUDA-Versionen durch.
  • Prüfen Sie die bekannten Probleme für TensorFlow und CUDA, um festzustellen, ob ein bekanntes Problem Probleme in Ihrer Pipeline verursacht. Das folgende bekannte Problem kann beispielsweise verhindern, dass TensorFlow GPUs erkennt: TF 2.17.0 RC0 Fails to work with GPUs.

Nächste Schritte