Entraîner ShapeMask sur Cloud TPU

Ce document explique comment exécuter le modèle ShapeMask à l'aide de Cloud TPU avec l'ensemble de données COCO.

Les instructions ci-dessous supposent que vous savez comment exécuter un modèle sur Cloud TPU. Si vous débutez avec Cloud TPU, consultez le guide de démarrage rapide pour en savoir plus.

Si vous prévoyez d'effectuer l'entraînement sur une tranche de pod TPU, consultez la section Entraîner sur des pods TPU pour comprendre les modifications de paramètres requises pour les tranches de pods.

Objectifs

  • Créer un bucket Cloud Storage pour stocker votre ensemble de données et la sortie du modèle
  • Préparer l'ensemble de données COCO
  • Configurer une VM Compute Engine et un nœud Cloud TPU pour l'entraînement et l'évaluation
  • Exécuter les tâches d'entraînement et d'évaluation sur un seul Cloud TPU ou sur un pod Cloud TPU

Coûts

Ce tutoriel utilise des composants facturables de Google Cloud, dont :

  • Instance
  • Cloud TPU
  • Cloud Storage

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

Avant de commencer ce tutoriel, vérifiez que votre projet Google Cloud est correctement configuré.

  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. Ce tutoriel utilise des composants facturables de Google Cloud. Consultez la grille tarifaire de Cloud TPU pour estimer vos coûts. Veillez à nettoyer les ressources que vous avez créées lorsque vous avez terminé, afin d'éviter des frais inutiles.

Si vous prévoyez d'entraîner un modèle sur une tranche de pod TPU, consultez la section Entraînement sur les pods TPU pour comprendre les modifications de paramètres nécessaires pour les tranches de pods.

Configurer vos ressources

Cette section fournit des informations sur la configuration des ressources Cloud Storage, de VM et Cloud TPU pour ce tutoriel.

  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. Configurez l'outil de ligne de commande gcloud pour utiliser le projet dans lequel vous souhaitez créer Cloud TPU.

    gcloud config set project ${PROJECT_ID}
    
  4. Créez un bucket Cloud Storage à l'aide de la commande suivante :

    gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 -b on gs://bucket-name
    

    Ce bucket Cloud Storage stocke les données que vous utilisez pour entraîner votre modèle, ainsi que les résultats de l'entraînement. L'outil ctpu up utilisé dans ce tutoriel définit les autorisations par défaut pour le compte de service Cloud TPU. Si vous souhaitez utiliser des autorisations plus précises, vérifiez les autorisations de niveau d'accès.

    L'emplacement du bucket doit se trouver dans la même région que votre machine virtuelle (VM) et votre nœud TPU. Les VM et les nœuds TPU sont situés dans des zones spécifiques, qui sont des subdivisions au sein d'une région.

  5. Lancez une instance de VM Compute Engine.

    $ ctpu up --zone=us-central1-a \
     --vm-only \
     --disk-size-gb=300 \
     --machine-type=n1-standard-16 \
     --tf-version=1.15.3 \
     --name=shapemask-tutorial
    
  6. La configuration que vous avez spécifiée apparaît. Saisissez y pour approuver ou n pour annuler.

  7. Une fois l'exécution de la commande ctpu up terminée, vérifiez que l'invite de l'interface système est passée de username@projectname à username@vm-name. Cette modification indique que vous êtes maintenant connecté à votre VM Compute Engine.

    gcloud compute ssh shapemask-tutorial --zone=us-central1-a
    

    À mesure que vous appliquez ces instructions, exécutez chaque commande commençant par (vm)$ dans la fenêtre de session de la VM.

  8. Créez une variable d'environnement pour stocker l'emplacement de votre bucket Cloud Storage.

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
  9. Créez une variable d'environnement pour le répertoire de données.

    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
    
  10. Clonez le dépôt tpu.

    (vm)$ git clone -b shapemask https://github.com/tensorflow/tpu/
    
  11. Installez les packages nécessaires au prétraitement des données.

    (vm)$ sudo apt-get install -y python3-tk && \
      pip3 install --user Cython matplotlib opencv-python-headless pyyaml Pillow && \
      pip3 install --user "git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI"
    

Préparer l'ensemble de données COCO

  1. Exécutez le script download_and_preprocess_coco.sh pour convertir l'ensemble de données COCO en un ensemble d'enregistrements TFRecord (*.tfrecord), format attendu par l'application d'entraînement.

    (vm)$ sudo bash /usr/share/tpu/tools/datasets/download_and_preprocess_coco.sh ./data/dir/coco
    

    Cela installe les bibliothèques requises et exécute le script de prétraitement. Il génère un certain nombre de fichiers *.tfrecord dans votre répertoire de données local.

  2. Après avoir converti les données en enregistrements TFRecord, copiez-les depuis l'espace de stockage local vers votre bucket Cloud Storage à l'aide de la commande gsutil. Vous devez également copier les fichiers d'annotation. Ces fichiers vous aident à valider les performances du modèle :

    (vm)$ gsutil -m cp ./data/dir/coco/*.tfrecord ${DATA_DIR}
    (vm)$ gsutil cp ./data/dir/coco/raw-data/annotations/*.json ${DATA_DIR}
    
    .

Configurer et démarrer Cloud TPU

  1. Lancez une ressource Cloud TPU.

    Exécutez la commande suivante pour créer un Cloud TPU.

    (vm)$ ctpu up --tpu-only \
     --tf-version=1.15.3 \
     --tpu-size=v3-8 \
     --name=shapemask-tutorial
    
  2. La configuration que vous avez spécifiée apparaît. Saisissez y pour approuver ou n pour annuler.

    Le message suivant s'affiche : Operation success; not ssh-ing to Compute Engine VM due to --tpu-only flag. Vous pouvez ignorer ce message puisque vous avez déjà effectué la propagation de clé SSH.

  3. Ajoutez une variable d'environnement pour le nom du Cloud TPU.

    (vm)$ export TPU_NAME=shapemask-tutorial
    

Exécuter le script d'entraînement et d'évaluation

  1. Créez les variables d'environnement suivantes :

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/shapemask_exp
    (vm)$ export RESNET_CHECKPOINT=gs://cloud-tpu-checkpoints/shapemask/retinanet/resnet101-checkpoint-2018-02-24
    (vm)$ export TRAIN_FILE_PATTERN=${DATA_DIR}/train-*
    (vm)$ export EVAL_FILE_PATTERN=${DATA_DIR}/val-*
    (vm)$ export VAL_JSON_FILE=${DATA_DIR}/instances_val2017.json
    (vm)$ export SHAPE_PRIOR_PATH=gs://cloud-tpu-checkpoints/shapemask/kmeans_class_priors_91x20x32x32.npy
    (vm)$ export PYTHONPATH=${PYTHONPATH}:$HOME/tpu/models
    
  2. Exécutez le script suivant pour effectuer l'entraînement.

    (vm)$ python3 ~/tpu/models/official/detection/main.py \
    --model shapemask \
    --use_tpu=True \
    --tpu=${TPU_NAME} \
    --num_cores=8 \
    --model_dir=${MODEL_DIR} \
    --mode="train" \
    --eval_after_training=True \
    --params_override="{train: {iterations_per_loop: 1000, train_batch_size: 64, total_steps: 1000, learning_rate: {total_steps: 1000, warmup_learning_rate: 0.0067, warmup_steps: 500, init_learning_rate: 0.08, learning_rate_levels: [0.008, 0.0008], learning_rate_steps: [30000, 40000]}, checkpoint: { path: ${RESNET_CHECKPOINT}, prefix: resnet101/ }, train_file_pattern: ${TRAIN_FILE_PATTERN} }, resnet: {resnet_depth: 101}, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 }, shapemask_head: {use_category_for_mask: true, shape_prior_path: ${SHAPE_PRIOR_PATH}}, shapemask_parser: {output_size: [1024, 1024]}, }"
    

À ce stade, vous pouvez terminer ce tutoriel et nettoyer vos ressources GCP, ou explorer le modèle sur un pod Cloud TPU.

Mettre à l'échelle votre modèle avec les pods Cloud TPU

Vous pouvez obtenir des résultats plus rapidement en adaptant votre modèle aux pods Cloud TPU. Le modèle Mask RCNN est totalement compatible et peut fonctionner avec les tranches de pod suivantes :

  • v2-32
  • v3-32

Lorsque vous utilisez des pods TPU Cloud, vous devez d'abord entraîner le modèle à l'aide d'un pod, puis utiliser un seul appareil Cloud TPU pour évaluer le modèle.

Entraîner avec les pods Cloud TPU

Si vous avez déjà supprimé votre instance Compute Engine, créez-en une nouvelle en suivant les étapes décrites dans la section Configurer vos ressources.

  1. Supprimez la ressource Cloud TPU que vous avez créée pour entraîner le modèle sur un appareil Cloud TPU unique.

    (vm)$ ctpu delete --tpu-only \
     --zone=us-central1-a \
     --name=shapemask-tutorial
  2. Accédez à votre bucket Cloud Storage et supprimez le fichier checkpoint.

  3. Exécutez la commande ctpu up à l'aide du paramètre tpu-size pour spécifier la tranche de pod que vous souhaitez utiliser. Par exemple, la commande suivante utilise une tranche de pod v2-32.

    (vm)$ ctpu up --tpu-only \
      --tpu-size=v2-32 \
      --zone=us-central1-a \
      --tf-version=1.15.3 \
      --name=shapemask-tutorial
    
  4. Exécutez le script suivant pour entraîner le modèle sur un pod.

    Avec la ligne de commande indiquée, l'exécution du script d'entraînement dure environ 45 minutes. Pour exécuter une convergence, définissez total_steps sur 22 000.

    (vm)$ python3 ~/tpu/models/official/detection/main.py \
    --model shapemask \
    --use_tpu=True \
    --tpu=${TPU_NAME} \
    --num_cores=32 \
    --model_dir=${MODEL_DIR} \
    --mode="train" \
    --eval_after_training=False \
    --params_override="{train: {iterations_per_loop: 1000, train_batch_size: 256, total_steps: 1000, learning_rate: {total_steps: 1000, warmup_learning_rate: 0.0067, warmup_steps: 500, init_learning_rate: 0.08, learning_rate_levels: [0.008, 0.0008], learning_rate_steps: [15000, 20000]}, checkpoint: { path: ${RESNET_CHECKPOINT}, prefix: resnet101/ }, train_file_pattern: ${TRAIN_FILE_PATTERN} }, resnet: {resnet_depth: 101}, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 }, shapemask_head: {use_category_for_mask: true, shape_prior_path: ${SHAPE_PRIOR_PATH}}, shapemask_parser: {output_size: [1024, 1024]}, }"
    
  5. Le modèle doit être évalué sur un seul appareil Cloud TPU. Supprimez l'appareil Cloud TPU du pod.

    (vm)$ ctpu delete --zone=us-central1-a \
     --tpu-only \
     --name=shapemask-tutorial
    
  6. Créez une ressource Cloud TPU unique.

    (vm)$ ctpu up --tpu-only  \
     --tpu-size=v3-8 \
     --zone us-central1-a \
     --tf-version=1.15.3 \
     --name=shapemask-tutorial
    
  7. Exécutez le script pour effectuer l'évaluation.

    (vm)$ python3 ~/tpu/models/official/detection/main.py \
    --model shapemask \
    --use_tpu=True \
    --tpu=${TPU_NAME} \
    --num_cores=8 \
    --model_dir="${MODEL_DIR} \
    --mode="eval" \
    --eval_after_training=False \
    --params_override="{train: {iterations_per_loop: 1000, train_batch_size: 256, total_steps: 1000, learning_rate: {total_steps: 1000, warmup_learning_rate: 0.0067, warmup_steps: 500, init_learning_rate: 0.08, learning_rate_levels: [0.008, 0.0008], learning_rate_steps: [15000,20000]}, checkpoint: { path: ${RESNET_CHECKPOINT}, prefix: resnet101/ }, train_file_pattern: ${TRAIN_FILE_PATTERN} }, resnet: {resnet_depth: 101}, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 }, shapemask_head: {use_category_for_mask: true, shape_prior_path: ${SHAPE_PRIOR_PATH}}, shapemask_parser: {output_size: [1024, 1024]}, }"

Nettoyer

Pour éviter que les ressources utilisées dans ce tutoriel soient facturées sur votre compte Google Cloud Platform :

  1. Déconnectez-vous de l'instance Compute Engine, si vous ne l'avez pas déjà fait :

    (vm)$ exit
    

    Votre invite devrait maintenant être username@projectname, indiquant que vous êtes dans Cloud Shell.

  2. Dans Cloud Shell, exécutez la commande ctpu delete avec l'option --zone utilisée lors de votre configuration Cloud TPU pour supprimer votre VM Compute Engine et votre Cloud TPU :

    $ ctpu delete --zone=us-central1-a \
     --name=shapemask-tutorial
    
  3. Exécutez la commande suivante pour vérifier que la VM Compute Engine et Cloud TPU ont été arrêtés :

    $ ctpu status --zone=us-central1-a \
      --name=shapemask-tutorial
    

    La suppression peut prendre plusieurs minutes. Si vous n'avez plus d'instances allouées, une réponse de ce type s'affiche :

    2018/04/28 16:16:23 WARNING: Setting zone to "us-central1-a"
    No instances currently exist.
       Compute Engine VM:     --
       Cloud TPU:             --
    
  4. Exécutez gsutil comme indiqué, en remplaçant bucket-name par le nom du bucket Cloud Storage que vous avez créé pour ce tutoriel :

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

Étape suivante

Dans ce tutoriel, vous avez entraîné le modèle ShapeMask à l'aide d'un exemple d'ensemble de données. Les résultats de cet entraînement ne sont pas utilisables pour l'inférence dans la plupart des cas. Afin d'utiliser un modèle pour l'inférence, vous pouvez entraîner les données sur un ensemble de données accessible au public ou sur votre propre ensemble de données. Les modèles entraînés sur des appareils Cloud TPU nécessitent des ensembles de données au format TFRecord.

Vous pouvez utiliser l'exemple d'outil de conversion d'ensemble de données pour convertir un ensemble de données de classification d'images au format TFRecord. Si vous n'utilisez pas de modèle de classification d'images, vous devez convertir vous-même votre ensemble de données au format TFRecord. Pour en savoir plus, consultez la section TFRecord et tf.Example.

Réglages d'hyperparamètres

Pour améliorer les performances du modèle avec votre ensemble de données, vous pouvez régler ses hyperparamètres. Vous trouverez des informations sur les hyperparamètres communs à tous les modèles compatibles avec des TPU sur GitHub. Des informations sur les hyperparamètres spécifiques au modèle sont disponibles dans le code source de chaque modèle. Pour en savoir plus sur ces réglages, consultez les pages Présentation des réglages d'hyperparamètres, Utiliser le service de réglage d'hyperparamètres et Régler les hyperparamètres.

Inférence

Une fois que vous avez entraîné votre modèle, vous pouvez l'utiliser pour l'inférence (également appelée prédiction). AI Platform est une solution basée sur le cloud permettant de développer, d'entraîner et de déployer des modèles de machine learning. Une fois un modèle déployé, vous pouvez utiliser le service AI Platform Prediction.

Entraînez le modèle à l'aide d'autres tailles d'images

Vous pouvez essayer d'utiliser un réseau de neurones plus étendu (par exemple, ResNet-101 au lieu de ResNet-50). Une image d'entrée plus grande et un réseau de neurones plus puissant permettent d'obtenir un modèle plus précis, mais plus lent.

Utilisez une base différente

Vous pouvez pré-entraîner un modèle ResNet à l'aide de votre propre ensemble de données et l'utiliser comme base pour votre modèle ShapeMask. Vous pouvez également exploiter un autre réseau de neurones que ResNet, ce qui requiert quelques étapes de configuration supplémentaires. Enfin, si vous souhaitez mettre en œuvre vos propres modèles de détection d'objets, ce réseau peut constituer une bonne base pour vos tests.