Premiers pas avec l'algorithme NCF intégré

Ce tutoriel vous explique comment entraîner le modèle de filtrage collaboratif neuronal (NCF) sur l'ensemble de données MovieLens. Il couvre le prétraitement des données, l'entraînement à l'aide de l'algorithme NCF intégré, le déploiement du modèle sur AI Platform et l'envoi d'une requête de prédiction au modèle déployé.

Ensemble de données

Ce tutoriel utilise les ensembles de données MovieLens suivants pour l'entraînement et l'évaluation du modèle :

  • ml-1m (abréviation correspondant à "MovieLens 1 million")
  • ml-20m (abréviation correspondant à "MovieLens 20 million")

ml-1m

L'ensemble de données ml-1m contient 1 000 209 notes anonymes d'environ 3 066 films réalisés par 6 040 utilisateurs, qui ont rejoint MovieLens en 2000. Toutes les notes sont contenues dans le fichier "ratings.dat" sans ligne d'en-tête et sont au format suivant :

UserID::MovieID::Rating::Timestamp

  • Les ID utilisateur sont compris entre 1 et 6040.
  • Les MovieID sont compris entre 1 et 3952.
  • Les notes sont basées sur une échelle de cinq étoiles (attribution d'étoiles entières uniquement).
  • L'horodatage est représenté en secondes écoulées depuis minuit UTC le 1er janvier 1970.

ml-20m

L'ensemble de données ml-20m contient 20 000 263 notes de 138 493 utilisateurs sur 26 744 films. Tous les avis sont inclus dans le fichier "ratings.csv". Chaque ligne de ce fichier qui suit la ligne d'en-tête représente une note d'un utilisateur sur un film, au format suivant :

userId,movieId,rating,timestamp

Les lignes de ce fichier sont d'abord triées par userId. Les lignes ayant le même userID sont triées par movieId. Les notes sont basées sur une échelle de cinq étoiles, avec une incrémentation par demi-étoile (de 0,5 étoile à cinq étoiles). L'horodatage est représenté en secondes écoulées depuis minuit UTC le 1er janvier 1970. Chaque utilisateur a au moins 20 notes.

Objectifs

  • Préparer l'ensemble de données MovieLens
  • Exécuter l'évaluation et l'entraînement

Avant de commencer

  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. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  4. Activez l'API AI Platform Training & Prediction

    Activer l'API

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

    Go to project selector

  6. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  7. Activez l'API AI Platform Training & Prediction

    Activer l'API

  8. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

    En bas de la fenêtre de la console Google Cloud, une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement shell dans lequel Google Cloud CLI est déjà installé, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.

Préparer les données

  1. Dans Cloud Shell, créez et activez un environnement virtuel Python :

    (vm)$  virtualenv ncf-env
    
    (vm)$  source ncf-env/bin/activate
    
  2. Installez le code TensorFlow Model Garden :

    (vm)$  pip install tf-models-official==2.3.0
    
  3. Ajoutez des variables d'environnement pour l'URI d'un bucket Cloud Storage dans votre projet Google Cloud et pour un répertoire destiné à stocker des données dans ce bucket. Remplacez BUCKET_NAME par le nom de votre bucket.

    (vm)$ export STORAGE_BUCKET=gs://BUCKET_NAME
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/ncf_data
    
  4. Générez des données d'entraînement et d'évaluation pour l'ensemble de données ml-20m dans DATA_DIR :

    (vm)$ python -m official.recommendation.create_ncf_data \
        --dataset ml-20m \
        --num_train_epochs 4 \
        --meta_data_file_path ${DATA_DIR}/metadata \
        --eval_prebatch_size 160000 \
        --data_dir ${DATA_DIR}
    

Ce script génère et prétraite l'ensemble de données dans Cloud Shell. Le prétraitement convertit les données au format TFRecord requis par le modèle. Le téléchargement et le prétraitement prennent environ 25 minutes, et génèrent un résultat semblable à celui-ci :

I0804 23:03:02.370002 139664166737728 movielens.py:124] Successfully downloaded /tmp/tmpicajrlfc/ml-20m.zip 198702078 bytes
I0804 23:04:42.665195 139664166737728 data_preprocessing.py:223] Beginning data preprocessing.
I0804 23:04:59.084554 139664166737728 data_preprocessing.py:84] Generating user_map and item_map...
I0804 23:05:20.934210 139664166737728 data_preprocessing.py:103] Sorting by user, timestamp...
I0804 23:06:39.859857 139664166737728 data_preprocessing.py:194] Writing raw data cache.
I0804 23:06:42.375952 139664166737728 data_preprocessing.py:262] Data preprocessing complete. Time: 119.7 sec.
%lt;BisectionDataConstructor(Thread-1, initial daemon)>
General:
  Num users: 138493
  Num items: 26744

Training:
  Positive count:          19861770
  Batch size:              99000
  Batch count per epoch:   1004

Eval:
  Positive count:          138493
  Batch size:              160000
  Batch count per epoch:   866

I0804 23:07:14.137242 139664166737728 data_pipeline.py:887] Negative total vector built. Time: 31.8 seconds
I0804 23:11:25.013135 139664166737728 data_pipeline.py:588] Epoch construction complete. Time: 250.9 seconds
I0804 23:15:46.391308 139664166737728 data_pipeline.py:674] Eval construction complete. Time: 261.4 seconds
I0804 23:19:54.345858 139664166737728 data_pipeline.py:588] Epoch construction complete. Time: 248.0 seconds
I0804 23:24:09.182484 139664166737728 data_pipeline.py:588] Epoch construction complete. Time: 254.8 seconds
I0804 23:28:26.224653 139664166737728 data_pipeline.py:588] Epoch construction complete. Time: 257.0 seconds

Envoyer une tâche d'entraînement

Pour envoyer une tâche, vous devez spécifier certains arguments de base associés à l'entraînement, ainsi qu'à l'algorithme NCF.

Arguments généraux liés à la tâche d'entraînement :

Arguments de la tâche d'entraînement
Argument Description
job-id Identifiant unique de la tâche d'entraînement. Il vous permet de rechercher les journaux d'état de la tâche d'entraînement une fois celle-ci envoyée.
job-dir Chemin d'accès Cloud Storage où AI Platform Training enregistre les fichiers d'entraînement après avoir terminé une tâche d'entraînement réussie.
scale-tier Spécifie les types de machines pour l'entraînement. Utilisez le type BASIC pour sélectionner une configuration sur une seule machine.
master-image-uri URI Container Registry permettant de spécifier le conteneur Docker à utiliser pour la tâche d'entraînement. Utilisez le conteneur de l'algorithme intégré NCF défini précédemment en tant que IMAGE_URI.
region Spécifiez la région disponible dans laquelle la tâche d'entraînement doit être exécutée. Pour ce tutoriel, vous pouvez utiliser la région us-central1.

Arguments spécifiques à l'entraînement de l'algorithme NCF intégré sur MovieLens :

Arguments algorithmiques
Argument Valeur à utiliser pour ce tutoriel Description
train_dataset_path ${DATA_DIR}/training_cycle_*/* Chemin d'accès Cloud Storage où les données d'entraînement sont stockées.
eval_dataset_path ${DATA_DIR}/eval_data/* Chemin d'accès Cloud Storage où les données d'évaluation sont stockées.
input_meta_data_path ${DATA_DIR}/metadata Chemin d'accès Cloud Storage où le schéma d'entrée est stocké.
train_epochs 3 Nombre d'époques d'entraînement à exécuter.
batch_size 99000 Taille de lot pour l'entraînement.
eval_batch_size 160000 Taille de lot pour l'évaluation.
learning_rate 0.00382059 Taux d'apprentissage utilisé par l'optimiseur Adam.
beta1 0.783529 Hyperparamètres Bêta 1 pour l'optimiseur Adam.
beta2 0.909003 Hyperparamètre Bêta 2 pour l'optimiseur Adam.
epsilon 1.45439e-07 Hyperparamètre Epsilon pour l'optimiseur Adam.
num_factors 64 Taille de l'intégration du modèle MF.
hr_threshold 0.635 Valeur de la métrique d'évaluation HR à laquelle l'entraînement doit s'arrêter.
layers 256,256,128,64 Taille des couches cachées pour le MLP. Pour le format, utilisez des nombres entiers séparés par une virgule.
keras_use_ctl Vrai Utiliser une boucle d'entraînement Keras personnalisée pour l'entraînement du modèle

Pour obtenir une liste détaillée de tous les autres indicateurs d'algorithme NCF, reportez-vous à la documentation de référence de l'algorithme NCF intégré.

Exécuter la tâche d'entraînement

  1. Dans Google Cloud Console, accédez à la page AI Platform :

    Accéder à AI Platform

  2. Dans la section Entraînement de modèle, sélectionnez Entraînement avec un algorithme intégré.

  3. Dans la liste déroulante, sélectionnez NCF. Cliquez sur Suivant.

  4. Utilisez le bouton Parcourir pour sélectionner les ensembles de données d'entraînement et d'évaluation dans votre bucket Cloud Storage, puis choisissez le répertoire de sortie. Cliquez sur Suivant.

  5. Sur la page Arguments algorithmiques, utilisez les valeurs d'argument du tableau de la section précédente pour configurer la tâche d'entraînement.

  6. Attribuez un nom à votre tâche d'entraînement et utilisez le type de machine BASIC_TPU ou BASIC_GPU.

  7. Cliquez sur Envoyer pour démarrer la tâche.

Comprendre votre répertoire de tâche

Après avoir terminé une tâche d'entraînement, AI Platform Training crée un modèle entraîné dans votre bucket Cloud Storage, accompagné d'autres artefacts. La structure de répertoire suivante apparaît dans votre répertoire JOB_DIR :

  • model/ (un répertoire TensorFlow SavedModel)
    • saved_model.pb
    • assets/
    • variables/
  • summaries/ (journalisation de l'entraînement et de l'évaluation)
    • eval/
    • train/
  • différents fichiers de point de contrôle (créés et utilisés pendant l'entraînement)
    • point de contrôle
    • ctl_checkpoint-1.data-00000-of-00002
    • ...
    • ctl_checkpoint-1.index

Vérifiez que la structure de répertoires de votre fichier JOB_DIR correspond à celle décrite dans la liste précédente :

gsutil ls -a $JOB_DIR/*

Déployer le modèle entraîné

AI Platform Prediction organise vos modèles entraînés à l'aide de ressources de model et de model. Un modèle AI Platform Prediction est un conteneur pour les versions de votre modèle de machine learning.

Pour déployer un modèle, vous devez créer une ressource de modèle dans AI Platform Prediction, créer une version de ce modèle, puis utiliser le modèle et la version pour demander des prédictions en ligne.

Découvrez comment déployer des modèles sur AI Platform Prediction.

Console

  1. La page Tâches présente une liste de toutes vos tâches d'entraînement. Cliquez sur le nom de la tâche d'entraînement que vous venez d'envoyer.

  2. Sur la page Détails de la tâche, vous pouvez afficher la progression générale de la tâche ou cliquer sur Afficher les journaux pour accéder à une vue plus détaillée de la progression.

  3. Lorsque la tâche est réussie, le bouton Déployer un modèle apparaît en haut. Cliquez sur Déployer un modèle.

  4. Sélectionnez "Déployer en tant que nouveau modèle" et saisissez un nom de modèle. Ensuite, cliquez sur Confirmer.

  5. Sur la page Créer une version, saisissez un nom de version, tel que v1, et conservez les paramètres par défaut pour tous les autres champs. Cliquez sur Enregistrer.

  6. Sur la page Informations sur le modèle, le nom de votre version s'affiche. La création de la version prend quelques minutes. Lorsque la version est prête, une coche apparaît à côté de son nom.

  7. Cliquez sur le nom de la version (v1) pour accéder à la page Informations sur la version. À l'étape suivante de ce tutoriel, vous allez envoyer une requête de prédiction.

Obtenir des prédictions en ligne

Lorsque vous demandez des prédictions, vous devez formater les données d'entrée au format JSON de la manière attendue par le modèle. Les modèles NCF actuels ne prétraitent pas automatiquement les entrées.

Console

  1. Sur la page Détails de la version correspondant à la version "v1" que vous venez de créer, vous pouvez envoyer un exemple de requête de prédiction.

    Sélectionnez l'onglet Test et utilisation.

  2. Copiez l'exemple suivant dans le champ de saisie :

     {
       "instances": [{
         "duplicate_mask": [0],
         "item_id": [1],
         "train_labels": [true],
         "user_id": [1],
         "valid_point_mask": [false]
       }]
      }
    
  3. Cliquez sur Test.

    Attendez quelques instants et un vecteur de prédiction devrait être renvoyé.

Étapes suivantes