GPUs Clustern hinzufügen

Mit Managed Service for Apache Spark können Grafikprozessoren (GPUs) an die Master- und Worker-Compute Engine-Knoten in einem Managed Service for Apache Spark-Cluster angehängt werden. 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.

Hinweis

  • GPUs erfordern spezielle Treiber und Software. Diese Elemente sind in Managed Service for Apache Spark--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

Managed Service for Apache Spark-Knoten unterstützen die folgenden GPU-Typen. Sie müssen den GPU-Typ angeben, wenn Sie GPUs an Ihren Managed Service for Apache Spark-Cluster anhängen.

  • 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-rtx-pro-6000 – NVIDIA® RTX® PRO 6000
  • 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 GPUs an einen Managed Service for Apache Spark-Cluster anhängen 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 die Verwendung des Images 2.3-ml-ubuntu beim Erstellen eines Clusters angegeben oder vorausgesetzt.

Google Cloud Console

So hängen Sie GPUs an einen Managed Service for Apache Spark-Cluster an:

  1. Öffnen Sie die Seite Cluster erstellen.
  2. Klicken Sie im Abschnitt Worker-Konfiguration auf den Tab GPUs und geben Sie dann den Typ und die Anzahl der GPUs an.
  3. Standardmäßig entsprechen die Einstellungen für den Treiberknoten (Masterknoten) den Einstellungen für den primären Worker. Unter Zusätzliche Konfiguration können Sie auf Treiberknoten klicken, um das Häkchen bei Treiberknoten standardmäßig auf primären Worker festlegen zu entfernen und den Maschinentyp für den Treiberknoten anzugeben.

gcloud-CLI

Wenn Sie GPUs an die Master- und primären und sekundären Worker-Knoten in einem Managed Service for Apache Spark-Cluster anhängen möchten, erstellen Sie den Cluster mit den Flags gcloud dataproc clusters create ‑‑master-accelerator, ‑‑worker-accelerator und ‑‑secondary-worker-accelerator. Diese Flags haben die folgenden Werte:

  • Der GPU-Typ, der an einen Knoten angehängt werden soll
  • Die Anzahl der GPUs, die an den Knoten angehängt werden sollen

Der GPU-Typ ist erforderlich und die Anzahl der GPUs ist optional (Standard 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 GPUs an die Master- und primären und sekundären Worker-Knoten in einem Managed Service for Apache Spark-Cluster anhängen möchten, füllen Sie die Felder InstanceGroupConfig.AcceleratorConfig acceleratorTypeUri und acceleratorCount im Rahmen der API-Anfrage cluster.create aus. Diese Felder haben die folgenden Werte:

  • Der GPU-Typ, der an einen Knoten angehängt werden soll
  • Die Anzahl der GPUs, die an den Knoten angehängt werden sollen

GPU-Treiber installieren

GPU-Treiber sind erforderlich, um GPUs zu verwenden, die an Managed Service for Apache Spark-Knoten angehängt sind. Als Alternative zu den GPU-Treibern, die in den -ml-Images von Managed Service for Apache Spark installiert sind, können Sie die folgenden Initialisierungsaktionen verwenden, um GPU-Treiber zu installieren, wenn Sie einen Cluster erstellen:

Installation des GPU-Treibers prüfen

Sie können die Installation des GPU-Treibers auf einem Cluster prüfen, indem Sie eine SSH-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 Laufzeitumgebungs-Attribut-Eigenschaft der Spark-Konfiguration spark.executorEnv mit der Umgebungsvariablen LD_PRELOAD verwenden, um erforderliche 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 Managed Service for Apache Spark testen, indem Sie einen der folgenden Jobs ausführen, die von der Ausführung mit GPUs profitieren:

  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