Entraîner ResNet avec Cloud TPU et GKE

Ce tutoriel décrit comment entraîner le modèle TensorFlow ResNet-50 sur Cloud TPU et GKE.

Suivez les étapes suivantes pour exécuter le modèle à l'aide d'un ensemble de données factices fourni à des fins de test :

  • Créez un bucket Cloud Storage pour stocker la sortie du modèle.
  • Créez un cluster GKE pour gérer vos ressources Cloud TPU.
  • Téléchargez une spécification de tâche Kubernetes décrivant les ressources nécessaires à l'entraînement de ResNet-50 avec TensorFlow sur Cloud TPU.
  • Exécutez la tâche dans votre cluster GKE pour commencer à entraîner le modèle.
  • Vérifiez les journaux et la sortie du modèle.

Avant de commencer

  1. Connectez-vous à votre compte Google.

    Si vous n'en possédez pas déjà un, vous devez en créer un.

  2. Dans Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Cloud.

    Accéder à la page de sélection du projet

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

  4. Lorsque vous exploitez Cloud TPU avec GKE, votre projet utilise des composants facturables de Google Cloud. Consultez la grille tarifaire de Cloud TPU et celle de GKE pour estimer vos coûts, et suivez les instructions permettant de nettoyer les ressources lorsque vous n'en avez plus besoin.

  5. Activez les API suivantes sur Cloud Console :

Choisir une interface système et installer les outils de ligne de commande si nécessaire

Vous pouvez effectuer ce tutoriel à l'aide de Cloud Shell ou de votre interface système locale. Cloud Shell est préinstallé sur les outils de ligne de commande gcloud et kubectl. gcloud est l'interface de ligne de commande de Google Cloud et kubectl fournit l'interface de ligne de commande permettant d'exécuter des commandes sur les clusters Kubernetes.

Si vous préférez utiliser votre interface système locale, vous devez installer les outils de ligne de commande gcloud et kubectl dans votre environnement.

Cloud Shell

Pour lancer Cloud Shell, procédez comme suit :

  1. Accédez à Google Cloud Console.

  2. Cliquez sur le bouton Activer Cloud Shell en haut à droite de la console.

Une session Cloud Shell s'ouvre dans un cadre en bas de la console. Utilisez cette interface système pour exécuter les commandes gcloud et kubectl.

Interface système locale

Pour installer gcloud et kubectl, procédez comme suit :

  1. Installez le SDK Google Cloud, qui inclut l'outil de ligne de commande gcloud.

  2. Installez l'outil de ligne de commande kubectl en exécutant la commande suivante :

    $ gcloud components install kubectl
  3. Installez les composants gcloud, dont vous avez besoin pour exécuter GKE avec Cloud TPU.

    $ gcloud components install

Conditions requises et limites

Tenez compte des points suivants lors de la définition de la configuration :

  • Vous devez utiliser la version de GKE 1.13.4-gke.5 ou ultérieure. Vous pouvez spécifier la version en ajoutant le paramètre --cluster-version à la commande gcloud container clusters create comme décrit ci-dessous. Pour en savoir plus, consultez la documentation du SDK.
  • Vous devez utiliser TensorFlow version 1.13 ou ultérieure. Vous pouvez spécifier la version de TensorFlow dans la spécification de votre pod Kubernetes, comme dans la configuration resnet.
  • Vous devez créer les pools de nœuds et le cluster GKE dans une zone où Cloud TPU est disponible. Vous devez également créer des buckets Cloud Storage pour stocker vos données et modèles d'entraînement dans la même région que votre cluster GKE. Les zones suivantes sont disponibles :

    US

    Type de TPU (v2) Cœurs de TPU v2 Mémoire de TPU totale Région/Zone
    v2-8 8 64 Gio us-central1-b
    us-central1-c
    us-central1-f
    v2-32 32 256 Gio us-central1-a
    v2-128 128 1 Tio us-central1-a
    v2-256 256 2 Tio us-central1-a
    v2-512 512 4 Tio us-central1-a
    Type de TPU (v3) Cœurs de TPU v3 Mémoire de TPU totale Zones disponibles
    v3-8 8 128 Gio us-central1-a
    us-central1-b
    us-central1-f

    Europe

    Type de TPU (v2) Cœurs de TPU v2 Mémoire de TPU totale Région/Zone
    v2-8 8 64 Gio europe-west4-a
    v2-32 32 256 Gio europe-west4-a
    v2-128 128 1 Tio europe-west4-a
    v2-256 256 2 Tio europe-west4-a
    v2-512 512 4 Tio europe-west4-a
    Type de TPU (v3) Cœurs de TPU v3 Mémoire de TPU totale Zones disponibles
    v3-8 8 128 Gio europe-west4-a
    v3-32 32 512 Gio europe-west4-a
    v3-64 64 1 Tio europe-west4-a
    v3-128 128 2 Tio europe-west4-a
    v3-256 256 4 Tio europe-west4-a
    v3-512 512 8 Tio europe-west4-a
    v3-1024 1 024 16 Tio europe-west4-a
    v3-2048 2 048 32 Tio europe-west4-a

    Asie-Pacifique

    Type de TPU (v2) Cœurs de TPU v2 Mémoire de TPU totale Région/Zone
    v2-8 8 64 Gio asia-east1-c
  • Chaque conteneur ne peut demander qu'une ressource Cloud TPU. Toutefois, plusieurs conteneurs d'un pod peuvent en demander chacun une.
  • L'autoscaler de cluster accepte Cloud TPU sur GKE 1.11.4-gke.12 et versions ultérieures.

Configurer les données et le bucket de stockage

Vous pouvez entraîner le modèle à l'aide de l'ensemble de données factices fourni avec ce tutoriel ou de l'ensemble de données complet ImageNet. Dans les deux cas, vous devez configurer un bucket Cloud Storage, tel que décrit ci-dessous.

Utiliser l'ensemble de données factices ou ImageNet

Les instructions ci-dessous supposent que vous allez tester le modèle à l'aide d'un ensemble de données factices générées de manière aléatoire. Vous pouvez également suivre les instructions d'utilisation de l'ensemble de données complet ImageNet.

L'ensemble de données factices se trouve à l'emplacement suivant sur Cloud Storage :

gs://cloud-tpu-test-datasets/fake_imagenet

Sachez que cet ensemble de données factices ne sert qu'à vous montrer comment utiliser un Cloud TPU et à vérifier les performances de bout en bout. La précision et le modèle enregistré ne sont pas représentatifs.

Créer un bucket Cloud Storage

Vous avez besoin d'un bucket Cloud Storage pour stocker les résultats de l'entraînement du modèle de machine learning. Si vous décidez d'utiliser des données d'apprentissage réelles plutôt que l'ensemble de données factices fourni avec ce tutoriel, vous pouvez stocker les données au sein du même bucket.

  1. Accédez à la page Cloud Storage de Cloud Console.

    Accéder à la page Cloud Storage

  2. Créez un bucket en spécifiant les options suivantes :

    • Un nom unique de votre choix
    • Classe de stockage par défaut : Standard
    • Zone : us-central1

    Le bucket doit se trouver dans la même région que la ressource TPU provisionnée dans le cluster GKE.

Autoriser Cloud TPU à accéder au bucket Cloud Storage

Vous devez octroyer à votre Cloud TPU un accès en lecture/écriture à vos objets Cloud Storage. Pour ce faire, vous devez attribuer l'accès requis au compte de service utilisé par Cloud TPU. Suivez le guide pour attribuer l'accès à votre bucket de stockage .

Créer un cluster sur GKE

Vous pouvez créer un cluster GKE dans Cloud Console ou à l'aide de l'outil de ligne de commande gcloud. Sélectionnez une option ci-dessous pour consulter les instructions correspondantes :

Console

Pour créer un cluster GKE compatible avec Cloud TPU, procédez comme suit :

  1. Accédez à la page GKE de Cloud Console.

    Accéder à la page GKE

  2. Cliquez sur Créer un cluster.

  3. Sur la plage des clusters GKE, spécifiez un nom pour votre cluster. Il doit être unique dans le projet et la zone. Par exemple, tpu-models-cluster.

  4. Spécifiez la zone dans laquelle vous prévoyez d'utiliser une ressource Cloud TPU. Par exemple, sélectionnez la zone us-central1-b.

    Cloud TPU est disponible dans les zones suivantes :

    US

    Type de TPU (v2) Cœurs de TPU v2 Mémoire de TPU totale Région/Zone
    v2-8 8 64 Gio us-central1-b
    us-central1-c
    us-central1-f
    v2-32 32 256 Gio us-central1-a
    v2-128 128 1 Tio us-central1-a
    v2-256 256 2 Tio us-central1-a
    v2-512 512 4 Tio us-central1-a
    Type de TPU (v3) Cœurs de TPU v3 Mémoire de TPU totale Zones disponibles
    v3-8 8 128 Gio us-central1-a
    us-central1-b
    us-central1-f

    Europe

    Type de TPU (v2) Cœurs de TPU v2 Mémoire de TPU totale Région/Zone
    v2-8 8 64 Gio europe-west4-a
    v2-32 32 256 Gio europe-west4-a
    v2-128 128 1 Tio europe-west4-a
    v2-256 256 2 Tio europe-west4-a
    v2-512 512 4 Tio europe-west4-a
    Type de TPU (v3) Cœurs de TPU v3 Mémoire de TPU totale Zones disponibles
    v3-8 8 128 Gio europe-west4-a
    v3-32 32 512 Gio europe-west4-a
    v3-64 64 1 Tio europe-west4-a
    v3-128 128 2 Tio europe-west4-a
    v3-256 256 4 Tio europe-west4-a
    v3-512 512 8 Tio europe-west4-a
    v3-1024 1 024 16 Tio europe-west4-a
    v3-2048 2 048 32 Tio europe-west4-a

    Asie-Pacifique

    Type de TPU (v2) Cœurs de TPU v2 Mémoire de TPU totale Région/Zone
    v2-8 8 64 Gio asia-east1-c
  5. Vérifiez que vous avez alloué un quota suffisant à votre nœud Cloud TPU dans la zone spécifiée à l'étape précédente.

  6. Assurez-vous que la version du cluster est définie sur 1.13.4-gke.5 ou ultérieure, afin de permettre la compatibilité avec Cloud TPU.

  7. Faites défiler la page jusqu'en bas, puis cliquez sur Plus d'options.

  8. Définissez Champs d'application de l'accès sur Autoriser l'accès complet à l'ensemble des API Cloud. Cette option garantit que tous les nœuds du cluster ont accès au bucket Cloud Storage. Le cluster et le bucket de stockage doivent toutefois appartenir au même projet. Notez que les pods héritent par défaut des champs d'application des nœuds sur lesquels ils sont déployés. Si vous souhaitez limiter l'accès pod par pod, consultez le guide GKE sur l'authentification avec des comptes de service.

  9. Tout en bas de la page, cliquez sur Disponibilité, mise en réseau, sécurité et autres fonctionnalités. Cela ouvre une fenêtre sur la même page.

  10. Activez VPC natif (utilisation d'une adresse IP d'alias).

  11. Activez Cloud TPU.

  12. Configurez les options restantes pour le cluster comme vous le souhaitez. Vous pouvez conserver leurs valeurs par défaut.

  13. Cliquez sur Créer.

  14. Connectez-vous au cluster. Pour ce faire, sélectionnez votre cluster sur la page des clusters Kubernetes de la console et cliquez sur le bouton CONNEXION. Cette action affiche la commande gcloud à exécuter dans Cloud Shell pour connecter kubectl à ce nouveau cluster.

gcloud

Suivez les instructions ci-dessous pour configurer votre environnement et créer un cluster GKE compatible avec Cloud TPU, à l'aide de l'outil de ligne de commande gcloud :

  1. Spécifiez votre projet Google Cloud :

    $ gcloud config set project YOUR-CLOUD-PROJECT
    

    YOUR-CLOUD-PROJECT est le nom de votre projet Google Cloud.

  2. Spécifiez la zone dans laquelle vous prévoyez d'utiliser une ressource Cloud TPU. Pour cet exemple, choisissez la zone us-central1-b :

    $ gcloud config set compute/zone us-central1-b
    

    Cloud TPU est disponible dans les zones suivantes :

    US

    Type de TPU (v2) Cœurs de TPU v2 Mémoire de TPU totale Région/Zone
    v2-8 8 64 Gio us-central1-b
    us-central1-c
    us-central1-f
    v2-32 32 256 Gio us-central1-a
    v2-128 128 1 Tio us-central1-a
    v2-256 256 2 Tio us-central1-a
    v2-512 512 4 Tio us-central1-a
    Type de TPU (v3) Cœurs de TPU v3 Mémoire de TPU totale Zones disponibles
    v3-8 8 128 Gio us-central1-a
    us-central1-b
    us-central1-f

    Europe

    Type de TPU (v2) Cœurs de TPU v2 Mémoire de TPU totale Région/Zone
    v2-8 8 64 Gio europe-west4-a
    v2-32 32 256 Gio europe-west4-a
    v2-128 128 1 Tio europe-west4-a
    v2-256 256 2 Tio europe-west4-a
    v2-512 512 4 Tio europe-west4-a
    Type de TPU (v3) Cœurs de TPU v3 Mémoire de TPU totale Zones disponibles
    v3-8 8 128 Gio europe-west4-a
    v3-32 32 512 Gio europe-west4-a
    v3-64 64 1 Tio europe-west4-a
    v3-128 128 2 Tio europe-west4-a
    v3-256 256 4 Tio europe-west4-a
    v3-512 512 8 Tio europe-west4-a
    v3-1024 1 024 16 Tio europe-west4-a
    v3-2048 2 048 32 Tio europe-west4-a

    Asie-Pacifique

    Type de TPU (v2) Cœurs de TPU v2 Mémoire de TPU totale Région/Zone
    v2-8 8 64 Gio asia-east1-c
  3. Exécutez la commande gcloud container clusters pour créer un cluster sur GKE compatible avec Cloud TPU. Notez que le cluster GKE et ses pools de nœuds doivent être créés dans une zone où Cloud TPU est disponible, comme décrit dans la section sur variables d'environnement ci-dessus. La commande suivante crée un cluster nommé tpu-models-cluster :

    $ gcloud container clusters create tpu-models-cluster \
      --cluster-version=1.16 \
      --scopes=cloud-platform \
      --enable-ip-alias \
      --enable-tpu
    

    Dans la commande ci-dessus :

    • --cluster-version=1.16 indique que le cluster utilise la dernière version de Kubernetes 1.16. Vous devez utiliser la version 1.13.4-gke.5 ou ultérieure.
    • --scopes=cloud-platform garantit que tous les nœuds du cluster ont accès à votre bucket Cloud Storage dans Google Cloud défini comme YOUR-CLOUD-PROJECT ci-dessus. Le cluster et le bucket de stockage doivent toutefois appartenir au même projet. Notez que les pods héritent par défaut des champs d'application des nœuds sur lesquels ils sont déployés. Par conséquent, --scopes=cloud-platform donne le champ d'application cloud-platform à tous les pods exécutés dans le cluster . Si vous souhaitez limiter l'accès pod par pod, consultez le guide GKE sur l'authentification avec des comptes de service.
    • --enable-ip-alias indique que le cluster utilise des plages d'adresses IP d'alias. Ceci est obligatoire pour pouvoir utiliser Cloud TPU sur GKE.
    • --enable-tpu indique que le cluster doit être compatible avec Cloud TPU.

      Une fois l'exécution de la commande terminée, un message de confirmation semblable à celui-ci s'affiche :

      kubeconfig entry generated for tpu-models-cluster. NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS tpu-models-cluster us-central1-b 1.10.4-gke.2 35.232.204.86 n1-standard-2 1.10.4-gke.2 3 RUNNING

Exécuter le modèle ResNet-50

Vous pouvez désormais exécuter le modèle ResNet-50 à l'aide de Cloud TPU et de GKE.

  1. Créez une spécification de tâche dans un fichier nommé resnet_k8s.yaml :

    • Téléchargez ou copiez les spécifications de tâches préparées à partir de GitHub.
    • Dans la spécification de tâche, remplacez <my-model-bucket> par le nom du bucket Cloud Storage que vous avez créé précédemment.

    Notez que la spécification de tâche fait référence aux modèles TPU TensorFlow disponibles dans un conteneur Docker sur gcr.io/tensorflow/tpu-models. (Il s'agit d'un emplacement sur Container Registry.)

  2. Créez la tâche dans le cluster GKE :

    $ kubectl create -f resnet_k8s.yaml
    job "resnet-tpu" created
  3. Attendez que la tâche soit planifiée :

    $ kubectl get pods -w
    
    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   0/1       Pending   0          1m
    

    La durée de vie des nœuds Cloud TPU dépend des pods qui les demandent. Le Cloud TPU est créé à la demande lors de la planification du pod, et est recyclé lors de la suppression de ce dernier.

    La planification du pod prend environ cinq minutes.

    Passé ce délai, la sortie suivante s'affiche :

    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   1/1       Running   0          6m
    
  4. Consultez les journaux du pod pour surveiller la tâche :

    $ kubectl logs resnet-tpu-cmvlf

    Vous pouvez également vérifier la sortie dans le tableau de bord des charges de travail GKE de Cloud Console.

    Notez que la première entrée peut mettre un certain temps à apparaître dans les journaux. Vous pouvez vous attendre à un résultat semblable au suivant :

    I0622 18:14:31.617954 140178400511808 tf_logging.py:116] Calling model_fn.
    I0622 18:14:40.449557 140178400511808 tf_logging.py:116] Create CheckpointSaverHook.
    I0622 18:14:40.697138 140178400511808 tf_logging.py:116] Done calling model_fn.
    I0622 18:14:44.004508 140178400511808 tf_logging.py:116] TPU job name worker
    I0622 18:14:45.254548 140178400511808 tf_logging.py:116] Graph was finalized.
    I0622 18:14:48.346483 140178400511808 tf_logging.py:116] Running local_init_op.
    I0622 18:14:48.506665 140178400511808 tf_logging.py:116] Done running local_init_op.
    I0622 18:14:49.135080 140178400511808 tf_logging.py:116] Init TPU system
    I0622 18:15:00.188153 140178400511808 tf_logging.py:116] Start infeed thread controller
    I0622 18:15:00.188635 140177578452736 tf_logging.py:116] Starting infeed thread controller.
    I0622 18:15:00.188838 140178400511808 tf_logging.py:116] Start outfeed thread controller
    I0622 18:15:00.189151 140177570060032 tf_logging.py:116] Starting outfeed thread controller.
    I0622 18:15:07.316534 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed.
    I0622 18:15:07.316904 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed.
    I0622 18:16:13.881397 140178400511808 tf_logging.py:116] Saving checkpoints for 100 into gs://<my-model-bucket>/resnet/model.ckpt.
    I0622 18:16:21.147114 140178400511808 tf_logging.py:116] loss = 1.589756, step = 0
    I0622 18:16:21.148168 140178400511808 tf_logging.py:116] loss = 1.589756, step = 0
    I0622 18:16:21.150870 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed.
    I0622 18:16:21.151168 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed.
    I0622 18:17:00.739207 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed.
    I0622 18:17:00.739809 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed.
    I0622 18:17:36.598773 140178400511808 tf_logging.py:116] global_step/sec: 2.65061
    I0622 18:17:37.040504 140178400511808 tf_logging.py:116] examples/sec: 2698.56
    I0622 18:17:37.041333 140178400511808 tf_logging.py:116] loss = 2.63023, step = 200 (75.893 sec)
    
  5. Affichez le modèle entraîné à l'adresse gs://<my-model-bucket>/resnet/model.ckpt. Vous pouvez afficher les buckets sur la page Navigateur de Cloud Storage dans Cloud Console.

Nettoyer

Une fois que vous n'avez plus besoin d'utiliser Cloud TPU sur GKE, nettoyez les ressources pour éviter que des frais supplémentaires ne soient imputés à votre compte Google Cloud.

console

Supprimez le cluster GKE :

  1. Accédez à la page GKE de Cloud Console.

    Accéder à la page GKE

  2. Cochez la case située à côté du cluster que vous souhaitez supprimer.

  3. Cliquez sur Supprimer.

Lorsque vous avez fini d'examiner les données, supprimez le bucket Cloud Storage que vous avez créé au cours de ce tutoriel.

  1. Accédez à la page Cloud Storage de Cloud Console.

    Accéder à la page Cloud Storage

  2. Cochez la case située à côté du bucket que vous souhaitez supprimer.

  3. Cliquez sur Supprimer.

Consultez la grille tarifaire de Cloud Storage pour connaître les limites en matière de stockage gratuit ainsi que d'autres informations sur les tarifs.

gcloud

Si vous n'avez pas défini le projet et la zone pour cette session, faites-le maintenant. Consultez les instructions plus haut dans ce guide. Suivez ensuite cette procédure de nettoyage :

  1. Exécutez la commande suivante pour supprimer le cluster GKE, tpu-models-cluster, en remplaçant YOUR-PROJECT par le nom de votre projet Google Cloud :

    $ gcloud container clusters delete tpu-models-cluster --project=YOUR-PROJECT
    
  2. Lorsque vous avez terminé l'examen des données, exécutez la commande gsutil pour supprimer le bucket Cloud Storage que vous avez créé dans ce tutoriel. Remplacez YOUR-BUCKET par le nom de votre bucket Cloud Storage.

    $ gsutil rm -r gs://YOUR-BUCKET
    

    Consultez la grille tarifaire de Cloud Storage pour connaître les limites en matière de stockage gratuit, ainsi que d'autres informations sur les tarifs.

Étape suivante

  • Découvrez les outils TPU dans TensorBoard.
  • Exécutez d'autres modèles et tâches de récupération d'ensemble de données à l'aide de l'une des spécifications de tâche suivantes :