Exécuter MNIST sur Cloud TPU (TF 2.x)


Ce tutoriel propose une vue d'ensemble du modèle MNIST, décrit comment télécharger l'exemple de code de TPU MNIST TensorFlow et fournit un guide pour l'exécution du code sur Cloud TPU.

Clause de non-responsabilité

Ce tutoriel utilise un ensemble de données tiers. Google ne formule aucune déclaration ni garantie quant à la validité ou à tout autre aspect de cet ensemble de données.

Description du modèle

L'ensemble de données MNIST contient un grand nombre d'images de chiffres manuscrits compris entre 0 et 9, ainsi que les étiquettes qui identifient le chiffre de chaque image.

Ce tutoriel entraîne un modèle de machine learning afin de classer des images en se basant sur l'ensemble de données MNIST. Après l'apprentissage, le modèle classe les images entrantes en 10 catégories (0 à 9) en fonction de ce qu'il a appris au sujet des images manuscrites de l'ensemble de données MNIST. Vous pouvez ensuite envoyer une image inconnue au modèle, qui va en identifier le chiffre en se basant sur l'apprentissage reçu.

L'ensemble de données MNIST a été divisé en trois parties :

  • 60 000 exemples de données d'entraînement
  • 10 000 exemples de données de test
  • 5 000 exemples de données de validation

Le modèle est constitué d'une combinaison de sept couches :

  • deux couches de convolution
  • deux couches de pooling maximal
  • deux couches denses (entièrement connectées)
  • une couche d'abandon

La perte est calculée à l'aide d'une entropie croisée catégorielle.

Cette version du modèle MNIST utilise l'API Keras, une méthode recommandée pour créer et exécuter un modèle de machine learning sur un Cloud TPU.

Keras simplifie le processus de développement du modèle en masquant la plupart des implémentations de bas niveau, ce qui facilite également le passage du TPU à d'autres plates-formes de test, comme les GPU ou les processeurs.

Objectifs

  • Créer un bucket Cloud Storage pour stocker votre ensemble de données et la sortie du modèle
  • Exécuter la tâche d'entraînement
  • Vérifier les résultats

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

  • Compute Engine
  • 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

Cette section fournit des informations sur la configuration du bucket Cloud Storage et d'une VM Compute Engine.

  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 Google Cloud CLI pour utiliser le projet dans lequel vous souhaitez créer Cloud TPU.

    gcloud config set project ${PROJECT_ID}
    

    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 autoriser gcloud à effectuer des appels d'API Google Cloud avec vos identifiants.

  4. 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
    

  5. Créez un bucket Cloud Storage à l'aide de la commande suivante :

    gsutil mb -p ${PROJECT_ID} -c standard -l us-central1 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. La commande gcloud utilisée dans ce tutoriel définit les autorisations par défaut pour le compte de service Cloud TPU que vous avez configuré à l'étape précédente. Si vous souhaitez utiliser des autorisations plus précises, vérifiez les autorisations de niveau d'accès.

  6. Lancez une VM Compute Engine et Cloud TPU à l'aide de la commande gcloud. La commande à utiliser varie selon que vous utilisez des VM TPU ou des nœuds TPU. Pour en savoir plus, consultez la page Architecture du système.

    VM TPU

    $ gcloud compute tpus tpu-vm create mnist-tutorial \
    --zone=us-central1-b \
    --accelerator-type=v3-8 \
    --version=tpu-vm-tf-2.16.1-pjrt \
    

    Description des options de commande

    zone
    Zone dans laquelle vous prévoyez de créer votre Cloud TPU.
    accelerator-type
    Le type d'accélérateur spécifie la version et la taille de la ressource Cloud TPU que vous souhaitez créer. Pour en savoir plus sur les types d'accélérateurs compatibles avec chaque version de TPU, consultez la section Versions de TPU.
    version
    Version du logiciel Cloud TPU.

    Nœud TPU

    $ gcloud compute tpus execution-groups create \
    --name=mnist-tutorial \
    --zone=us-central1-b \
    --tf-version=2.12.0 \
    --machine-type=n1-standard-1 \
    --accelerator-type=v3-8 \
    

    Description des options de commande

    name
    Nom du Cloud TPU à créer.
    zone
    Zone dans laquelle vous prévoyez de créer votre Cloud TPU.
    tf-version
    Version de TensorFlow que la commande gcloud installe sur votre VM.
    machine-type
    Type de machine de la VM Compute Engine à créer.
    accelerator-type
    Type de Cloud TPU à créer.

    Pour en savoir plus sur la commande gcloud, consultez la documentation de référence de gcloud.

  7. Une fois l'exécution de la commande gcloud compute tpus 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.

    Si vous n'êtes pas connecté à l'instance Compute Engine, vous pouvez vous connecter en exécutant la commande suivante :

    VM TPU

    gcloud compute tpus tpu-vm ssh mnist-tutorial --zone=us-central1-b
    

    Nœud TPU

    gcloud compute ssh mnist-tutorial --zone=us-central1-b
    

    À 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 le nom du TPU.

    VM TPU

    (vm)$ export TPU_NAME=local
    

    Nœud TPU

    (vm)$ export TPU_NAME=mnist-tutorial
    
  9. Installez la configuration requise pour TensorFlow.

    La commande à utiliser varie selon que vous utilisez des VM TPU ou des nœuds TPU.

    VM TPU

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
    

    Nœud TPU

    (vm)$ pip3 install --user tensorflow-model-optimization>=0.1.3
    

Entraîner le modèle

Le code source du modèle de TPU MNIST est disponible sur GitHub.

  1. Définissez ces variables : Remplacez bucket-name par le nom de votre bucket :

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mnist
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/data
    
  2. Définissez la variable d'environnement PYTHONPATH.

    VM TPU

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"
    

    Nœud TPU

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    
  3. Lors de la création de votre TPU, si vous définissez le paramètre --version sur une version se terminant par -pjrt, définissez les variables d'environnement suivantes pour activer l'environnement d'exécution PJRT:

      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
    
  4. Accédez au répertoire où le modèle est stocké :

    VM TPU

    (vm)$ cd /usr/share/tpu/models/official/legacy/image_classification
    

    Nœud TPU

    (vm)$ cd /usr/share/models/official/legacy/image_classification
    
  5. Exécutez le script d'entraînement MNIST :

    (vm)$ python3 mnist_main.py \
      --tpu=${TPU_NAME} \
      --model_dir=${MODEL_DIR} \
      --data_dir=${DATA_DIR} \
      --train_epochs=10 \
      --distribution_strategy=tpu \
      --download
    

    Description des options de commande

    tpu
    Nom du Cloud TPU. S'il n'est pas spécifié lors de la configuration de la VM Compute Engine et du Cloud TPU, votre nom d'utilisateur est utilisé par défaut.
    model_dir
    Bucket Cloud Storage où les points de contrôle et les résumés sont stockés pendant l'entraînement. Vous pouvez utiliser un dossier existant pour charger des points de contrôle précédemment créés sur un TPU de la même taille et de la même version TensorFlow.
    data_dir
    Chemin d'accès Cloud Storage de l'entrée d'entraînement. Dans cet exemple, il est défini sur l'ensemble de données fake_imagenet.
    train_epochs
    Nombre d'époques d'entraînement du modèle.
    distribution_strategy
    Pour entraîner le modèle ResNet sur un Cloud TPU, définissez distribution_strategy sur tpu.
    download
    Lorsque la valeur est true, le script télécharge et prétraite l'ensemble de données MNIST, s'il n'a pas déjà été téléchargé.

Le script d'entraînement s'exécute en moins de cinq minutes sur un Cloud TPU v3-8 et affiche un résultat semblable à celui-ci :

Run stats:
{
  'accuracy_top_1': 0.9762369990348816,
  'eval_loss': 0.07863274961709976,
  'loss': 0.1111728847026825,
  'training_accuracy_top_1': 0.966645359992981
}

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

  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. Supprimez vos ressources Cloud TPU et Compute Engine. La commande à utiliser pour supprimer vos ressources varie selon que vous utilisez des VM TPU ou des nœuds TPU. Pour en savoir plus, consultez la page Architecture du système.

    VM TPU

    $ gcloud compute tpus tpu-vm delete mnist-tutorial \
    --zone=us-central1-b
    

    Nœud TPU

    $ gcloud compute tpus execution-groups delete mnist-tutorial \
    --zone=us-central1-b
    
  3. Vérifiez que les ressources ont été supprimées en exécutant la commande gcloud compute tpus execution-groups list. La suppression peut prendre plusieurs minutes. Le résultat de la commande suivante ne doit inclure aucune des ressources créées dans ce tutoriel:

    VM TPU

    $ gcloud compute tpus tpu-vm list --zone=us-central1-b

    Nœud TPU

    $ gcloud compute tpus execution-groups list --zone=us-central1-b
  4. Supprimez votre bucket Cloud Storage à l'aide de gsutil comme indiqué dans l'exemple suivant. Remplacez bucket-name par le nom de votre bucket Cloud Storage.

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

Étapes suivantes

Les tutoriels TensorFlow Cloud TPU permettent généralement d'entraîner le modèle à 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. Pour utiliser un modèle pour l'inférence, vous pouvez entraîner les données sur un ensemble de données public ou sur votre propre ensemble de données. Les modèles TensorFlow entraînés sur des Cloud TPU nécessitent généralement que les ensembles de données soient 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 devrez convertir votre ensemble de données au format TFRecord. Pour en savoir plus, consultez TFRecord et tf.Example.

Réglage des hyperparamètres

Pour améliorer les performances du modèle avec votre ensemble de données, vous pouvez régler les hyperparamètres du modèle. Vous trouverez des informations sur les hyperparamètres communs à tous les modèles compatibles avec TPU sur GitHub. Des informations sur les hyperparamètres propres aux modèles sont disponibles dans le code source de chaque modèle. Pour en savoir plus sur ces réglages, consultez les pages Présentation du réglage des 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). Vous pouvez utiliser le convertisseur d'inférence Cloud TPU pour préparer et optimiser un modèle TensorFlow pour l'inférence sur Cloud TPU v5e. Pour plus d'informations sur l'inférence sur Cloud TPU v5e, consultez la page Présentation de l'inférence pour Cloud TPU v5e.