GPUs an Dataproc-Cluster anhängen

Dataproc bietet die Möglichkeit, Grafikprozessoren (Graphics Processing Units, GPUs) zu den Master- und Worker-Knoten für Google Compute Engine in einem Dataproc-Cluster hinzuzufügen. Sie können diese GPUs verwenden, um bestimmte Arbeitslasten wie maschinelles Lernen und Datenverarbeitung in Ihren Instanzen zu beschleunigen.

Weitere Informationen zu den Vorteilen von GPUs und den unterschiedlichen Arten von GPU-Hardware finden Sie unter GPUs in Compute Engine.

Hinweise

  • GPUs erfordern spezielle Treiber und Software. Diese Elemente sind in Dataproc--ml-Images vorinstalliert (die Verwendung der -ml-Images wird empfohlen) und können bei Bedarf manuell installiert werden.
  • Lesen Sie mehr über die GPU-Preisgestaltung für Compute Engine, um zu erfahren, mit welchen Kosten die Nutzung von GPUs in Ihren Instanzen verbunden ist.
  • Lesen Sie mehr über die Einschränkungen für Instanzen mit GPUs, um zu erfahren, wie sich diese Instanzen von Nicht-GPU-Instanzen unterscheiden.
  • Prüfen Sie auf der Seite "Kontingente" für Ihr Projekt, ob ausreichend GPU-Kontingente (NVIDIA_T4_GPUS, NVIDIA_P100_GPUS oder NVIDIA_V100_GPUS) vorhanden sind. Wenn auf der Seite "Kontingente" keine GPUs aufgeführt sind oder Sie zusätzliche GPU-Kontingente benötigen, können Sie eine Erhöhung des Kontingents beantragen.

GPU-Typen

Dataproc-Knoten unterstützen die folgenden GPU-Typen. Sie müssen den GPU-Typ angeben, wenn Sie Ihrem Dataproc-Cluster GPUs hinzufügen.

  • nvidia-tesla-l4 – NVIDIA® Tesla® L4
  • nvidia-tesla-a100 – NVIDIA® Tesla® A100
  • nvidia-tesla-p100 – NVIDIA® Tesla® P100
  • nvidia-tesla-v100 – NVIDIA® Tesla® V100
  • nvidia-tesla-p4 – NVIDIA® Tesla® P4
  • nvidia-tesla-t4 – NVIDIA® Tesla® T4
  • nvidia-tesla-p100-vws – NVIDIA® Tesla® P100 Virtual Workstations
  • nvidia-tesla-p4-vws – NVIDIA® Tesla® P4 Virtual Workstations
  • nvidia-tesla-t4-vws – NVIDIA® Tesla® T4 Virtual Workstations

GPUs an einen Cluster anhängen

Wenn Sie einem Dataproc-Cluster GPUs hinzufügen möchten, müssen Sie beim Erstellen des Clusters entweder ein -ml-Image angeben (empfohlen) oder eine Initialisierungsaktion verwenden, um GPU-Treiber zu installieren. In den folgenden Beispielen wird das Image 2.3-ml-ubuntu beim Erstellen eines Clusters angegeben.

Google Cloud CLI

Wenn Sie dem Master-, den primären und den sekundären Worker-Knoten in einem Dataproc-Cluster GPUs hinzufügen möchten, erstellen Sie den Cluster mit den Flags gcloud dataproc clusters create ‑‑master-accelerator, ‑‑worker-accelerator und ‑‑secondary-worker-accelerator. Diese Flags verwenden die folgenden Werte:

  • Der GPU-Typ, der einem Knoten zugewiesen werden soll
  • Die Anzahl der GPUs, die dem Knoten hinzugefügt werden sollen

Der GPU-Typ ist erforderlich, die Anzahl der GPUs ist optional (der Standardwert ist 1 GPU).

Beispiel:

gcloud dataproc clusters create cluster-name \
    --image-version=2.3-ml-ubuntu \
    --region=region \
    --master-accelerator type=nvidia-tesla-t4 \
    --worker-accelerator type=nvidia-tesla-t4,count=4 \
    --secondary-worker-accelerator type=nvidia-tesla-t4,count=4 \
    ... other flags

REST API

Wenn Sie dem Master-, den primären und den sekundären Worker-Knoten in einem Dataproc-Cluster GPUs hinzufügen möchten, füllen Sie die Felder InstanceGroupConfig.AcceleratorConfig acceleratorTypeUri und acceleratorCount als Teil der cluster.create-API-Anfrage aus. Diese Felder können die folgenden Werte annehmen:

  • Der GPU-Typ, der einem Knoten zugewiesen werden soll
  • Die Anzahl der GPUs, die dem Knoten hinzugefügt werden sollen

Console

So hängen Sie GPUs an den Master-, primären und sekundären Worker-Knoten in einem Dataproc-Cluster an:

  1. Öffnen Sie die Dataproc-Seite Dataproc-Cluster in Compute Engine erstellen.
  2. Wählen Sie das Steuerfeld Knoten konfigurieren aus.
  3. Geben Sie in den Abschnitten Manager-Knoten, Worker-Knoten und Sekundäre Worker-Knoten unter CPU-Plattform und GPU > GPUs die Anzahl der GPUs und den GPU-Typ für die Knoten an.

GPU-Treiber installieren

Zum Verwenden von GPUs, die Dataproc-Knoten hinzugefügt wurden, sind GPU-Treiber erforderlich. Alternativ zur Verwendung der in den Dataproc--ml-Images installierten GPU-Treiber können Sie die folgenden Initialisierungsaktionen verwenden, um GPU-Treiber beim Erstellen eines Clusters zu installieren:

Installation des GPU-Treibers prüfen

Sie können die Installation von GPU-Treibern in einem Cluster prüfen, indem Sie über SSH eine Verbindung zum Masterknoten des Clusters herstellen und dann den folgenden Befehl ausführen:

nvidia-smi

Wenn der Treiber ordnungsgemäß funktioniert, umfasst die Ausgabe die Treiberversion und die GPU-Statistiken (siehe Installieren des GPU-Treibers bestätigen).

Spark-Konfiguration

Wenn Sie einen Job an Spark senden, können Sie die spark.executorEnv-Spark-Konfigurationseigenschaft runtime environment property mit der Umgebungsvariablen LD_PRELOAD verwenden, um die erforderlichen Bibliotheken vorab zu laden.

Beispiel:

gcloud dataproc jobs submit spark --cluster=CLUSTER_NAME \
  --region=REGION \
  --class=org.apache.spark.examples.SparkPi \
  --jars=file:///usr/lib/spark/examples/jars/spark-examples.jar \
  --properties=spark.executorEnv.LD_PRELOAD=libnvblas.so,spark.task.resource.gpu.amount=1,spark.executor.resource.gpu.amount=1,spark.executor.resource.gpu.discoveryScript=/usr/lib/spark/scripts/gpu/getGpusResources.sh

Beispiel für GPU-Job

Sie können GPUs in Cloud Dataproc testen, indem Sie einen der folgenden Jobs ausführen:

  1. Führen Sie eines der Spark ML-Beispiele aus.
  2. Führen Sie das folgende Beispiel mit spark-shell aus, um eine Matrixberechnung durchzuführen:
import org.apache.spark.mllib.linalg._
import org.apache.spark.mllib.linalg.distributed._
import java.util.Random

def makeRandomSquareBlockMatrix(rowsPerBlock: Int, nBlocks: Int): BlockMatrix = {
  val range = sc.parallelize(1 to nBlocks)
  val indices = range.cartesian(range)
  return new BlockMatrix(
      indices.map(
          ij => (ij, Matrices.rand(rowsPerBlock, rowsPerBlock, new Random()))),
      rowsPerBlock, rowsPerBlock, 0, 0)
}

val N = 1024 * 4
val n = 2
val mat1 = makeRandomSquareBlockMatrix(N, n)
val mat2 = makeRandomSquareBlockMatrix(N, n)
val mat3 = mat1.multiply(mat2)
mat3.blocks.persist.count
println("Processing complete!")

Weitere Informationen