NCF auf Cloud TPU trainieren (TF 2.x)

Übersicht

Dies ist eine Implementierung des Frameworks für neuronale kollaborative Filterung (NCF), das ein Modell für neuronale Matrixfaktorisierungen (NeuMF) verwendet, wie im Artikel zum neuronalen kollaborativen Filtern beschrieben. Die aktuelle Implementierung basiert auf dem Code aus dem NCF-Code des Autors und der Stanford-Implementierung im MLPerf Repository.

NCF ist ein allgemeines Framework für die kollaborative Filterung von Empfehlungen, in der Interaktionen mit Nutzerobjekten durch neuronale Netzwerkarchitektur modelliert werden. Anders als bei herkömmlichen Modellen ist beim NCF die Umwandlung in die Matrixfaktorisierung (MF) mit einem inneren Produkt zu einem Late-Feature von Nutzern und Elementen nicht möglich. Es ersetzt das innere Produkt durch einen mehrschichtigen Perceptron, der eine beliebige Funktion aus Daten lernen kann.

Zwei Implementierungen von NCF sind Generalisierte Matrixfaktorfaktorisierung (GMF) und Multi-Layer Perceptron (MLP). GMF wendet einen linearen Kernel an, um die verspäteten Funktionsinteraktionen zu modellieren. MLP verwendet einen nicht linearen Kernel, um die Interaktionsfunktion aus Daten zu lernen. NeuMF ist ein zusammengeführtes Modell von GMF und MLP, mit dem komplexe Nutzerinteraktionen besser modelliert werden können. Außerdem wird die Stärke der Linearität von MF und nicht linearer Form der MLP-Modelle für die Modellierung der spätesten Strukturen der Nutzerelemente kombiniert. Mit NewFM und GMP können GM und MLP unterschiedliche Einbettungen lernen und die beiden Modelle durch Verknüpfen der letzten verborgenen Ebene verbinden. neumf_model.py definiert die Architekturdetails.

In der folgenden Anleitung wird davon ausgegangen, dass Sie bereits mit dem Trainieren eines Modells auf Cloud TPU vertraut sind. Wenn Sie Cloud TPU noch nicht kennen, finden Sie in der Kurzanleitung eine grundlegende Einführung.

Dataset

Die MovieLens-Datasets werden für das Modelltraining und die Bewertung verwendet. Insbesondere verwenden wir zwei Datasets: ml-1m (kurz für MovieLens 1 Million) und ml-20m (kurz für MovieLens 20 Millionen).

ml-1m

Das ml-1m-Dataset enthält 1.000.209 anonyme Bewertungen von ungefähr 3.706 Filmen von 6.40 Nutzern, die im Jahr 2000 MovieLens beigetreten sind. Alle Bewertungen sind in der Datei "ratings.dat" ohne Kopfzeile enthalten und haben folgendes Format:

UserID::MovieID::Rating::Timestamp

  • Nutzer-IDs zwischen 1 und 6040.
  • Die MovieIDs reichen von 1 bis 3952.
  • Die Bewertungen werden auf einer Skala von 5 Sternen bewertet (nur Bewertungen mit ganzen Sternen).

ml-20m

Das ml-20m-Dataset enthält 20.000.263 Bewertungen von 26.744 Filmen von 138493 Nutzern. Alle Bewertungen sind in der Datei "ratings.csv" enthalten. Jede Zeile dieser Datei nach der Kopfzeile steht für die Bewertung eines Films durch einen einzelnen Nutzer und hat folgendes Format:

userId,movieId,rating,timestamp

Die Zeilen in dieser Datei werden zuerst nach der Nutzer-ID, dann innerhalb des Nutzers nach movieId sortiert. Die Bewertungen werden auf einer 5-Sterne-Skala mit 50 bis 0,5 Sternen dargestellt. In beiden Datasets wird der Zeitstempel in Sekunden seit Mitternacht der koordinierten Weltzeit (UTC) vom 1. Januar 1970 dargestellt. Jeder Nutzer hat mindestens 20 Bewertungen.

Ziele

  • Cloud Storage-Bucket zum Speichern der Dataset- und Modellausgabe erstellen
  • MovieLens-Dataset vorbereiten
  • Compute Engine-VM und einen Cloud TPU-Knoten für das Training und die Bewertung einrichten
  • Training und Bewertung

Kosten

In dieser Anleitung werden kostenpflichtige Komponenten von Google Cloud verwendet, darunter:

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

Sie können mithilfe des Preisrechners die Kosten für Ihre voraussichtliche Nutzung kalkulieren. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweis

Bevor Sie mit dieser Anleitung beginnen, prüfen Sie, ob Ihr Google Cloud-Projekt ordnungsgemäß eingerichtet ist.

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  4. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  5. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  6. In dieser Anleitung werden kostenpflichtige Komponenten der Google Cloud verwendet. Rufen Sie die Seite mit den Cloud TPU-Preisen auf, um Ihre Kosten abzuschätzen. Denken Sie daran, nicht mehr benötigte Ressourcen zu bereinigen, um unnötige Kosten zu vermeiden.

Ressourcen einrichten

Dieser Abschnitt enthält Informationen zur Einrichtung von Cloud Storage-, VM- und Cloud TPU-Ressourcen für diese Anleitung.

  1. Öffnen Sie ein Cloud Shell-Fenster.

    Zu Cloud Shell

  2. Erstellen Sie eine Umgebungsvariable für die Projekt-ID.

    export PROJECT_ID=project-id
  3. Konfigurieren Sie das gcloud - Befehlszeilentool für die Verwendung des Projekts, in dem Sie die Cloud TPU erstellen möchten.

    gcloud config set project ${PROJECT_ID}
    

    Wenn Sie diesen Befehl zum ersten Mal in einer neuen Cloud Shell-VM ausführen, wird die Seite Authorize Cloud Shell angezeigt. Klicken Sie auf Authorize unten auf der Seite, um es gcloud zu erlauben, GCP API-Aufrufe mit Ihren Anmeldedaten durchzuführen.

  4. Erstellen Sie ein Dienstkonto für das Cloud TPU-Projekt.

    gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
    

    Der Befehl gibt ein Cloud TPU-Dienstkonto im folgenden Format zurück:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    
  5. Erstellen Sie mit dem folgenden Befehl einen Cloud Storage-Bucket:

    gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 gs://bucket-name
    

    Dieser Cloud Storage-Bucket speichert die Daten, die Sie zum Trainieren Ihres Modells verwenden, und die Trainingsergebnisse. Der Befehl gcloud, der in dieser Anleitung zum Einrichten der TPU verwendet wird, richtet auch Standardberechtigungen für das Cloud TPU-Dienstkonto ein, das Sie im vorherigen Schritt eingerichtet haben. Wenn Sie detailliertere Berechtigungen benötigen, können Sie die Berechtigungen auf Zugriffsebene anpassen.

    Der Bucket-Speicherort muss sich in derselben Region wie die virtuelle Maschine (VM) und der TPU-Knoten befinden. VMs und TPU-Knoten befinden sich in bestimmten Zonen, die Untergruppen innerhalb einer Region sind.

  6. Starten Sie mit dem Befehl gcloud eine Compute Engine-VM und eine Cloud TPU. Welchen Befehl Sie verwenden, hängt davon ab, ob Sie TPU-VMs oder TPU-Knoten verwenden. Weitere Informationen zu den beiden VM-Architekturen finden Sie unter Systemarchitektur.

    TPU-VM

    $ gcloud alpha compute tpus tpu-vm create ncf-tutorial \
    --zone=europe-west4-a \
    --accelerator-type=v3-8 \
    --version=v2-alpha
    

    Beschreibung der Befehls-Flags

    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten.
    accelerator-type
    Der Typ der zu erstellenden Cloud TPU.
    version
    Die Cloud TPU-Laufzeitversion.

    TPU-Knoten

    $ gcloud compute tpus execution-groups create  \
     --zone=europe-west4-a \
     --name=ncf-tutorial \
     --accelerator-type=v3-8 \
     --machine-type=n1-standard-8 \
     --disk-size=300 \
     --tf-version=2.6.0
    

    Beschreibung der Befehls-Flags

    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten.
    name
    Der TPU-Name. Wenn keine Angabe erfolgt, wird standardmäßig der Nutzername verwendet.
    accelerator-type
    Der Typ der zu erstellenden Cloud TPU.
    machine-type
    Der Maschinentyp der zu erstellenden Compute Engine-VM.
    disk-size
    Die Root-Volume-Größe Ihrer Compute Engine-VM (in GB).
    tf-version
    Die Version von Tensorflow, die von gcloud auf der VM installiert wird.

    Weitere Informationen zum Befehl gcloud finden Sie in der gcloud-Referenz.

  7. Wenn Sie nicht automatisch bei der Compute Engine-Instanz angemeldet werden, führen Sie den folgenden Befehl ssh aus. Wenn Sie bei der VM angemeldet sind, ändert sich die Shell-Eingabeaufforderung von username@projectname in username@vm-name:

    TPU-VM

    gcloud alpha compute tpus tpu-vm ssh ncf-tutorial --zone=europe-west4-a
    

    TPU-Knoten

    gcloud compute ssh ncf-tutorial --zone=europe-west4-a
    

Daten vorbereiten

  1. Fügen Sie eine Umgebungsvariable für Ihren Storage-Bucket hinzu. Ersetzen Sie bucket-name durch Ihren Bucket-Namen.

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
  2. Fügen Sie eine Umgebungsvariable für das Datenverzeichnis hinzu.

    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/ncf_data
    
  3. Richten Sie den Modellstandort ein und legen Sie die Umgebungsvariable PYTHONPATH fest.

    TPU-VM

    (vm)$ git clone https://github.com/tensorflow/models.git
    (vm)$ pip3 install -r models/official/requirements.txt
    
    (vm)$ export PYTHONPATH="${PWD}/models:${PYTHONPATH}"
    

    TPU-Knoten

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    (vm)$ pip3 install -r /usr/share/models/official/requirements.txt
    
  4. Wechseln Sie in das Verzeichnis, in dem die Modellverarbeitungsdateien gespeichert sind:

    TPU-VM

    (vm)$ cd ~/models/official/recommendation
    

    TPU-Knoten

    (vm)$ cd /usr/share/models/official/recommendation
    
  5. Generieren Sie Trainings- und Evaluationsdaten für das ml-20m-Dataset in DATA_DIR:

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

Dieses Skript generiert und verarbeitet das Dataset auf Ihrer VM. Bei der Vorverarbeitung werden die Daten für das Modell in das TFRecord-Format konvertiert. Der Download und die Vorverarbeitung dauern ungefähr 25 Minuten und generieren eine Ausgabe ähnlich der folgenden:

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

Cloud TPU einrichten und Training starten

  1. Legen Sie die Cloud TPU-Namensvariable fest.

    TPU-VM

    (vm)$ export TPU_NAME=local
    

    TPU-Knoten

    (vm)$ export TPU_NAME=ncf-tutorial
    

Training und Bewertung

Das folgende Skript führt ein Beispieltraining mit drei Epochen aus.

  1. Fügen Sie eine Umgebungsvariable für das Modellverzeichnis hinzu, um Prüfpunkte und TensorBoard-Zusammenfassungen zu speichern:

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/ncf
    
  2. Führen Sie den folgenden Befehl aus, um das NCF-Modell zu trainieren:

    (vm)$ python3 ncf_keras_main.py \
         --model_dir=${MODEL_DIR} \
         --data_dir=${DATA_DIR} \
         --train_dataset_path=${DATA_DIR}/training_cycle_*/* \
         --eval_dataset_path=${DATA_DIR}/eval_data/* \
         --input_meta_data_path=${DATA_DIR}/metadata \
         --learning_rate=3e-5 \
         --train_epochs=3 \
         --dataset=ml-20m \
         --eval_batch_size=160000 \
         --learning_rate=0.00382059 \
         --beta1=0.783529 \
         --beta2=0.909003 \
         --epsilon=1.45439e-07 \
         --dataset=ml-20m \
         --num_factors=64 \
         --hr_threshold=0.635 \
         --keras_use_ctl=true \
         --layers=256,256,128,64 \
         --use_synthetic_data=false \
         --distribution_strategy=tpu \
         --download_if_missing=false
     

Das Training und die Evaluierung dauert ungefähr zwei Minuten. Die endgültige Ausgabe sieht etwa so aus:

Result is {'loss': <tf.Tensor: shape=(), dtype=float32, numpy=0.10950611>,
'train_finish_time': 1618016422.1377568, 'avg_exp_per_second': 3062557.5070816963}

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

  1. Trennen Sie die Verbindung zur Compute Engine-Instanz, sofern noch nicht geschehen:

    (vm)$ exit
    

    Die Eingabeaufforderung sollte nun username@projectname lauten und angeben, dass Sie sich in Cloud Shell befinden.

  2. Löschen Sie Ihre Cloud TPU- und Compute Engine-Ressourcen. Der Befehl zum Löschen Ihrer Ressourcen hängt davon ab, ob Sie TPU-VMs oder TPU-Knoten verwenden. Weitere Informationen finden Sie unter Systemarchitektur.

    TPU-VM

    $ gcloud alpha compute tpus tpu-vm delete ncf-tutorial \
    --zone=europe-west4-a
    

    TPU-Knoten

    $ gcloud compute tpus execution-groups delete ncf-tutorial \
    --zone=europe-west4-a
    
  3. Prüfen Sie, ob die Ressourcen gelöscht wurden. Führen Sie dazu gcloud compute tpus execution-groups list aus. Der Löschvorgang kann einige Minuten dauern. Eine Antwort wie die folgende gibt an, dass Ihre Instanzen erfolgreich gelöscht wurden.

    TPU-VM

    $ gcloud alpha compute tpus tpu-vm list \
    --zone=europe-west4-a
    

    TPU-Knoten

    $ gcloud compute tpus execution-groups list --zone=europe-west4-a
    
    Listed 0 items.
    
  4. Führen Sie gsutil wie angegeben aus und ersetzen Sie dabei bucket-name durch den Namen des Cloud Storage-Buckets, den Sie für diese Anleitung erstellt haben:

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

Nächste Schritte

In dieser Anleitung haben Sie das NCF-Modell mithilfe eines Beispiel-Datasets trainiert. Die Ergebnisse dieses Trainings sind in den meisten Fällen nicht für die Inferenz verwendbar. Wenn Sie ein Modell für die Inferenz verwenden möchten, können Sie die Daten in einem öffentlich verfügbaren Dataset oder in Ihrem eigenen Dataset trainieren. Für Modelle, die auf Cloud TPUs trainiert wurden, müssen Datasets das Format TFRecord haben.

Sie können das Beispiel für das Dataset-Konvertierungstool verwenden, um ein Bildklassifizierungs-Dataset in das TFRecord-Format zu konvertieren. Wenn Sie kein Bildklassifizierungsmodell verwenden, müssen Sie das Dataset selbst in das TFRecords-Format konvertieren. Weitere Informationen finden Sie unter TFRecord und tf.Example.

Hyperparameter-Feinabstimmung

Sie können die Hyperparameter des Modells optimieren, um die Leistung des Modells mit Ihrem Dataset zu verbessern. Informationen zu Hyperparametern, die für alle TPU-unterstützten Modelle üblich sind, finden Sie auf GitHub. Informationen zu modellspezifischen Hyperparametern finden Sie im Quellcode für die einzelnen Modelle. Weitere Informationen zur Hyperparameter-Abstimmung finden Sie unter Übersicht über Hyperparameter-Abstimmung, Hyperparameter-Abstimmungsdienst und Hyperparameter abstimmen.

Inferenz

Sobald Ihr Modell trainiert ist, können Sie es für Inferenz (auch als Vorhersage bezeichnet) verwenden. AI Platform ist eine cloudbasierte Lösung, mit der Sie Modelle für maschinelles Lernen entwickeln, trainieren und bereitstellen können. Sobald ein Modell bereitgestellt wurde, können Sie den AI Platform Prediction-Dienst verwenden.