Panoramica
Questa è un'implementazione del framework Neural Collaborative Filtering (NCF) utilizzando un modello Neural Matrix factorization (NeuMF) come descritto nel Neural Collaborative Filtering. 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 elemento-utente. A differenza dei modelli tradizionali, il NCF non si affida alla Matrix factorization (MF) con un prodotto interno sulle caratteristiche latenti di utenti ed articoli. Sostituisce il prodotto interno con un perceptron a più livelli che può 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 latenti delle funzionalità e MLP utilizza un kernel non lineare per apprendere la funzione di interazione dai dati. NeuMF è un modello congiunto di GMF e MLP per migliorare le interazioni complesse tra elementi utente e unifica i punti di forza della linearità di MF e la 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 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 (breve per MovieLens 1 milione) e ml-20m (abbreviazione per MovieLens 20 milioni).
ml-1m
Il set di dati ml-1m contiene 1.000.209 di valutazioni anonime, 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 nel formato seguente:
UserID::MovieID::Rating::Timestamp
- Gli User-ID sono compresi tra 1 e 6040.
- Gli ID film sono compresi tra 1 e 3952.
- Le valutazioni vengono effettuate su una scala 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 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 utente di un film e ha il seguente formato:
userId,movieId,rating,timestamp
Le righe all'interno di questo file vengono ordinate prima da userId, quindi, all'interno dell'utente, da movieId. Le valutazioni vengono effettuate su una scala a 5 stelle, con incrementi di metà stelle (0,5 stelle - 5,0 stelle). In entrambi i set di dati, il timestamp è rappresentato in secondi dalla mezzanotte (UTC) del 1° gennaio 1970. Ogni utente ha almeno 20 valutazioni.
Obiettivi
- Crea un bucket Cloud Storage per conservare l'output del set di dati e 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
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.
Prima di iniziare
Prima di iniziare questo tutorial, verifica che il tuo progetto Google Cloud sia configurato correttamente.
- 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.
-
Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.
-
Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.
Questa procedura dettagliata utilizza i componenti fatturabili di Google Cloud. Controlla la pagina dei prezzi di Cloud TPU per una stima dei costi. Al termine, pulisci le risorse che crei per evitare addebiti inutili.
Configurare le risorse
Questa sezione fornisce informazioni sulla configurazione delle risorse Cloud Storage, VM e Cloud TPU per questo tutorial.
Apri una finestra di Cloud Shell.
Crea una variabile di ambiente per l'ID del tuo progetto.
export PROJECT_ID=project-id
Configurare 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 di Cloud Shell, viene visualizzata una pagina
Authorize Cloud Shell
. Fai clic suAuthorize
in fondo alla pagina per consentire agcloud
di effettuare chiamate API con le tue credenziali.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
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 configurato nel passaggio precedente. Se vuoi autorizzazioni 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, ovvero suddivisioni all'interno di una regione.
Avvia una VM di Compute Engine e Cloud TPU utilizzando il comando
gcloud
. Il comando utilizzato varia a seconda che tu stia utilizzando 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.11.0
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.11.0
Descrizioni flag comando
zone
- La zona in cui prevedi di creare la tua Cloud TPU.
name
- Il nome della TPU. Se non viene specificato, il valore predefinito sarà 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
- Le dimensioni root del volume 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.Se non hai eseguito automaticamente l'accesso all'istanza di Compute Engine, accedi eseguendo il comando
ssh
seguente. Dopo aver eseguito l'accesso alla VM, il prompt di shell passa dausername@projectname
ausername@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
Aggiungi una variabile di ambiente per il bucket di archiviazione. Sostituisci bucket-name con il nome del bucket.
(vm)$ export STORAGE_BUCKET=gs://bucket-name
Aggiungi una variabile di ambiente per la directory dei dati.
(vm)$ export DATA_DIR=${STORAGE_BUCKET}/ncf_data
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
Passa alla directory in cui sono archiviati i file di elaborazione del modello:
VM TPU
(vm)$ cd ~/models/official/recommendation
Nodo TPU
(vm)$ cd /usr/share/models/official/recommendation
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 preelabora il set di dati sulla tua 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 avvia l'addestramento di Cloud TPU
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 3 periodi.
Aggiungi una variabile di ambiente per la directory del modello per salvare i checkpoint e i riepiloghi di TensorBoard:
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/ncf
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.
Disconnettiti dall'istanza 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.Elimina le risorse Cloud TPU e Compute Engine. Il comando utilizzato per eliminare le risorse dipende dal fatto che tu stia utilizzando VM TPU o nodi TPU. Per saperne di più, vedi 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
Verifica che le risorse siano state eliminate eseguendo
gcloud compute tpus execution-groups list
. L'eliminazione potrebbe richiedere alcuni minuti. Una risposta come quella riportata di seguito indica che le tue 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.
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
In generale, i tutorial di TensorFlow Cloud TPU 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 in un set di dati disponibile pubblicamente o nel tuo set di dati. In genere, i modelli TensorFlow addestrati sulle Cloud TPU richiedono set di dati in formato TFRecord.
Puoi utilizzare l'esempio 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 modello di classificazione delle immagini, dovrai convertire il set di dati nel formato TFRecord autonomamente. Per ulteriori informazioni, consulta TFRecord e tf.Example.
Ottimizzazione degli iperparametri
Per migliorare le prestazioni del modello con il tuo set di dati, puoi regolare gli iperparametri del modello. Puoi trovare informazioni sugli iperparametri comuni per tutti i modelli TPU supportati 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 sull'ottimizzazione degli iperparametri, Utilizzo del servizio di ottimizzazione degli iperparametri e Iperparametri dell'iperparametro.
Inferenza
Dopo aver addestrato il modello, puoi utilizzarlo per l'inferenza (detta anche previsione). AI Platform è una soluzione basata su cloud per lo sviluppo, l'addestramento e il deployment dei modelli di machine learning. Una volta eseguito il deployment di un modello, puoi utilizzare il servizio AI Platform Prediction.
- Scopri di più su
ctpu
, incluso come installarlo su una macchina locale. - Esplora gli strumenti TPU in TensorBoard.