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 relatif à 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 par entropie croisée catégorique.

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

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

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 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}
    

    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.

  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 -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. 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 que vous utilisez varie selon que vous utilisez des VM TPU ou des nœuds TPU. Pour plus d'informations, consultez la page Architecture du système.

    VM TPU

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

    Description des options de commande

    zone
    Zone dans laquelle vous prévoyez de créer votre Cloud TPU.
    accelerator-type
    Type de Cloud TPU à créer.
    version
    La version d'exécution de Cloud TPU.

    Nœud TPU

    $ gcloud compute tpus execution-groups create \
    --name=mnist-tutorial \
    --zone=us-central1-b \
    --tf-version=2.4.1 \
    --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
    La version de Tensorflow que la commande gcloud est installée 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 execution-groups 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 alpha 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 les exigences TensorFlow.

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

    VM TPU

    (vm)$ git clone https://github.com/tensorflow/models.git
    (vm)$ pip3 install -r models/official/requirements.txt
    

    Nœud TPU

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

Entraînement sur un seul appareil Cloud TPU

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="${PWD}/models:${PYTHONPATH}"
    

    Nœud TPU

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    
  3. Accédez au répertoire où le modèle est stocké :

    VM TPU

    (vm)$ cd ~/models/official/vision/image_classification
    

    Nœud TPU

    (vm)$ cd /usr/share/models/official/vision/image_classification
    
  4. 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
    Le bucket Cloud Storage dans lequel 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 générés précédemment sur un TPU de la même taille et de la même version de 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 pour l'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
    Si défini sur 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
}

Nettoyer

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 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 permettant de supprimer vos ressources diffère selon que vous utilisez des VM TPU ou des nœuds TPU. Pour plus d'informations, consultez la page Architecture du système.

    VM TPU

    $ gcloud alpha 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 gcloud compute tpus execution-groups list. La suppression peut prendre plusieurs minutes. Si vous obtenez une réponse de ce type, vos instances ont bien été supprimées.

    $ gcloud compute tpus execution-groups list --zone=us-central1-b
    
    NAME             STATUS
    
  4. Supprimez votre bucket Cloud Storage à l'aide de gsutil, comme illustré ci-dessous. Remplacez bucket-name par le nom de votre bucket Cloud Storage.

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

Étape suivante

Dans ce tutoriel, vous avez entraîné le modèle de la monnaie avec 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.