Mit GPUs entwickeln

Auf dieser Seite wird ein Beispiel für einen Entwickler-Workflow zum Erstellen von Pipelines mit GPUs beschrieben.

Weitere Informationen zur Verwendung von GPUs mit Dataflow finden Sie unter Dataflow-Unterstützung für GPUs. Informationen und Beispiele zum Aktivieren von GPUs in Ihren Dataflow-Jobs finden Sie unter GPUs verwenden und Landsat-Satellitenbilder mit GPUs verarbeiten.

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. Möglicherweise möchten Sie eine lokale Entwicklungsumgebung verwenden, die die Produktionsumgebung so genau wie möglich nachahmt.

  • Wenn Sie eine Bibliothek verwenden, die implizit NVIDIA-GPUs verwendet und für Ihren Code keine Änderungen zur Unterstützung von GPUs erforderlich sind, müssen Sie Ihren Entwicklungs-Workflow nicht konfigurieren, um Pipelineanforderungen zu konfigurieren oder benutzerdefinierte Container zu erstellen.

  • 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.

  • Es ist unwahrscheinlich, dass eine Pipeline vollständig aus Transformationen besteht, 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.

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:

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

    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. Achten Sie darauf, dass Sie dem Dockerfile alle Abhängigkeiten hinzufügen, die Sie für Ihre Pipeline benötigen.

Weitere Informationen zur Verwendung eines Docker-Images, das für die GPU-Nutzung vorkonfiguriert ist, finden Sie unter Vorhandenes Image für die GPU-Nutzung verwenden.

Nützliche Tools bei der 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:

    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