Cette page a été traduite par l'API Cloud Translation.
Switch to English

Entraîner ResNet sur Cloud TPU avec GKE

Objectifs

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

Ce tutoriel vous guide tout au long de la procédure d'entraînement du 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.

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 sur la version, consultez la documentation relative au SDK.
  • Vous devez utiliser TensorFlow version 1.15.3 ou ultérieure. Vous devez spécifier la version de TensorFlow utilisée par la ressource Cloud TPU dans la spécification de pod Kubernetes, comme décrit ci-dessous.
  • 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. Ce tutoriel utilise la zone us-central1-b.
  • Chaque conteneur ne peut demander qu'une ressource Cloud TPU. Toutefois, plusieurs conteneurs d'un pod Kubernetes peuvent en demander chacun une.
  • L'autoscaler de cluster accepte Cloud TPU sur GKE 1.11.4-gke.12 et versions ultérieures.
  • Votre cluster GKE doit être un cluster de VPC natif.

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 Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

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

  3. Assurez-vous que la facturation est activée pour votre projet 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 :

Créer un compte de service et 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.

  1. Ouvrez une fenêtre Cloud Shell.

    Ouvrir Cloud Shell

  2. Créez une variable pour l'ID de votre projet.

    export PROJECT_ID=project-id
    
  3. Créez un compte de service pour le projet Cloud TPU.

    gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
    

    La commande renvoie un compte de service Cloud TPU au format suivant :

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    
  4. Accédez à la page Cloud Storage de Cloud Console.

    Accéder à la page Cloud Storage

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

    • Un nom unique de votre choix
    • Type d'emplacement : region
    • Zone : us-central1
    • Classe de stockage par défaut : Standard
    • Contrôle des accès : fine-grained

    Avant d'utiliser le bucket de stockage, vous devez autoriser le compte de service Cloud TPU à y accéder. Utilisez le lien de contrôle d'accès ci-dessus pour définir des LCA précises pour votre compte de service Cloud TPU.

Créer un cluster GKE compatible avec Cloud TPU

Vous pouvez activer la compatibilité Cloud TPU sur un nouveau cluster GKE.

Créer un cluster compatible avec Cloud TPU

Vous pouvez créer un cluster compatible avec Cloud TPU à l'aide de Cloud Console ou de l'outil 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. Spécifiez le nom du cluster. Il doit être unique dans le projet et la zone.

  4. Sélectionnez le type d'emplacement zonal, puis spécifiez la zone dans laquelle vous prévoyez d'utiliser une ressource Cloud TPU. Pour ce tutoriel, sélectionnez la zone us-central1-b.

  5. Assurez-vous que la version maître est définie sur 1.13.4-gke.5 ou une version ultérieure, afin de permettre la compatibilité avec Cloud TPU.

  6. Dans le volet de navigation, sous le pool de nœuds que vous souhaitez configurer, cliquez sur Securité.

  7. Sélectionnez 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 Kubernetes 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.

  8. Dans le volet de navigation, sous Cluster, cliquez sur Réseau.

  9. Sélectionnez Activer le routage du trafic de VPC natif (utilisation d'une adresse IP d'alias). Vous devez créer un réseau VPC si aucun réseau n'existe pour le projet en cours.

  10. Dans le volet de navigation, sous Cluster, cliquez sur Fonctionnalités.

  11. Sélectionnez Activer 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 Create (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 établir la connexion.

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 gcloud :

  1. Installez les composants gcloud dont vous avez besoin pour exécuter GKE avec Cloud TPU :

    $ gcloud components install kubectl 
  2. Configurez gcloud avec l'ID de votre projet Google Cloud :

    $ gcloud config set project project-name
    

    Remplacez project-name par le nom de votre projet Google Cloud.

    La première fois que vous exécutez cette commande dans une nouvelle VM Cloud Shell, une page Authorize Cloud Shell s'affiche. Cliquez sur Authorize en bas de la page pour permettre à gcloud d'effectuer des appels d'API GCP avec vos identifiants.

  3. Configurez gcloud avec la zone dans laquelle vous prévoyez d'utiliser une ressource Cloud TPU. Pour ce tutoriel, utilisez la zone us-central1-b:

    $ gcloud config set compute/zone us-central1-b
    
  4. Exécutez la commande gcloud container clusters create pour créer un cluster sur GKE compatible avec Cloud TPU. Dans la commande suivante, remplacez cluster-name par le nom de cluster de votre choix :

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

    Description des options de commande

    cluster-version
    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
    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 Kubernetes 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 Kubernetes 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.
    tpu-ipv4-cidr (facultatif, non spécifié ci-dessus)
    Indique la plage CIDR à utiliser pour Cloud TPU. Spécifiez l'élément IP_RANGE sous la forme IP/20, par exemple 10.100.0.0/20. Si vous ne définissez pas cet indicateur, une plage CIDR de taille /20 est automatiquement allouée et attribuée.

    Une fois le cluster créé, un message de ce type doit s'afficher :

    NAME             LOCATION       MASTER_VERSION    MASTER_IP     MACHINE_TYPE   NODE_VERSION      NUM_NODES  STATUS
    cluster-resnet  us-central1-b  1.16.15-gke.4901  34.71.245.25  n1-standard-1  1.16.15-gke.4901  3          RUNNING
    

Afficher les opérations

L'activation de la prise en charge de Cloud TPU lance une opération de mise à jour. Pour les clusters zonaux, cette opération prend environ cinq minutes. Pour les clusters régionaux, elle prend environ 15 minutes, selon la région du cluster.

Pour répertorier toutes les opérations en cours ou terminées dans le cluster, exécutez la commande suivante :

   $ gcloud container operations list
   

Pour obtenir plus d'informations sur une opération spécifique, exécutez la commande suivante :

   $ gcloud container operations describe operation-id
   

Remplacez operation-id par l'ID de l'opération spécifique.

Spécification de la tâche GKE / ResNet

La spécification de tâche utilisée par ce tutoriel (illustrée ci-dessous) demande un appareil Cloud TPU préemptif v2 doté de TensorFlow 2.3. Il démarre également un processus TensorBoard.

La durée de vie des nœuds Cloud TPU dépend des pods Kubernetes qui les demandent. La ressource Cloud TPU est créée à la demande lors de la programmation du pod Kubernetes et elle est recyclée lorsque celui-ci est supprimé.

apiVersion: batch/v1
kind: Job
metadata:
  name: resnet-tpu
spec:
  template:
    metadata:
      annotations:
        # The Cloud TPUs that will be created for this Job will support
        # TensorFlow 2.3. This version MUST match the
        # TensorFlow version that your model is built on.
        tf-version.cloud-tpus.google.com: "2.3"
    spec:
      restartPolicy: Never
      containers:
      - name: resnet-tpu
        # The official TensorFlow 2.3.0 image.
        # https://hub.docker.com/r/tensorflow/tensorflow
        image: tensorflow/tensorflow:2.3.0
        command:
        - bash
        - -c
        - |
          pip install tf-models-official==2.3.0
          python3 -m official.vision.image_classification.resnet.resnet_ctl_imagenet_main \
            --tpu=$(KUBE_GOOGLE_CLOUD_TPU_ENDPOINTS) \
            --distribution_strategy=tpu \
            --steps_per_loop=500 \
            --log_steps=500 \
            --use_synthetic_data=true \
            --dtype=fp32 \
            --enable_tensorboard=true \
            --train_epochs=90 \
            --epochs_between_evals=1 \
            --batch_size=1024 \
            --model_dir=gs://bucket-name/resnet
        resources:
          limits:
            # Request a single Preemptible v2-8 Cloud TPU device to train the
            # model. A single v2-8 Cloud TPU device consists of 4 chips, each of
            # which has 2 cores, so there are 8 cores in total.
            cloud-tpus.google.com/preemptible-v2: 8
      - name: tensorboard
        image: tensorflow/tensorflow:2.2.0
        command:
        - bash
        - -c
        - |
          pip install tensorboard-plugin-profile==2.3.0 cloud-tpu-client
          tensorboard --logdir=gs://bucket-name/resnet --port=6006
        ports:
        - containerPort: 6006

Créer la tâche

Pour créer la tâche dans le cluster GKE, procédez comme suit :

  1. À l'aide d'un éditeur de texte, créez une spécification de tâche example-job.yaml, puis copiez-collez les informations dans la spécification de tâche présentée ci-dessus. Veillez à remplacer la variable bucket-name dans le paramètre --model_dir et dans la commande Tensorboard par le nom de votre bucket de stockage.

  2. Exécutez la tâche :

    $ kubectl create -f example-job.yaml
    

    Cette commande crée la tâche qui planifie automatiquement le pod et doit renvoyer le résultat suivant.

    job "resnet-tpu" created
  3. Vérifiez que le pod Kubernetes a été planifié et que les nœuds Cloud TPU ont été provisionnés. Un pod Kubernetes demandant des nœuds Cloud TPU peut donc se retrouver en attente pendant cinq minutes avant d'être exécuté. Vous verrez une sortie semblable à la suivante jusqu'à ce que le pod Kubernetes soit planifié.

    $ kubectl get pods -w
    
    Le résultat initial se présente comme suit :
    
    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   0/1       Pending   0          1m
    

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

    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   1/1       Running   0          6m
    

  4. Lorsque STATUS affiche running, l'entraînement a démarré. Saisissez CTRL-C pour quitter le processus kubectl get pods -w.

Afficher l'état et les journaux du conteneur TensorBoard et Cloud TPU

Suivez ces étapes pour vérifier l'état et afficher les journaux des instances Cloud TPU et TensorBoard utilisées par vos pods Kubernetes.

  1. Créez des spécifications de déploiement et de service en procédant comme suit :

    Accéder à la page GKE

  2. Dans la barre de navigation de gauche, cliquez sur Charges de travail.

  3. Sélectionnez votre tâche. Vous êtes alors dirigé vers une page avec le titre Pods gérés.

  4. Sous Pods gérés, sélectionnez votre pod Kubernetes. Vous êtes alors redirigé vers une page contenant un titre Conteneurs.

  5. La liste des conteneurs est affichée sous Conteneurs. Cette liste inclut toutes les instances Cloud TPU et TensorBoard. Les informations suivantes s'affichent pour chaque conteneur:

    1. État d'exécution
    2. Un lien vers les journaux du conteneur

Visualiser les métriques et analyser les performances à l'aide de TensorBoard

TensorBoard est une suite d'outils conçus pour offrir une présentation visuelle des métriques TensorFlow. TensorBoard peut aider à identifier les goulots d'étranglement lors du traitement et suggérer des méthodes permettant d'améliorer les performances.

TensorFlow Profiler est un plug-in TensorBoard qui permet de capturer un profil sur une ressource Cloud TPU individuelle ou sur un pod Cloud TPU. Ce profil peut ensuite être visualisé sur TensorBoard. Reportez-vous à la documentation sur les outils TPU pour plus de détails sur les outils de visualisation et les informations pouvant être capturées.

Pour exécuter TensorBoard dans le cluster GKE, procédez comme suit :

  1. Suivez les étapes pour afficher l'état de TensorBoard et vérifier que l'instance TensorBoard s'exécute dans un conteneur.

  2. Transfert de port vers le pod Kubernetes TensorBoard :

    $ kubectl port-forward pod/resnet-tpu-pod-id 6006
    

    pod-id correspond au dernier ensemble de chiffres du nom de votre pod GKE affiché dans la console sous : Kubernetes Engine > Charges de travail > Pods gérés. Exemple : resnet-tpu-wxskc.

  3. Dans la barre en haut à droite de la session Cloud Shell, cliquez sur le bouton Aperçu sur le Web et ouvrez le port 6006 pour afficher le résultat de TensorBoard. L'UI TensorBoard s'affiche dans un onglet de votre navigateur.

  4. Sélectionnez PROFIL dans le menu déroulant situé en haut à droite de la page TensorBoard.

  5. Cliquez sur le bouton CAPTURER LE PROFIL sur la page PROFIL.

  6. Dans le menu pop-up, sélectionnez le type d'adresse du nom du TPU et saisissez le nom du TPU. Le nom de la ressource TPU apparaît dans Cloud Console sur la page Compute Engine > TPU, au format suivant :

    gke-cluster-name-cluster-id-tpu-tpu-id
    
    Exemple :
    gke-demo-cluster-25cee208-tpu-4b90f4c5

  7. Cliquez sur le bouton CAPTURE dans le menu pop-up lorsque vous êtes prêt à commencer le profilage, puis attendez quelques secondes que le profil soit terminé.

  8. Actualisez le navigateur pour voir les données de traçage sous l'onglet PROFIL de TensorBoard.

Pour en savoir plus sur la capture et l'interprétation des profils, consultez le guide de TensorFlow Profiler.

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

  1. Exécutez la commande suivante pour supprimer votre cluster GKE, en remplaçant cluster-name par le nom de votre cluster et project-name par le nom de votre projet Google Cloud :

    $ gcloud container clusters delete cluster-name --zone=us-central1-b --project=project-name
    

    Cette commande supprime le cluster, le conteneur et la ressource Cloud TPU.

  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 bucket-name par le nom de votre bucket Cloud Storage.

    $ gsutil rm -r gs://bucket-name
    

    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

  • 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 :