Auf dieser Seite werden Best Practices für das Erstellen von Pipelines mit GPUs beschrieben.
Informationen und Beispiele zum Aktivieren von GPUs in Ihren Dataflow-Jobs finden Sie unter Pipeline mit GPUs ausführen und Landsat-Satellitenbilder mit GPUs verarbeiten.
Voraussetzungen für die Verwendung von GPUs in Dataflow
- Zur Verwendung von GPUs mit Ihrem Dataflow-Job müssen Sie Runner v2 verwenden.
- Dataflow führt Nutzercode in Worker-VMs in einem Docker-Container aus.
Auf diesen Worker-VMs wird Container-Optimized OS ausgeführt.
Damit Dataflow-Jobs GPUs verwenden können, müssen folgende Voraussetzungen erfüllt sein:
- GPU-Treiber werden auf Worker-VMs installiert und sind für den Docker-Container zugänglich. Weitere Informationen finden Sie unter GPU-Treiber installieren.
- Die von Ihrer Pipeline erforderlichen GPU-Bibliotheken wie NVIDIA CUDA-X-Bibliotheken oder NVIDIA CUDA-Toolkit sind im benutzerdefinierten Container-Image installiert. Weitere Informationen finden Sie unter Container-Image konfigurieren.
- Da GPU-Container in der Regel groß sind, sollten Sie die Standardgröße des Bootlaufwerks auf mindestens 50 Gigabyte erhöhen, um zu vermeiden, dass irgendwann kein Speicherplatz mehr verfügbar ist.
Hinweise
Berücksichtigen Sie beim Entwerfen Ihrer Test- und Produktionsumgebung die folgenden Faktoren.
Lokale Entwicklung
Mit Apache Beam mit NVIDIA-GPUs können Sie umfangreiche Datenverarbeitungspipelines erstellen, die Vorverarbeitung und Inferenz verwalten. Beachten Sie bei der Verwendung von GPUs für die lokale Entwicklung die folgenden Informationen:
Häufig verwenden die Datenverarbeitungs-Workflows zusätzliche Bibliotheken, die in der Startumgebung und in der Ausführungsumgebung auf Dataflow-Workern installiert werden müssen. Durch diese Konfiguration werden dem Entwicklungs-Workflow Schritte zum Konfigurieren von Pipelineanforderungen oder zum Verwenden benutzerdefinierter Container in Dataflow hinzugefügt. Es ist hilfreich, eine lokale Entwicklungsumgebung zu haben, die die Produktionsumgebung so genau wie möglich nachahmt.
Wenn Ihr Workflow beide der folgenden Kriterien erfüllt, müssen Sie keine benutzerdefinierten Container erstellen oder Ihren Entwicklungs-Workflow ändern, um Pipelineanforderungen zu konfigurieren:
- Sie verwenden eine Bibliothek, die implizit NVIDIA-GPUs verwendet.
- Für die GPU-Unterstützung sind keine Änderungen am Code erforderlich.
Einige Bibliotheken wechseln nicht transparent zwischen CPU- und GPU-Nutzung und erfordern daher bestimmte Builds und unterschiedliche Codepfade. Für das Replizieren des Lebenszyklus der Code-Ausführen-Code-Entwicklung für dieses Szenario sind zusätzliche Schritte erforderlich.
Bei der Ausführung lokaler Tests ist es hilfreich, die Umgebung des Dataflow-Workers möglichst genau zu replizieren. Je nach Bibliothek benötigen Sie möglicherweise einen Computer mit einer GPU und die erforderlichen GPU-Bibliotheken. Dieser Maschinentyp ist in Ihrer lokalen Umgebung möglicherweise nicht verfügbar. Sie können die Dataflow-Runnerumgebung mit einem Container emulieren, der auf einer virtuellen Google Cloud-Maschine mit GPU ausgeführt wird.
Spezifikationen für Maschinentypen
Weitere Informationen zur Unterstützung von Maschinentypen für die einzelnen GPU-Modelle finden Sie unter GPU-Plattformen. GPUs, die mit N1-Maschinentypen unterstützt werden, unterstützen auch die benutzerdefinierten N1-Maschinentypen.
Typ und Anzahl der GPUs definieren die Obergrenzen für die verfügbare Anzahl von vCPUs und Arbeitsspeicher, die Worker haben können. Die entsprechenden Einschränkungen finden Sie unter Verfügbarkeit.
Wenn Sie eine höhere Anzahl von CPUs oder Arbeitsspeicher angeben, müssen Sie möglicherweise eine höhere Anzahl von GPUs angeben.
Weitere Informationen finden Sie unter GPUs in Compute Engine.
Ressourcennutzung optimieren
Die meisten Pipelines bestehen nicht ausschließlich aus Transformationen, für die eine GPU erforderlich ist. Eine typische Pipeline hat eine Aufnahmephase, die eine der vielen von Apache Beam bereitgestellten Quellen verwendet. Auf diese Phase folgt eine Datenbearbeitungs- oder Shape-Transformation, die dann in eine GPU-Transformation einfließt.
Right Fitting verwendet Apache Beam-Ressourcenhinweise, um Worker-Ressourcen für Ihre Batch-Pipelines anzupassen. Wenn Right Fitting aktiviert ist, verwendet Dataflow GPUs nur für die Phasen der Pipeline, die sie benötigen. Folglich verbessert dieses Feature die Flexibilität und Funktion der Pipeline, während möglicherweise die Kosten gesenkt werden.
Weitere Informationen finden Sie unter Right Fitting.
GPUs und Parallelität der Worker
Bei Python-Pipelines mit der Dataflow Runner v2-Architektur startet Dataflow einen Apache Beam SDK-Prozess pro VM-Kern. Jeder SDK-Prozess wird in einem eigenen Docker-Container ausgeführt und erzeugt somit viele Threads, die jeweils eingehende Daten verarbeiten.
GPUs verwenden mehrere Prozessarchitekturen. GPUs in Dataflow-Workern sind für alle Prozesse und Threads sichtbar.
Wenn Sie mehrere SDK-Prozesse auf einer gemeinsam genutzten GPU ausführen, können Sie die GPU-Effizienz und -Auslastung verbessern, indem Sie den NVIDIA Multi-Process-Dienst (MPS) aktivieren. MPS verbessert die Worker-Parallelität und den Gesamtdurchsatz für GPU-Pipelines, insbesondere für Arbeitslasten mit niedriger GPU-Ressourcennutzung. Weitere Informationen finden Sie unter Leistung auf einer gemeinsam genutzten GPU mit NVIDIA MPS verbessern.
Sie müssen Sie den GPU-Zugriff möglicherweise verwalten, um eine GPU-Überbelegung zu vermeiden. Wenn Sie TensorFlow verwenden, können Sie mit einem der folgenden Vorschläge verhindern, dass GPU-Arbeitsspeicher überbelegt wird:
Konfigurieren Sie die Dataflow-Worker so, dass unabhängig von der Anzahl der Worker-vCPUs nur ein containerisierter Python-Prozess gestartet wird. Verwenden Sie für diese Konfiguration beim Starten des Jobs die folgenden Pipelineoptionen:
--experiments=no_use_multiple_sdk_containers
--number_of_worker_harness_threads
Weitere Informationen zur Anzahl der zu verwendenden Threads finden Sie unter Anzahl der Threads reduzieren.
Inferenzarbeitslasten
Wenn Sie Machine-Learning-Modelle für lokale und Remote-Inferenzen nutzen, verwenden Sie die integrierte Apache Beam-Transformation RunInference
.
Die RunInference
API ist eine PTransform
, die für Inferenzen mit maschinellem Lernen optimiert ist. Mit der RunInference
-Transformation lässt sich die Effizienz bei der Nutzung von ML-Modellen in Ihren Pipelines verbessern.
Workflow
Der folgende zweistufige Workflow zeigt, wie Sie mit GPUs eine Pipeline erstellen. Dieser Ablauf kümmert sich separat um GPU- und Nicht-GPU-bezogene Probleme und verkürzt die Feedbackschleife.
Pipeline erstellen
Erstellen Sie eine Pipeline, die in Dataflow ausgeführt werden kann. Ersetzen Sie die Transformationen, die GPUs erfordern, durch die Transformationen, die keine GPUs verwenden, aber funktional identisch sind:
Erstellen Sie alle Transformationen um die GPU-Nutzung, z. B. Datenaufnahme und -bearbeitung.
Erstellen Sie einen Stub für die GPU-Transformation mit einer einfachen Pass-Through- oder Schemaänderung.
Lokal testen
Testen Sie den GPU-Teil des Pipelinecodes in der Umgebung, die die Dataflow-Worker-Ausführungsumgebung nachahmt. Im Folgenden wird eine der Methoden zum Ausführen dieses Tests beschrieben:
Erstellen Sie ein Docker mit allen erforderlichen Bibliotheken.
Starten Sie die Entwicklung des GPU-Codes.
Starten Sie den Codeausführungscode-Zyklus mit einer virtuellen Google Cloud-Maschine mit dem Docker-Image. Führen Sie den GPU-Code in einem lokalen Python-Prozess getrennt von einer Apache Beam-Pipeline aus, um Bibliotheksinkompatibilitäten auszuschließen. Führen Sie dann die gesamte Pipeline auf dem direkten Runner aus oder starten Sie die Pipeline in Dataflow.
VM mit containeroptimiertem Betriebssystem verwenden
Verwenden Sie für eine Mindestumgebung eine containeroptimierte virtuelle Maschine (VM). Weitere Informationen finden Sie unter VM mit angehängten GPUs erstellen.
Der allgemeine Ablauf ist:
Erstellen Sie eine VM.
Stellen Sie eine Verbindung zur VM her und führen Sie die folgenden Befehle aus:
sudo cos-extensions install gpu -- -version latest sudo mount --bind /var/lib/nvidia /var/lib/nvidia sudo mount -o remount,exec /var/lib/nvidia
Prüfen Sie, ob GPUs verfügbar sind:
./nvidia-smi
Starten Sie einen Docker-Container mit GPU-Treibern von der VM, die als Volumes bereitgestellt wurde. Beispiel:
sudo 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 gcr.io/bigdatapivot/image_process_example:latest
Ein Beispiel für ein Dockerfile finden Sie unter Benutzerdefiniertes Container-Image erstellen. Fügen Sie dem Dockerfile alle Abhängigkeiten hinzu, die Sie für Ihre Pipeline benötigen.
Weitere Informationen zur Verwendung eines Docker-Image, das für die GPU-Nutzung vorkonfiguriert ist, finden Sie unter Vorhandenes Image für die GPU-Nutzung verwenden.
Tools für die Arbeit mit containeroptimierten Systemen
Konfigurieren Sie die Docker-Befehlszeile so, dass
docker-credential-gcr
als Credential Helper für den Standardsatz von Google Container Registries (GCR) verwendet wird:sudo docker-credential-gcr configure-docker
Weitere Informationen zum Einrichten von Docker-Anmeldedaten finden Sie unter docker-credential-gcr.
Verwenden Sie
toolbox
, um Dateien wie Pipeline-Code auf eine VM oder von einer VM zu kopieren. Diese Technik ist nützlich, wenn Sie ein benutzerdefiniertes optimiertes Image verwenden. Beispiel:toolbox /google-cloud-sdk/bin/gsutil cp gs://bucket/gpu/image_process/* /media/root/home/<userid>/opencv/
Weitere Informationen finden Sie unter Knotenprobleme mit der Toolbox beheben.
Nächste Schritte
- Weitere Informationen zur Dataflow-Unterstützung für GPUs
- Weitere Informationen zum Ausführen einer Pipeline mit GPUs
- Landsat-Satellitenbilder mit GPUs verarbeiten