Utiliser des GPU pour l'entraînement de modèles dans le cloud

Les processeurs graphiques (GPU) peuvent accélérer considérablement le processus d'entraînement de nombreux modèles de deep learning, Pour des tâches telles que la classification des images, l'analyse vidéo et le traitement du langage naturel, les modèles d'entraînement impliquent la multiplication de matrices de calcul intensif et d'autres opérations qui peuvent tirer parti de l'architecture hautement parallèle d'un GPU.

L'entraînement d'un modèle de deep learning impliquant des tâches de calcul intensives sur des ensembles de données extrêmement volumineux peut prendre plusieurs jours sur un seul processeur. Toutefois, si vous concevez un programme pour décharger ces tâches sur un ou plusieurs GPU, vous pouvez réduire le temps d'entraînement à quelques heures.

Avant de commencer

AI Platform Training vous permet d'exécuter votre application d'entraînement TensorFlow sur une machine compatible avec les GPU. Consultez le guide TensorFlow sur l'utilisation des GPU et la section de ce document portant sur l'adaptation du code d'entraînement aux GPU.

Si vous utilisez un conteneur personnalisé pour l'entraînement de vos modèles, vous pouvez également utiliser des GPU avec des frameworks de machine learning autres que TensorFlow.

Certains modèles ne bénéficient pas de l'exécution sur GPU. Nous recommandons l'utilisation de GPU pour les modèles volumineux et complexes comportant de nombreuses opérations mathématiques. Même dans ce cas, vous devez tester les avantages des GPU en exécutant l'entraînement d'un petit nombre de données.

Demander des machines compatibles GPU

Pour pouvoir utiliser des GPU dans le cloud, configurez votre tâche d'entraînement afin d'accéder aux machines compatibles GPU en procédant de l'une des manières suivantes :

  • Utilisez le niveau d'évolutivité BASIC_GPU.
  • Utilisez des types de machines Compute Engine et rattachez-y des GPU.
  • Utilisez des anciens types de machines compatibles GPU.

Machines compatibles GPU de base

Si vous apprenez à utiliser AI Platform Training ou à tester des machines GPU, vous pouvez définir le niveau d'évolutivité sur BASIC_GPU pour obtenir une seule instance de nœud de calcul avec un seul GPU NVIDIA Tesla K80.

Types de machines Compute Engine avec rattachement aux GPU

Si vous configurez votre tâche d'entraînement avec des types de machines Compute Engine, vous pouvez y rattacher un nombre personnalisé de GPU pour accélérer votre tâche :

  • Définissez le niveau d'évolutivité sur CUSTOM.
  • Configurez votre nœud de calcul maître et tout autre type de tâche (nœud de calcul, serveur de paramètres ou évaluateur) faisant partie de votre tâche pour utiliser des types de machines Compute Engine valides.
  • Ajoutez un champ acceleratorConfig avec le type et le nombre de GPU souhaités pour les configurations masterConfig, workerConfig, parameterServerConfig ou evaluatorConfig, en fonction instances de machines virtuelles (VM) à accélérer. Vous pouvez utiliser les types de GPU suivants :
    • NVIDIA_TESLA_K80
    • NVIDIA_TESLA_P4
    • NVIDIA_TESLA_P100
    • NVIDIA_TESLA_T4
    • NVIDIA_TESLA_V100

Pour créer un acceleratorConfig valide, vous devez tenir compte de plusieurs restrictions :

  1. Vous ne pouvez utiliser qu'un certain nombre de GPU dans votre configuration. Par exemple, vous pouvez associer deux ou quatre GPU NVIDIA Tesla T4, mais pas trois. Pour connaître le nombre de GPU autorisé pour chaque type de machine, consultez la table de compatibilité ci-après.

  2. Vous devez vous assurer que chacune de vos configurations de GPU fournit suffisamment de processeurs virtuels et de mémoire pour le type de machine auquel vous les rattachez. Par exemple, si vous utilisez n1-standard-32 pour vos nœuds de calcul, chaque nœud dispose de 32 processeurs virtuels et de 120 Go de mémoire. Comme chaque GPU NVIDIA Tesla V100 peut fournir jusqu'à 12 processeurs virtuels et 76 Go de mémoire, vous devez en rattacher au moins quatre à chaque nœud de calcul n1-standard-32 pour répondre à ses besoins (deux GPU fournissent des ressources insuffisantes et vous ne pouvez pas spécifier trois GPU).

    Consultez le tableau présentant les spécifications de chaque type de machine et celui comparant les GPU par rapport aux tâches de calcul afin de déterminer ces compatibilités, ou consultez le tableau de compatibilité ci-après.

    Notez les limitations supplémentaires suivantes concernant les ressources GPU pour AI Platform Training dans certains cas particuliers :

    • Une configuration avec huit GPU NVIDIA Tesla K80 ne fournit que jusqu'à 208 Go de mémoire dans l'ensemble des régions et zones.
    • Une configuration avec quatre GPU NVIDIA Tesla P100 n'accepte que jusqu'à 64 processeurs virtuels et jusqu'à 208 Go de mémoire dans l'ensemble des régions et zones.
  3. Vous devez envoyer votre tâche d'entraînement à une région compatible avec la configuration de votre GPU. Pour en savoir plus, consultez la section ci-après relative aux régions compatibles.

La table suivante offre un aperçu rapide du nombre d'accélérateurs de chaque type qu'il est possible de rattacher à chaque type de machine Compute Engine :

Nombre de GPU autorisés pour chaque type de machine
Type de machine NVIDIA Tesla K80 NVIDIA Tesla P4 NVIDIA Tesla P100 NVIDIA Tesla T4 NVIDIA Tesla V100
n1-standard-4 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-standard-8 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-standard-16 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 2, 4, 8
n1-standard-32 4, 8 2, 4 2, 4 2, 4 4, 8
n1-standard-64 4 4 8
n1-standard-96 4 4 8
n1-highmem-2 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-highmem-4 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-highmem-8 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-highmem-16 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 2, 4, 8
n1-highmem-32 4, 8 2, 4 2, 4 2, 4 4, 8
n1-highmem-64 4 4 8
n1-highmem-96 4 4 8
n1-highcpu-16 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 2, 4, 8
n1-highcpu-32 4, 8 2, 4 2, 4 2, 4 4, 8
n1-highcpu-64 8 4 4 4 8
n1-highcpu-96 4 4 8

Vous trouverez ci-après un exemple d'envoi de tâche à l'aide de types de machines Compute Engine avec GPU rattachés.

Types de machines avec GPU inclus

Sinon, au lieu d'utiliser un acceleratorConfig, vous pouvez sélectionner un ancien type de machine incluant des GPU :

  • Définissez le niveau d'évolutivité sur CUSTOM.
  • Configurez votre nœud de calcul maître et tout autre type de tâche (nœud de calcul, serveur de paramètres ou évaluateur) que vous souhaitez accélérer pour utiliser l'un des types de machines compatibles GPU suivants, en fonction du nombre de GPU et du type d'accélérateur nécessaire pour votre tâche :
    • standard_gpu : un seul GPU NVIDIA Tesla K80
    • complex_model_m_gpu : quatre GPU NVIDIA Tesla K80
    • complex_model_l_gpu : huit GPU NVIDIA Tesla K80
    • standard_p100 : un seul GPU NVIDIA Tesla P100
    • complex_model_m_p100 : quatre GPU NVIDIA Tesla P100
    • standard_v100 : un seul GPU NVIDIA Tesla V100
    • large_model_v100 : un seul GPU NVIDIA Tesla V100
    • complex_model_m_v100 : quatre GPU NVIDIA Tesla V100
    • complex_model_l_v100 : huit GPU NVIDIA Tesla V100

Vous trouverez ci-dessous un exemple d'envoi de tâche avec des types de machines compatibles GPU à l'aide de la commande gcloud.

En savoir plus sur les différents types de machines

Régions compatibles avec les GPU

Vous devez exécuter votre tâche dans une région compatible avec les GPU. Les régions suivantes offrent actuellement un accès aux GPU :

  • us-west1
  • us-west2
  • us-central1
  • us-east1
  • us-east4
  • northamerica-northeast1
  • southamerica-east1
  • europe-west1
  • europe-west2
  • europe-west4
  • asia-south1
  • asia-southeast1
  • asia-east1
  • asia-northeast1
  • asia-northeast3
  • australia-southeast1

De plus, certaines de ces régions ne permettent d'accéder qu'à certains types de GPU. Pour bien comprendre quelles régions sont disponibles pour les services AI Platform Training, y compris l'entraînement de modèles et la prédiction en ligne/par lots, consultez le guide des régions.

Si votre tâche d'entraînement utilise plusieurs types de GPU, ces derniers doivent tous être disponibles dans une même zone de votre région. Par exemple, vous ne pouvez pas exécuter une tâche dans us-central1 avec un nœud de calcul maître ayant recours à des GPU NVIDIA Tesla T4, des serveurs de paramètres utilisant des GPU NVIDIA Tesla K80 et des nœuds de calcul utilisant des GPU NVIDIA Tesla P100. Bien que tous ces GPU soient disponibles pour des tâches d'entraînement dans us-central1, aucune zone de cette région ne fournit les trois types de GPU. Pour en savoir plus sur la disponibilité des GPU dans les différentes zones, consultez le tableau de comparaison des GPU pour les tâches de calcul.

Envoyer une tâche d'entraînement

Vous pouvez envoyer votre tâche d'entraînement à l'aide de la commande gcloud ai-platform jobs submit training.

  1. Définissez un fichier config.yaml qui décrit les options GPU souhaitées. La structure du fichier YAML représente la ressource Tâche. Vous trouverez ci-dessous deux exemples de fichiers config.yaml.

    Le premier exemple montre un fichier de configuration pour une tâche d'entraînement utilisant des types de machines Compute Engine, dont certains incluent des GPU :

    trainingInput:
      scaleTier: CUSTOM
      # Configure a master worker with 4 T4 GPUs
      masterType: n1-highcpu-16
      masterConfig:
        acceleratorConfig:
          count: 4
          type: NVIDIA_TESLA_T4
      # Configure 9 workers, each with 4 T4 GPUs
      workerCount: 9
      workerType: n1-highcpu-16
      workerConfig:
        acceleratorConfig:
          count: 4
          type: NVIDIA_TESLA_T4
      # Configure 3 parameter servers with no GPUs
      parameterServerCount: 3
      parameterServerType: n1-highmem-8
    

    L'exemple suivant montre un fichier de configuration pour une tâche avec une configuration semblable à celle ci-dessus. Toutefois, cette configuration utilise d'anciens types de machines qui incluent des GPU au lieu de rattacher des GPU avec un acceleratorConfig :

    trainingInput:
      scaleTier: CUSTOM
      # Configure a master worker with 4 K80 GPUs
      masterType: complex_model_m_gpu
      # Configure 9 workers, each with 4 K80 GPUs
      workerCount: 9
      workerType: complex_model_m_gpu
      # Configure 3 parameter servers with no GPUs
      parameterServerCount: 3
      parameterServerType: large_model
    
  2. Exécutez la commande gcloud pour envoyer la tâche, y compris un argument --config pointant vers votre fichier config.yaml. L'exemple suivant suppose que vous avez configuré des variables d'environnement (indiquées par un signe $ suivi de majuscules) pour les valeurs de certains arguments :

    gcloud ai-platform jobs submit training $JOB_NAME \
            --package-path $APP_PACKAGE_PATH \
            --module-name $MAIN_APP_MODULE \
            --job-dir $JOB_DIR \
            --region us-central1 \
            --config config.yaml \
            -- \
            --user_arg_1 value_1 \
             ...
            --user_arg_n value_n
    

Vous pouvez également spécifier des détails de configuration du cluster avec des indicateurs de ligne de commande, plutôt que dans un fichier de configuration. Pour en savoir plus, consultez la page sur l'utilisation de ces indicateurs.

L'exemple suivant montre comment envoyer une tâche d'entraînement avec la même configuration que l'exemple précédent (en utilisant des types de machines Compute Engine avec des GPU rattachés), mais sans utiliser de fichier de configuration config.yaml :

gcloud ai-platform jobs submit training $JOB_NAME \
        --package-path $APP_PACKAGE_PATH \
        --module-name $MAIN_APP_MODULE \
        --job-dir $JOB_DIR \
        --region us-central1 \
        --scale-tier custom \
        --master-machine-type n1-highcpu-16 \
        --master-accelerator count=4,type=nvidia-tesla-t4 \
        --worker-count 9 \
        --worker-machine-type n1-highcpu-16 \
        --worker-accelerator count=4,type=nvidia-tesla-t4 \
        --parameter-server-count 3 \
        --parameter-server-machine-type n1-highmem-8 \
        -- \
        --user_arg_1 value_1 \
         ...
        --user_arg_n value_n

Notes :

  • Si vous spécifiez une option à la fois dans le fichier de configuration (config.yaml) et en tant qu'indicateur de ligne de commande, c'est la valeur de la ligne de commande qui est retenue, celle du fichier de configuration étant ignorée.
  • L'indicateur vide -- marque la fin des indicateurs propres à gcloud et le début des arguments USER_ARGS que vous souhaitez transmettre à l'application.
  • Les options spécifiques à AI Platform Training, telles que --module-name, --runtime-version et --job-dir, doivent figurer avant l'option vide --. Le service AI Platform Training interprète ces options.
  • L'option --job-dir, si elle est spécifiée, doit précéder l'option -- vide, car AI Platform Training utilise l'option --job-dir pour valider le chemin.
  • L'application doit également gérer l'indicateur --job-dir, s'il est spécifié. Même s'il est placé avant l'indicateur vide --, l'indicateur --job-dir est également transmis à l'application comme indicateur de ligne de commande.
  • Vous pouvez définir autant d'arguments USER_ARGS que nécessaire. AI Platform Training transmet les options --user_first_arg, --user_second_arg, etc. à votre application.

Pour plus de détails sur les options d'envoi de tâche, consultez le guide de démarrage d'une tâche d'entraînement.

Ajuster le code d'entraînement pour utiliser les GPU

Si vous utilisez Keras ou des Estimators pour votre tâche d'entraînement TensorFlow et que vous souhaitez réaliser l'entraînement sur une seule VM avec un seul GPU, vous n'avez pas besoin de personnaliser votre code pour le GPU.

Si votre cluster d'entraînement contient plusieurs GPU, utilisez l'API tf.distribute.Strategy dans votre code d'entraînement :

Pour personnaliser la manière dont TensorFlow attribue des opérations spécifiques aux GPU, consultez le guide TensorFlow sur l'utilisation des GPU. Dans ce cas, la page Découvrez comment AI Platform Training définit la variable d'environnement TF_CONFIG sur chaque VM peut vous être utile.

Chaînes d'appareils GPU

Le GPU unique standard_gpu d'une machine prend l'identifiant "/gpu:0". Les machines comprenant plusieurs GPU utilisent des identifiants commençant par "/gpu:0", puis "/gpu:1", etc. Par exemple, les machines complex_model_m_gpu possèdent quatre GPU, avec les identifiants "/gpu:0" à "/gpu:3".

Packages Python sur des machines compatibles GPU

tensorflow-gpu, le package Python de TensorFlow compatible avec les GPU, est préinstallé sur les machines compatibles GPU. Consultez la liste des versions d'exécution pour obtenir une liste de tous les packages préinstallés.

Événements de maintenance

Les VM compatibles GPU qui exécutent des tâches AI Platform Training sont parfois soumises à la maintenance de l'hôte Compute Engine. Les VM sont configurées de manière à redémarrer automatiquement après de tels événements de maintenance. Toutefois, vous devrez peut-être vous assurer que votre tâche est résiliente à ces arrêts. Configurez votre application d'entraînement de manière à enregistrer régulièrement les points de contrôle du modèle (généralement le long du chemin d'accès Cloud Storage spécifié via l'argument --job-dir vers gcloud ai-platform jobs submit training) et à restaurer le point de contrôle le plus récent dans le cas où un point de contrôle existe déjà.

L'API Estimators de TensorFlow effectue cela pour vous, à condition de spécifier un répertoire model_dir. L'API Estimators enregistre régulièrement les points de contrôle dans model_dir et tente de se charger depuis le dernier point de contrôle. Vous n'avez donc plus à vous préoccuper des événements de maintenance de vos nœuds de calcul GPU.

Si vous effectuez l'entraînement avec Keras, utilisez le rappel ModelCheckpoint pour enregistrer régulièrement la progression de l'entraînement. Si vous utilisez tf.distribute.Strategy avec Keras, vos VM utilisent des points de contrôle pour récupérer automatiquement les données après les redémarrages. Sinon, ajoutez une logique à votre code d'entraînement pour vérifier l'existence d'un point de contrôle récent et récupérer les données à partir du point de contrôle, s'il existe.

Pour les cas plus avancés, consultez le guide TensorFlow sur les points de contrôle.

Étapes suivantes