Addestramento di NCF su Cloud TPU (TF 2.x)


Panoramica

Si tratta di un'implementazione del framework di filtro collaborativo neurale (NCF) che utilizza un modello di fattorizzazione della matrice neurale (NeuMF) come descritto nel documento sul filtro collaborativo neurale. L'implementazione attuale si basa sul codice del codice NCF degli autori e sull'implementazione di Stanford nel repository MLPerf.

NCF è un framework generale per il filtro collaborativo dei consigli in cui viene utilizzata un'architettura di rete neurale per modellare le interazioni utente-elemento. NCF sostituisce il prodotto interno con un perceptron multistrato che può apprendere una funzione arbitraria dai dati.

Due implementazioni di NCF sono la fattorizzazione generalizzata della matrice (GMF) e Perceptron a più strati (MLP). GMF applica un kernel lineare per modellare il modello latente le interazioni delle caratteristiche e MLP usa un kernel non lineare per apprendere una funzione dai dati. NeuMF è un modello combinato di GMF e MLP per migliorare interazioni utente-elemento complesso e unifica i punti di forza della linearità di MF e non linearità dell'MLP per la modellazione delle strutture latenti degli elementi utente. NeuMF consente a GMF e MLP di apprendere embedding separati e combina i due modelli concatenando il loro ultimo livello nascosto. neumf_model.py definisce i dettagli dell'architettura.

Le seguenti istruzioni presuppongono che tu abbia familiarità con l'addestramento di un modello con Cloud TPU. Se non hai mai utilizzato Cloud TPU, consulta Inizia per un'introduzione di base.

Set di dati

I set di dati MovieLens vengono utilizzati per l'addestramento e la valutazione del modello. Usiamo due set di dati: ml-1m (abbreviazione di MovieLens 1 milione) e ml-20m (abbreviazione di MovieLens 1 milione) 20 milioni).

ml-1m

Il set di dati ml-1m contiene 1.000.209 di valutazioni anonime di circa 3.706 film 6040 utenti che si sono uniti a MovieLens nel 2000. Tutte le valutazioni sono contenute nel file "ratings.dat" senza riga di intestazione e sono nel seguente formato:

UserID::MovieID::Rating::Timestamp

  • Gli ID utente sono compresi tra 1 e 6040.
  • I valori MovieID sono compresi tra 1 e 3952.
  • Le valutazioni vengono effettuate su una scala da 1 a 5 stelle (solo stelle intere).

ml-20m

Il set di dati ml-20m contiene 20.000.263 valutazioni di 26.744 film da parte di 138.493 utenti. Tutte le valutazioni sono contenute nel file "ratings.csv". Ogni riga di questo file dopo la riga di intestazione rappresenta la valutazione di un film da parte di un singolo utente e ha il seguente formato:

userId,movieId,rating,timestamp

Le righe all'interno di questo file sono ordinate prima per userId, poi, all'interno dell'utente, per movieId. Le valutazioni vengono effettuate su una scala di 5 stelle, con incrementi di mezza stella (0,5 stelle - 5 stelle). In entrambi i set di dati, il timestamp è rappresentato in secondi dalla mezzanotte UTC (Coordinated Universal Time) del 1° gennaio 1970. Ciascuna l'utente ha almeno 20 valutazioni.

Obiettivi

  • Crea un bucket Cloud Storage per conservare il set di dati e l'output del modello
  • Preparare il set di dati MovieLens
  • Configura una VM di Compute Engine e un nodo Cloud TPU per l'addestramento e la valutazione
  • Esegui addestramento e valutazione

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

Per generare una stima dei costi basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Prima di iniziare

Prima di iniziare questo tutorial, controlla che il progetto Google Cloud sia configurato correttamente.

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  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. Questa procedura dettagliata utilizza i componenti fatturabili di Google Cloud. Consulta la pagina Prezzi per Cloud TPU per stimare i costi. Una volta terminato il loro utilizzo, pulisci le risorse create per evitare addebiti non necessari.

Configura le risorse

Questa sezione fornisce informazioni sulla configurazione delle risorse Cloud Storage, VM e Cloud TPU per questo tutorial.

  1. Apri una finestra di Cloud Shell.

    Apri Cloud Shell

  2. Crea una variabile di ambiente per l'ID del progetto.

    export PROJECT_ID=project-id
  3. Configura Google Cloud CLI in modo da utilizzare il progetto in cui vuoi creare la Cloud TPU.

    gcloud config set project ${PROJECT_ID}

    La prima volta che esegui questo comando in una nuova VM Cloud Shell, Viene visualizzata la pagina Autorizza Cloud Shell. Fai clic su Autorizza nella parte inferiore della pagina per consentire a gcloud di effettuare chiamate API con le tue credenziali.

  4. Crea un account di servizio per il progetto Cloud TPU.

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

    Il comando restituisce un account di servizio Cloud TPU con il seguente formato:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    
  5. Crea un bucket Cloud Storage utilizzando il seguente comando:

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

    Questo bucket Cloud Storage archivia i dati che utilizzi per addestrare il modello e i risultati dell'addestramento. Il comando gcloud utilizzato in questo tutorial per configurare la TPU configura anche le autorizzazioni predefinite per l'account di servizio Cloud TPU configurato nel passaggio precedente. Se vuoi autorizzazioni più granulari, consulta le autorizzazioni a livello di accesso.

    La località del bucket deve trovarsi nella stessa regione della VM TPU. Le VM TPU si trovano in zone specifiche, ovvero suddivisioni all'interno di una regione.

  6. Crea una VM Cloud TPU.

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

    Descrizioni flag di comando

    zone
    La zona in cui prevedi di creare la tua Cloud TPU.
    accelerator-type
    Il tipo di acceleratore specifica la versione e le dimensioni della Cloud TPU che vuoi creare. Per ulteriori informazioni sui tipi di acceleratori supportati per ogni versione di TPU, consulta Versioni di TPU.
    version
    La versione software di Cloud TPU.

    Per ulteriori informazioni sul comando gcloud, consulta la documentazione di riferimento di gcloud.

  7. Connettiti all'istanza Compute Engine tramite SSH. Quando sei connesso alla VM, il prompt della shell cambia da username@projectname a username@vm-name:

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

Prepara i dati

  1. Aggiungi una variabile di ambiente per il bucket di archiviazione. Sostituisci bucket-name con il nome del tuo bucket.

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
  2. Aggiungi una variabile di ambiente per la directory dei dati.

    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/ncf_data
  3. Configura la posizione del modello e imposta la variabile di ambiente PYTHONPATH.

    (vm)$ git clone https://github.com/tensorflow/models.git
    (vm)$ pip3 install -r models/official/requirements.txt
    (vm)$ export PYTHONPATH="${PWD}/models:${PYTHONPATH}"
  4. Passa alla directory in cui sono archiviati i file di elaborazione del modello:

      (vm)$ cd ~/models/official/recommendation
  5. Generare dati di addestramento e valutazione per il set di dati ML-20m 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}

Questo script genera e pre-elabora il set di dati sulla tua VM. Pre-elaborazione converte i dati nel formato TFRecord richiesto dal modello. Le istruzioni di download e la pre-elaborazione richiede circa 25 minuti e genera un output simile le seguenti:

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

Configura e avvia l'addestramento della Cloud TPU

  1. Imposta la variabile nome Cloud TPU.

      (vm)$ export TPU_NAME=local

Esegui l'addestramento e la valutazione

Lo script seguente esegue un addestramento di esempio per 3 epoche,

  1. Aggiungi una variabile di ambiente per la directory Model per salvare i checkpoint e i riepiloghi di TensorBoard:

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/ncf
  2. Quando crei la TPU, se imposti il parametro --version su una versione che termina con -pjrt, imposta le seguenti variabili di ambiente per attivare il runtime PJRT:

      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
  3. Esegui il seguente comando per addestrare il modello NCF:

    (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
     

L'addestramento e la valutazione richiedono circa 2 minuti e generano un output finale simile a questo:

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

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

  1. Se non l'hai ancora fatto, disconnetti dall'istanza Compute Engine:

    (vm)$ exit

    Il tuo prompt ora dovrebbe essere username@projectname, a indicare che ti trovi in in Cloud Shell.

  2. Elimina le tue risorse Cloud TPU.

      $ gcloud compute tpus tpu-vm delete ncf-tutorial \
        --zone=europe-west4-a
  3. Verifica che le risorse siano state eliminate eseguendo gcloud compute tpus tpu-vm list. La l'eliminazione potrebbe richiedere diversi minuti. Una risposta come la seguente indica le istanze sono state eliminate.

      $ gcloud compute tpus tpu-vm list \
        --zone=europe-west4-a
    Listed 0 items.
    
  4. Esegui gcloud CLI come mostrato, sostituendo bucket-name con il nome del bucket Cloud Storage che hai creato per questo tutorial:

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

Passaggi successivi

I tutorial di TensorFlow Cloud TPU generalmente addestrano il modello utilizzando un set di dati di esempio. I risultati di questo addestramento non sono utilizzabili per l'inferenza. A per l'inferenza, puoi addestrare i dati su una o il tuo set di dati. Modelli TensorFlow addestrati su Cloud TPU richiedono generalmente che i set di dati siano TFRecord.

Puoi utilizzare il sample dello strumento di conversione dei set di dati per convertire un set di dati di classificazione delle immagini in formato TFRecord. Se non utilizzi un'immagine di classificazione, dovrai convertire il tuo set di dati in Formato TFRecord per te. Per ulteriori informazioni, vedi TFRecord e tf.Example.

Ottimizzazione degli iperparametri

Per migliorare le prestazioni del modello con il tuo set di dati, puoi ottimizzare i suoi parametri iperbolici. Puoi trovare informazioni sugli iperparametri comuni a tutti i modelli supportati da TPU su GitHub. Le informazioni sugli iperparametri specifici del modello sono disponibili nel codice fonte di ciascun modello. Per ulteriori informazioni sull'ottimizzazione degli iperparametri, consulta la Panoramica dell'ottimizzazione degli iperparametri e Ottimizzare gli iperparametri.

Inferenza

Una volta addestrato il modello, puoi utilizzarlo per l'inferenza (chiamata anche previsione). Puoi utilizzare il convertitore di inferenza di Cloud TPU strumento per preparare e ottimizzare Modello TensorFlow per l'inferenza su Cloud TPU v5e. Per ulteriori informazioni sull'inferenza su Cloud TPU v5e, consulta l'introduzione all'inferenza su Cloud TPU v5e.