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 note dans Configurez le modèle pour exécuter le modèle DLRM ou DCN pour découvrir comment définir les paramètres. pour 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é 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 et de 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. Jusqu'à 90 Go de données de représentations vectorielles continues utilisés pour les TPU v3-8, 5,6 To pour les pods v3-512 et 22,4 To pour les pods TPU v3-2048.

Le code du modèle se trouve dans la bibliothèque TensorFlow Recommenders. tandis que le pipeline d'entrée, la configuration et la boucle d'entraînement sont décrits TensorFlow Model Garden :

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

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

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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  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 TPU que vous créez vous avez terminé avec elles pour é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 la Google Cloud CLI pour utiliser le projet dans lequel vous souhaitez créer Cloud TPU.

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

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

    gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=europe-west4

    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 tpu-vm 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 tpu-vm create dlrm-dcn-tutorial \
        --zone=europe-west4-a \
        --accelerator-type=v3-8 \
        --version=tpu-vm-tf-2.17.0-se

    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 Versions de TPU.
    version
    Version logicielle de Cloud TPU.
  7. Connectez-vous à l'instance Compute Engine à l'aide de SSH. Lorsque vous êtes connecté à la VM, votre invite de l'interface système passe de username@projectname à username@vm-name :

    gcloud compute tpus tpu-vm ssh dlrm-dcn-tutorial --zone=europe-west4-a

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 PYTHONPATH="/usr/share/tpu/models/:${PYTHONPATH}"
(vm)$ export EXPERIMENT_NAME=dlrm-exp

Définissez une variable d'environnement pour le nom du TPU.

  (vm)$ export TPU_NAME=local
  

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 les chiffres et le modèle enregistré ne seront pas significatifs.

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

.
  1. Installez les packages requis.

    (vm)$ pip3 install tensorflow-recommenders
    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
  2. Accédez au répertoire du script.

    (vm)$ cd /usr/share/tpu/models/official/recommendation/ranking
  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.

    .
    export EMBEDDING_DIM=32
    
    python3 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,${EMBEDDING_DIM}]
                 embedding_dim: ${EMBEDDING_DIM}
                 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
         "
    

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, ce qui indique que vous êtes dans Cloud Shell.

  2. Supprimez vos ressources Cloud TPU.

    $ gcloud compute tpus tpu-vm delete dlrm-dcn-tutorial \
      --zone=europe-west4-a
  3. Vérifiez que les ressources ont été supprimées en exécutant la commande gcloud compute tpus tpu-vm 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:

    $ gcloud compute tpus tpu-vm list --zone=europe-west4-a
  4. Supprimez votre bucket Cloud Storage à l'aide de gcloud CLI. Remplacez bucket-name par le nom de votre bucket Cloud Storage.

    $ gcloud storage rm gs://bucket-name --recursive

É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. Les résultats de cet entraînement ne sont pas utilisables pour l'inférence. À utiliser un modèle pour l'inférence, vous pouvez entraîner les données sur un modèle public ensemble de données ou votre propre jeu 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'outil de conversion des ensembles de données exemple pour convertir une image de classification 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 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 hyperparamètres. Vous trouverez des informations sur les hyperparamètres communs à tous les modèles compatibles avec des TPU sur GitHub. Pour en savoir plus sur les hyperparamètres propres au modèle, consultez la source de code pour chaque du modèle. Pour en savoir plus sur ces réglages, consultez les pages Présentation des réglages 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). Vous pouvez utiliser l'outil de conversion d'inférence Cloud TPU pour préparer et optimiser un modèle TensorFlow pour l'inférence sur Cloud TPU v5e. Pour en savoir plus sur l'inférence sur Cloud TPU v5e, consultez la présentation de l'inférence Cloud TPU v5e.