Addestramento NCF su Cloud TPU (TF 2.x)

Panoramica

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

Il NCF è un framework generale per il filtro collaborativo dei suggerimenti in cui viene utilizzata un'architettura di rete neurale per modellare le interazioni elemento utente. A differenza dei modelli tradizionali, l'NCF non si affida alla fattore di matrice (MF) con un prodotto interno sulle funzionalità latenti di utenti e articoli. Sostituisce il prodotto interno con un perceptron a più strati che può apprendere una funzione arbitraria dai dati.

Le due implementazioni NCF sono Generalized Matrix Factorization (GMF) e Multi- Layer Perceptron (MLP). GMF applica un kernel lineare per modellare le interazioni latenti delle caratteristiche, e MLP utilizza un kernel non lineare per apprendere la funzione di interazione dai dati. NeuMF è un modello coniugato di GMF e MLP per definire meglio le interazioni complesse tra utenti e elementi utente e unifica i punti di forza della linearità di MF e non linearità di MLP per la modellazione delle strutture latenti di elementi utente. NeuMF consente a GMF e MLP di apprendere incorporamenti separati e combina i due modelli concatenando il loro 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 in 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 di MovieLens vengono utilizzati per l'addestramento e la valutazione dei modelli. Nello specifico, utilizziamo due set di dati: ml-1 m (breve per MovieLens 1 milione) e ml-20 m (breve per MovieLens 20 milioni).

ml-1m

Il set di dati ml-1m contiene 1.000.209 valutazioni anonime di circa 3706 film realizzati da 6040 utenti che si sono uniti 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.
  • Gli ID film sono compresi tra 1 e 3952.
  • Le valutazioni vengono applicate su una scala da 1 a 5 stelle (solo valutazioni a stelle intere).

ml-20m

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

userId,movieId,rating,timestamp

Le righe contenute in questo file vengono ordinate prima da userId e poi, da utente, da MovieId. Le valutazioni vengono eseguite su una scala da 1 a 5 stelle, con incrementi di mezzo stella (0,5 stelle - 5,0 stelle). In entrambi i set di dati, il timestamp è espresso in secondi dalla mezzanotte (UTC) del 1° gennaio 1970. Ogni utente ha almeno 20 valutazioni.

Obiettivi

  • Crea un bucket Cloud Storage per contenere l'output del set di dati e il 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 formazione e valutazione

Costi

Questo tutorial utilizza 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 beneficiare di una prova gratuita.

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 dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.

  4. Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.

  6. Questa procedura dettagliata utilizza componenti fatturabili di Google Cloud. Consulta la pagina Prezzi di Cloud TPU per una stima dei costi. Assicurati di pulire le risorse che crei quando hai finito di utilizzarle per evitare addebiti inutili.

Configura le risorse

Questa sezione fornisce informazioni sulla configurazione delle risorse di 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 tuo progetto.

    export PROJECT_ID=project-id
  3. Configura l'interfaccia a riga di comando di Google Cloud 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 di 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 GCP 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 formato seguente:

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

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

    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 per il livello di accesso.

    La località del bucket deve essere nella stessa area geografica 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 un'area geografica.

  6. Avvia una VM di Compute Engine e Cloud TPU utilizzando il comando gcloud. Il comando da utilizzare varia a seconda che tu stia utilizzando VM TPU o nodi TPU. Per ulteriori informazioni sulla due architetture VM, consulta la sezione Architettura di sistema.

    VM TPU

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

    Descrizioni flag comando

    zone
    La zona in cui prevedi di creare Cloud TPU.
    accelerator-type
    Il tipo di Cloud TPU da creare.
    version
    La versione di runtime 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.8.0
    

    Descrizioni flag comando

    zone
    La zona in cui prevedi di creare Cloud TPU.
    name
    Il nome della TPU. Se non è specificato, viene utilizzato il nome utente per impostazione predefinita.
    accelerator-type
    Il tipo di Cloud TPU da creare.
    machine-type
    Il tipo di macchina della VM di Compute Engine da creare.
    disk-size
    Le dimensioni del volume root 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 Compute Engine, esegui l'accesso eseguendo questo comando ssh. Dopo aver eseguito l'accesso alla VM, il prompt di shell cambia da username@projectname a username@vm-name:

    VM TPU

    gcloud alpha 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 tuo 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 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 che archivia i file di elaborazione del modello:

    VM TPU

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

    Nodo TPU

    (vm)$ cd /usr/share/models/official/recommendation
    
  5. Genera 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 nella tua VM. La pre-elaborazione converte i dati in formato TFRecord richiesto dal modello. Il download e la pre-elaborazione richiedono circa 25 minuti e generano output simili ai 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 di Cloud TPU

  1. Imposta la variabile del nome Cloud TPU.

    VM TPU

    (vm)$ export TPU_NAME=local
    

    Nodo TPU

    (vm)$ export TPU_NAME=ncf-tutorial
    

Esegui la formazione e la valutazione

Lo script seguente esegue un addestramento di esempio per tre periodi,

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

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/ncf
    
  2. Esegui il comando seguente 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 l'hai ancora fatto:

    (vm)$ exit
    

    Il tuo prompt dovrebbe ora 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 dalla presenza o meno di VM TPU o nodi TPU. Per ulteriori informazioni, consulta la sezione Architettura di sistema.

    VM TPU

    $ gcloud alpha 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 può richiedere qualche minuto. Una risposta simile alla seguente indica che le istanze sono state eliminate correttamente.

    VM TPU

    $ gcloud alpha 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 creato per questo tutorial:

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

Passaggi successivi

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

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

Ottimizzazione degli iperparametri

Per migliorare le prestazioni del modello con il tuo set di dati, puoi regolare gli iperparametri di questo modello. Puoi trovare informazioni sugli iperparametri in comune in tutti i modelli supportati da TPU su GitHub. Puoi trovare informazioni sugli iperparametri specifici del modello nel codice sorgente di ciascun modello. Per ulteriori informazioni sull'ottimizzazione degli iperparametri, consulta Panoramica dell'ottimizzazione degli iperparametri, Utilizzo del servizio di ottimizzazione degli iperparametri e Perfezionamento degli iperparametri.

Inferenza

Dopo aver addestrato il modello, puoi utilizzarlo per inferenza (chiamato anche previsione). AI Platform è una soluzione basata su cloud per lo sviluppo, l'addestramento e il deployment di modelli di machine learning. Una volta eseguito il deployment di un modello, puoi utilizzare il servizio AI Platform Prediction.