Best Practices für die Arbeit mit Dataflow-GPUs

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

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 von Vorteil, eine lokale Entwicklungsumgebung zu haben, die die Produktionsumgebung so genau wie möglich nachahmt.

  • Wenn Ihr Workflow die beiden folgenden Kriterien erfüllt, müssen Sie keine benutzerdefinierten Container erstellen oder Ihren Entwicklungsworkflow ändern, um Pipelineanforderungen zu konfigurieren:

    • Sie verwenden eine Bibliothek, die implizit NVIDIA-GPUs verwendet.
    • Ihr Code erfordert keine Änderungen zur Unterstützung der GPU.
  • 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 vollständig 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 Batchpipelines 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.

  • MPS aktivieren

Inferenzarbeitslasten

Wenn Sie Modelle für maschinelles Lernen (ML) für lokale und Remote-Inferenz verwenden, verwenden Sie die integrierte Apache Beam-RunInference-Transformation. Die RunInference API ist ein PTransform, der für Inferenzen des maschinellen Lernens optimiert ist. Die Verwendung der RunInference-Transformation kann die Effizienz verbessern, wenn Sie ML-Modelle in Ihren Pipelines verwenden.

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.

  1. 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:

    1. Erstellen Sie alle Transformationen um die GPU-Nutzung, z. B. Datenaufnahme und -bearbeitung.

    2. Erstellen Sie einen Stub für die GPU-Transformation mit einer einfachen Pass-Through- oder Schemaänderung.

  2. Lokal testen

    Testen Sie den GPU-Teil des Pipelinecodes in der Umgebung, die die Dataflow-Worker-Ausführungsumgebung nachahmt. Die folgenden Schritte beschreiben eine der Methoden zum Ausführen dieses Tests:

    1. Erstellen Sie ein Docker-Image mit allen erforderlichen Bibliotheken.

    2. Starten Sie die Entwicklung des GPU-Codes.

    3. 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:

  1. Erstellen Sie eine VM.

  2. 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
    
  3. Prüfen Sie, ob GPUs verfügbar sind:

    ./nvidia-smi
    
  4. 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