Wenn beim Ausführen Ihres Dataflow-Jobs mit GPUs Probleme auftreten, gehen Sie so vor:
- Folgen Sie dem Workflow unter Best Practices für die Arbeit mit Dataflow-GPUs, um sicherzustellen, dass Ihre Pipeline ordnungsgemäß konfiguriert ist.
- Prüfen Sie, ob Ihr Dataflow-Job GPUs verwendet. Weitere Informationen finden Sie unter Dataflow-Job prüfen in „Pipeline mit GPUs ausführen“.
- Fehler beheben, entweder mit einer eigenständigen VM oder mit Dataflow
- Wenn das Problem weiterhin besteht, folgen Sie den restlichen Schritten der Fehlerbehebung auf dieser Seite.
Job debuggen
Beheben Sie den Fehler mit einer eigenständigen VM, da dies in der Regel schneller geht. Wenn Sie aufgrund von Organisationsrichtlinien jedoch nicht mit einer eigenständigen VM debuggen können, können Sie mit Dataflow debuggen.
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.
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
Stellen Sie mit
ssh
eine Verbindung zur VM her.gcloud compute ssh INSTANCE_NAME --project "PROJECT"
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
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.
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 Fehler beheben
Wenn organisatorische Einschränkungen das Debuggen auf einer eigenständigen VM verhindern, können Sie mit Dataflow debuggen.
Vereinfachen Sie Ihre Pipeline so, dass nur erkannt wird, 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 die Pipeline erfolgreich ist, kann Ihr Code auf GPUs zugreifen. Fügen Sie nach und nach immer größere Beispiele in den Pipelinecode ein, um den fehlerhaften Code zu identifizieren. 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 dieses Dokuments.
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 mitapache_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.
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 offenbar keine GPUs verwendet, folgen Sie der Anleitung im Abschnitt Job beheben dieses Dokuments, um zu prüfen, ob GPUs mit Ihrem Docker-Image verfügbar sind.
Wenn GPUs verfügbar, aber nicht verwendet werden, liegt das Problem wahrscheinlich am Pipelinecode. Beginnen Sie mit einer einfachen Pipeline, die GPUs erfolgreich nutzt, und fügen Sie der Pipeline nach und nach Code hinzu. Testen Sie die Pipeline nach jeder neuen Ergänzung. Weitere Informationen finden Sie im Abschnitt Fehlerbehebung in Dataflow dieses Dokuments.
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 aber nicht, versuchen Sie Folgendes:
- Prüfen Sie, ob Sie eine kompatible Kombination von TensorFlow, cuDNN und CUDA Toolkit 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.
- Sehen Sie sich die bekannten Probleme für TensorFlow und CUDA an, um festzustellen, ob ein bekanntes Problem in Ihrer Pipeline auftritt. So kann beispielsweise das folgende bekannte Problem verhindern, dass TensorFlow GPUs erkennt: TF 2.17.0 RC0 funktioniert nicht mit GPUs.
Nächste Schritte
- Erste Schritte: GPUs auf Container-Optimized OS ausführen
- Container-Optimized OS-Toolbox
- Zugriffsbereiche für Dienstkonten