Addestramento dell'NCF su Cloud TPU (TF 2.x)


Panoramica

Questa è un'implementazione del framework di filtri neurali collaborativi (NCF) utilizzando un modello di fattorizzazione matriciale 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 filtraggio collaborativo dei suggerimenti in cui viene utilizzata un'architettura di rete neurale per modellare le interazioni degli elementi utente. A differenza dei modelli tradizionali, l'NCF non ricorre alla fattorizzazione matriciale (MF) con un prodotto interno su caratteristiche latenti di utenti e articoli. Sostituisce il prodotto interno con un perceptrone a più livelli in grado di apprendere una funzione arbitraria dai dati.

Due implementazioni di NCF sono Generalized Matrix Factorization (GMF) e Multi- Layer Perceptron (MLP). GMF applica un kernel lineare per modellare le interazioni di funzionalità latenti, mentre MLP utilizza un kernel non lineare per apprendere la funzione di interazione dai dati. NeuMF è un modello fuso di GMF e MLP per modellare meglio interazioni complesse degli elementi utente e unifica i punti di forza della linearità della MF e della non linearità della MLP per modellare le strutture latenti degli elementi utente. NeuMF consente a GMF e MLP di apprendere incorporamenti separati e combina i due modelli concatenando l'ultimo livello nascosto. neumf_model.py definisce i dettagli dell'architettura.

Le istruzioni riportate di seguito presuppongono che tu abbia già familiarità con l'addestramento di un modello su Cloud TPU. Se non hai mai utilizzato Cloud TPU, consulta la Guida rapida per un'introduzione di base.

Set di dati

I set di dati MovieLens vengono utilizzati per l'addestramento e la valutazione dei modelli. Nello specifico, utilizziamo due set di dati: ml-1m (abbreviazione di MovieLens 1 milione) e ml-20m (abbreviazione di MovieLens 20 milioni).

ml-1 min

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

UserID::MovieID::Rating::Timestamp

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

ml-20m

Il set di dati ml-20m contiene 20.000.263 valutazioni di 26.744 film di 138493 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 singolo film da parte di un singolo utente e ha il seguente formato:

userId,movieId,rating,timestamp

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

Obiettivi

  • Crea un bucket Cloud Storage in cui conservare il set di dati e l'output del modello
  • Prepara 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 vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Prima di iniziare

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

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  6. Questa procedura dettagliata utilizza i componenti fatturabili di Google Cloud. Consulta la pagina dei prezzi di Cloud TPU per stimare i costi. Assicurati di pulire le risorse che hai creato quando hai finito di utilizzarle per evitare addebiti inutili.

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 per 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 una pagina Authorize Cloud Shell. Fai clic su Authorize in fondo alla pagina per consentire a gcloud di effettuare chiamate API con le tue credenziali.

  4. Creare 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 comando seguente:

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

    Questo bucket Cloud Storage archivia i dati utilizzati 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 che hai configurato nel passaggio precedente. Se vuoi autorizzazioni più granulari, rivedi le autorizzazioni a livello di accesso.

    La località del bucket deve trovarsi nella stessa regione della macchina virtuale (VM) e del nodo TPU. Le VM e i nodi TPU si trovano in zone specifiche, che sono suddivisioni all'interno di una regione.

  6. Avvia una VM di Compute Engine e Cloud TPU utilizzando il comando gcloud. Il comando da utilizzare dipende dall'utilizzo di VM TPU o nodi TPU. Per ulteriori informazioni sull'architettura delle due VM, consulta Architettura di sistema.

    VM TPU

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

    Descrizioni flag comando

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

    Nodo TPU

    $ 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.12.0
    

    Descrizioni flag comando

    zone
    La zona in cui prevedi di creare la Cloud TPU.
    name
    Il nome della TPU. Se non specificato, il valore predefinito è il tuo nome utente.
    accelerator-type
    Il tipo di Cloud TPU da creare.
    machine-type
    Il tipo di macchina della VM di Compute Engine da creare.
    disk-size
    La dimensione del volume radice della VM di Compute Engine (in GB).
    tf-version
    La versione di Tensorflow gcloud viene installata sulla VM.

    Per maggiori informazioni sul comando gcloud, consulta la sezione Riferimento gcloud.

  7. Se non hai eseguito automaticamente l'accesso all'istanza di Compute Engine, accedi eseguendo il comando ssh riportato di seguito. Quando hai eseguito l'accesso alla VM, il prompt della shell cambia da username@projectname a username@vm-name:

    VM TPU

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

    Nodo TPU

    gcloud compute 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 località del modello e imposta la variabile di ambiente PYTHONPATH.

    VM TPU

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

    Nodo TPU

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    (vm)$ pip3 install -r /usr/share/models/official/requirements.txt
    
  4. Passa alla directory in cui sono archiviati i file di elaborazione dei modelli:

    VM TPU

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

    Nodo TPU

    (vm)$ cd /usr/share/models/official/recommendation
    
  5. Genera i 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 VM. La pre-elaborazione converte i dati nel formato TFRecord richiesto dal modello. Il download e la pre-elaborazione richiedono circa 25 minuti e generano un output simile al seguente:

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 inizia l'addestramento di Cloud TPU

  1. Imposta la variabile del nome di Cloud TPU.

    VM TPU

    (vm)$ export TPU_NAME=local
    

    Nodo TPU

    (vm)$ export TPU_NAME=ncf-tutorial
    

Eseguire 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 del modello per salvare i punti di controllo e i riepiloghi di TensorBoard:

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

      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
    
  3. Esegui questo 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 al seguente:

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. Disconnettiti dall'istanza di Compute Engine, se non lo hai già fatto:

    (vm)$ exit
    

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

  2. Elimina le risorse Cloud TPU e Compute Engine. Il comando da utilizzare per eliminare le risorse dipende dall'utilizzo di VM TPU o nodi TPU. Per ulteriori informazioni, consulta Architettura di sistema.

    VM TPU

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

    Nodo TPU

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

    VM TPU

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

    Nodo TPU

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

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

Passaggi successivi

I tutorial su TensorFlow Cloud TPU in genere addestrano il modello utilizzando un set di dati di esempio. I risultati di questo addestramento non sono utilizzabili per l'inferenza. Per utilizzare un modello per l'inferenza, puoi addestrare i dati su un set di dati disponibile pubblicamente o sul tuo set di dati. I modelli TensorFlow addestrati sulle Cloud TPU in genere richiedono che i set di dati siano in formato TFRecord.

Puoi utilizzare l'esempio dello strumento di conversione del set di dati per convertire un set di dati di classificazione delle immagini nel formato TFRecord. Se non utilizzi un modello di classificazione delle immagini, dovrai convertire manualmente il set di dati nel formato TFRecord. Per ulteriori informazioni, consulta TFRecord e tf.Example.

Ottimizzazione degli iperparametri

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

Inferenza

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