Associer des GPU aux clusters Dataproc

Dataproc offre la possibilité d'associer des processeurs graphiques (GPU) aux nœuds maîtres et aux nœuds de calcul Compute Engine d'un cluster Dataproc. Vous pouvez utiliser ces GPU pour accélérer des charges de travail spécifiques sur vos instances, telles que le machine learning et le traitement de données.

Pour plus d'informations sur ce que vous pouvez faire avec les GPU et sur les types de processeurs GPU disponibles, consultez la page GPU sur Compute Engine.

.

Avant de commencer

  • Les GPU nécessitent des pilotes et des logiciels spécifiques. Ces éléments sont préinstallés dans les images Dataproc -ml (il est recommandé d'utiliser les images -ml). Ils peuvent être installés manuellement si nécessaire.
  • Consultez la section sur la tarification des GPU dans Compute Engine pour mieux comprendre le coût d'utilisation des GPU sur vos instances.
  • Consultez la section sur les restrictions imposées aux instances utilisant des GPU pour comprendre les spécificités de ces instances par rapport à celles sans GPU.
  • Consultez la page des quotas de votre projet pour vous assurer que vous disposez d'un quota de GPU suffisant (NVIDIA_T4_GPUS, NVIDIA_P100_GPUS ou NVIDIA_V100_GPUS). Si les GPU ne figurent pas sur la page "Quotas" ou que vous avez besoin d'un quota de GPU supplémentaire, demandez une augmentation de quota.

Types de GPU

Les nœuds Dataproc sont compatibles avec les types de GPU suivants. Vous devez spécifier le type de GPU lorsque vous l'associez à un cluster Dataproc.

  • 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

Associer des GPU à un cluster

Pour associer des GPU à un cluster Dataproc, vous devez, lorsque vous créez le cluster, spécifier une image -ml (recommandé) ou utiliser une action d'initialisation pour installer des pilotes de GPU. Les exemples suivants spécifient l'image 2.3-ml-ubuntu lors de la création d'un cluster.

Google Cloud CLI

Pour associer des GPU aux nœuds maîtres, principaux et secondaires dans un cluster Dataproc, créez le cluster à l'aide des options gcloud dataproc clusters create ‑‑master-accelerator, ‑‑worker-accelerator et ‑‑secondary-worker-accelerator. Ces indicateurs comprennent les valeurs suivantes :

  • Le type de GPU à associer à un nœud
  • Nombre de GPU à associer au nœud

Le type de GPU est obligatoire, tandis que le nombre de GPU est facultatif (la valeur par défaut correspond à 1 GPU).

Exemple :

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

API REST

Pour associer des GPU aux nœuds maîtres, principaux et aux nœuds de calcul secondaires d'un cluster Dataproc, remplissez les champs InstanceGroupConfig.AcceleratorConfig acceleratorTypeUri et acceleratorCount dans la requête API cluster.create. Ces champs acceptent les valeurs suivantes :

  • Type de GPU à associer à un nœud
  • Nombre de GPU à associer au nœud

Console

Pour associer des GPU aux nœuds maîtres, principaux et secondaires d'un cluster Dataproc, procédez comme suit :

  1. Ouvrez la page Dataproc Créer un cluster Dataproc sur Compute Engine.
  2. Sélectionnez le panneau Configurer les nœuds.
  3. Dans les sections Nœud du gestionnaire, Nœuds de calcul et Nœuds de calcul secondaires, sous Plate-forme du processeur et GPU > GPU, spécifiez le nombre et le type de GPU pour les nœuds.

Installer des pilotes de GPU

Pour utiliser les GPU associés aux nœuds Dataproc, vous avez besoin de pilotes de GPU. Au lieu d'utiliser les pilotes de GPU installés dans les images Dataproc -ml, vous pouvez utiliser les actions d'initialisation suivantes pour installer les pilotes de GPU lorsque vous créez un cluster :

Vérifier l'installation du pilote de GPU

Vous pouvez vérifier l'installation du pilote GPU sur un cluster en vous connectant à l'aide de SSH au nœud maître du cluster, puis en exécutant la commande suivante :

nvidia-smi

Si le pilote fonctionne correctement, le résultat affiche la version du pilote et les statistiques du GPU (consultez la section Vérifier l'installation du pilote de GPU).

Configurer Spark

Lorsque vous envoyez une tâche à Spark, vous pouvez utiliser la propriété environnement d'exécution de la configuration Spark spark.executorEnv avec la variable d'environnement LD_PRELOAD pour précharger les bibliothèques nécessaires.

Exemple :

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

Exemple de tâche GPU

Vous pouvez tester les GPU sur Dataproc en exécutant l'une des tâches suivantes, ce qui est particulièrement utile avec les GPU :

  1. Exécutez l'un des exemples de machine learning Spark.
  2. Exécutez l'exemple suivant avec spark-shell pour exécuter un calcul matriciel :
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!")

Étape suivante