Entraîner DLRM et DCN sur Cloud TPU (TF 2.x)

Ce tutoriel explique comment entraîner des modèles de classement DLRM et DCN v2 pouvant être utilisés pour des tâches telles que la prédiction du taux de clics (CTR). Consultez la remarque dans la section Configurer pour exécuter le modèle DLRM ou DCN pour savoir comment définir des paramètres afin d'entraîner un modèle de classement DLRM ou DCN v2.

Les entrées du modèle sont des caractéristiques numériques et catégorielles, et la sortie est un scalaire (par exemple, une probabilité de clic). Le modèle peut être entraîné et évalué sur Cloud TPU. Les modèles de classement profond nécessitent à la fois une utilisation intensive de la mémoire (pour l'intégration de tables/recherches) et une utilisation intensive pour les réseaux profonds (MLP). Les TPU sont conçus pour les deux.

Le modèle utilise une couche d'intégration TPU pour les caractéristiques catégorielles. La couche d'intégration de représentation vectorielle continue TPU accepte les grandes tables d'intégration avec recherche rapide. La taille des tables d'intégration évolue de manière linéaire avec celle d'un pod TPU. Les TPU v3-8 acceptent les tables de représentation vectorielle continue jusqu'à 90 Go, jusqu'à 5,6 To pour un pod v3-512 et jusqu'à 22,4 To pour un pod TPU v3-2048.

Le code du modèle se trouve dans la bibliothèque d'outils de recommandation TensorFlow, tandis que le pipeline d'entrée, la configuration et la boucle d'entraînement sont décrits dans le jardin des modèles TensorFlow.

Objectifs

  • Configurer l'environnement d'entraînement
  • Exécuter la tâche d'entraînement à l'aide de données synthétiques
  • Vérifier les résultats

Coûts

Ce tutoriel utilise 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

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

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  2. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

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

    Accéder au sélecteur de projet

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

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

Configurer vos ressources

Cette section fournit des informations sur la configuration des buckets Cloud Storage, des VM et des ressources Cloud TPU utilisées par 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}
    

    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, où l'option -l spécifie la région dans laquelle le bucket doit être créé. Pour en savoir plus sur les zones et les régions, consultez la page Types et zones :

    gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 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 gcloud compute tpus execution-groups utilisé 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.

    L'emplacement du bucket doit être situé dans la même région que votre Compute Engine (VM) et votre nœud Cloud TPU.

  6. Lancez une VM Compute Engine et Cloud TPU à l'aide de la commande gcloud.

    $ gcloud compute tpus execution-groups create \
     --vm-only \
     --name=dlrm-dcn-tutorial \
     --zone=zone \
     --disk-size=300 \
     --machine-type=n1-standard-8 \
     --tf-version=2.7.0
    

    Description des options de commande

    vm-only
    Pour créer une VM uniquement. Par défaut, la commande gcloud compute tpus execution-groups crée une VM et un Cloud TPU.
    name
    Nom de la ressource Cloud TPU à créer.
    zone
    Zone dans laquelle vous prévoyez de créer votre Cloud TPU.
    disk-size
    Taille du disque dur en Go de la VM créée par la commande gcloud compute tpus execution-groups.
    machine-type
    Type de machine de la VM Compute Engine à créer.
    tf-version
    La version de Tensorflow que ctpu installe sur la VM.

    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 :

    gcloud compute ssh dlrm-dcn-tutorial --zone=zone
    

    À mesure que vous appliquez ces instructions, exécutez chaque commande commençant par (vm)$ dans votre instance Compute Engine.

Définir des variables de bucket Cloud Storage

Configurez les variables d'environnement suivantes en remplaçant bucket-name par le nom de votre bucket Cloud Storage :

(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export TPU_NAME=dlrm-dcn-tutorial
(vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/models/"
(vm)$ export EXPERIMENT_NAME=dlrm-exp

L'application d'entraînement s'attend à ce que vos données d'entraînement soient accessibles dans Cloud Storage. Elle exploite également le bucket Cloud Storage pour stocker des points de contrôle lors de l'entraînement.

Configurer pour exécuter le modèle DLRM ou DCN avec des données synthétiques

Le modèle peut être entraîné sur différents ensembles de données. Les plus couramment utilisés sont Criteo Terabyte et Criteo Kaggle. Ce tutoriel entraîne sur des données synthétiques en définissant l'option use_synthetic_data=True.

Cet ensemble de données synthétique n'est utile que pour comprendre comment utiliser un Cloud TPU et valider les performances de bout en bout. La précision et le modèle enregistré ne sont pas représentatifs.

Consultez les sites Web Criteo Terabyte et Criteo Kaggle pour savoir comment télécharger et prétraiter ces ensembles de données.

.
  1. Lancez une ressource Cloud TPU à l'aide de la commande gcloud.

    (vm)$ gcloud compute tpus execution-groups create \
     --tpu-only \
     --accelerator-type=v3-8  \
     --name=dlrm-dcn-tutorial \
     --zone=zone \
     --tf-version=2.7.0
    

    Description des options de commande

    tpu-only
    Crée le Cloud TPU sans créer de VM. Par défaut, la commande gcloud compute tpus execution-groups crée une VM et un Cloud TPU.
    accelerator-type
    Type du Cloud TPU à créer.
    name
    Nom de la ressource Cloud TPU à créer.
    zone
    Zone dans laquelle vous prévoyez de créer votre Cloud TPU.
    tf-version
    La version de Tensorflow que gcloud installe sur la VM.
  2. Installez un package requis.

    (vm)$ pip install tensorflow-recommenders
    
  3. Exécutez le script d'entraînement. Cette méthode utilise un ensemble de données factice de type Criteo pour entraîner le modèle DLRM. L'entraînement dure environ 20 minutes.

python3 /usr/share/models/official/recommendation/ranking/train.py --mode=train_and_eval \
--model_dir=${STORAGE_BUCKET}/model_dirs/${EXPERIMENT_NAME} --params_override="
runtime:
    distribution_strategy: 'tpu'
task:
    use_synthetic_data: true
    train_data:
        input_path: '${DATA_DIR}/train/*'
        global_batch_size: 16384
    validation_data:
        input_path: '${DATA_DIR}/eval/*'
        global_batch_size: 16384
    model:
        num_dense_features: 13
        bottom_mlp: [512,256,64]
        embedding_dim: 64
        top_mlp: [1024,1024,512,256,1]
        interaction: 'dot'
        vocab_sizes: [39884406, 39043, 17289, 7420, 20263, 3, 7120, 1543, 63,
            38532951, 2953546, 403346, 10, 2208, 11938, 155, 4, 976, 14,
            39979771, 25641295, 39664984, 585935, 12972, 108, 36]
trainer:
    use_orbit: false
    validation_interval: 1000
    checkpoint_interval: 1000
    validation_steps: 500
    train_steps: 1000
    steps_per_loop: 1000
"

Description des options de commande

use_orbit
Indique s'il faut utiliser la bibliothèque Orbit pour l'entraînement ou les API de compilation/ajustement Keras.
train_steps
Nombre d'étapes d'entraînement du modèle.
validation_steps
Nombre d'étapes utilisées pour exécuter l'évaluation.
validation_interval
Le nombre d'étapes d'entraînement à exécuter entre les évaluations doit être <= train_steps.
steps_per_loop
Nombre d'étapes par boucle en mode graphique. Cela réduit la communication dans un contexte rapide.

Cet entraînement dure environ 10 minutes sur un TPU v3-8. Une fois l'opération terminée, des messages semblables à ce qui suit s'affichent :

I0621 21:32:58.519792 139675269142336 tpu_embedding_v2_utils.py:907] Done with log of TPUEmbeddingConfiguration.
I0621 21:32:58.540874 139675269142336 tpu_embedding_v2.py:389] Done initializing TPU Embedding engine.
1000/1000 [==============================] - 335s 335ms/step - auc: 0.7360 - accuracy: 0.6709 - prediction_mean: 0.4984
- label_mean: 0.4976 - loss: 0.0734 - regularization_loss: 0.0000e+00 - total_loss: 0.0734 - val_auc: 0.7403
- val_accuracy: 0.6745 - val_prediction_mean: 0.5065 - val_label_mean: 0.4976 - val_loss: 0.0749
- val_regularization_loss: 0.0000e+00 - val_total_loss: 0.0749

Model: "ranking"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
tpu_embedding (TPUEmbedding) multiple                  1
_________________________________________________________________
mlp (MLP)                    multiple                  154944
_________________________________________________________________
mlp_1 (MLP)                  multiple                  2131969
_________________________________________________________________
dot_interaction (DotInteract multiple                  0
_________________________________________________________________
ranking_1 (Ranking)          multiple                  0
=================================================================
Total params: 2,286,914
Trainable params: 2,286,914
Non-trainable params: 0
_________________________________________________________________
I0621 21:43:54.977140 139675269142336 train.py:177] Train history: {'auc': [0.7359596490859985],
'accuracy': [0.67094486951828], 'prediction_mean': [0.4983849823474884], 'label_mean': [0.4975697994232178],
'loss': [0.07338511198759079], 'regularization_loss': [0], 'total_loss': [0.07338511198759079],
'val_auc': [0.7402724623680115], 'val_accuracy': [0.6744520664215088], 'val_prediction_mean': [0.5064718723297119],
'val_label_mean': [0.4975748658180237], 'val_loss': [0.07486172765493393],
'val_regularization_loss': [0], 'val_total_loss': [0.07486172765493393]}

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. Dans Cloud Shell, utilisez la commande suivante pour supprimer la VM Compute Engine et votre ressource Cloud TPU :

    $ gcloud compute tpus execution-groups delete dlrm-dcn-tutorial \
      --zone=zone
    
  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. Une réponse semblable à la suivante indique que vos instances ont bien été supprimées.

    $ gcloud compute tpus execution-groups list \
     --zone=zone
    

    Vous devriez voir une liste vide de TPU comme ci-dessous:

       NAME             STATUS
    
  4. Supprimez votre bucket Cloud Storage à l'aide de gsutil, comme indiqué ci-dessous. Remplacez bucket-name par le nom de votre bucket Cloud Storage.

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

Étape suivante

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. Dans la plupart des cas, les résultats de cet entraînement ne sont pas utilisables pour l'inférence. 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 TensorFlow entraînés sur des Cloud TPU nécessitent généralement 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 page TFRecord et tf.Example.

Réglages d'hyperparamètres

Pour améliorer les performances du modèle sur 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 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 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 votre modèle entraîné, vous pouvez l'utiliser pour l'inférence (également appelée prédiction). AI Platform est une solution 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.