Melatih NCF pada Cloud TPU (TF 2.x)


Ringkasan

Ini adalah implementasi framework Neural Collaborative Filtering (NCF) menggunakan model Neural Matrix Factorization (NeuMF) seperti yang dijelaskan dalam makalah Filter Kolaboratif Neural. Implementasi saat ini didasarkan pada kode dari kode NCF penulis dan implementasi Stanford di MLPerf Repo.

NCF adalah framework umum untuk pemfilteran kolaboratif rekomendasi yang menggunakan arsitektur jaringan neural untuk membuat model interaksi item pengguna. Tidak seperti model tradisional, NCF tidak menggunakan Faktorisasi Matriks (MF) dengan produk internal pada fitur laten pengguna dan item. Fungsi ini menggantikan produk dalam dengan perseptron multi-lapisan yang dapat mempelajari fungsi arbitrer dari data.

Dua implementasi NCF adalah Generalized Matrix Factorization (GMF) dan Multi-Layer Perceptron (MLP). GMF menerapkan kernel linear untuk membuat model interaksi fitur laten, dan MLP menggunakan kernel nonlinear untuk mempelajari fungsi interaksi dari data. NeuMF adalah model gabungan GMF dan MLP untuk membuat model interaksi item pengguna yang kompleks dengan lebih baik, dan menyatukan kekuatan linieritas MF dan non-linearalitas MLP untuk memodelkan struktur laten item pengguna. NeuMF memungkinkan GMF dan MLP mempelajari embedding terpisah, dan menggabungkan kedua model dengan menyambungkan lapisan tersembunyi terakhirnya. neumf_model.py menentukan detail arsitektur.

Petunjuk di bawah ini mengasumsikan bahwa Anda sudah memahami cara melatih model di Cloud TPU. Jika Anda baru menggunakan Cloud TPU, lihat Panduan Memulai untuk mendapatkan pengantar dasar.

Set data

Set data MovieLens digunakan untuk pelatihan dan evaluasi model. Secara khusus, kami menggunakan dua set data: ml-1m (kependekan dari MovieLens 1 jt) dan ml-20m (kependekan dari MovieLens 20 jt).

ml-1m

{i>dataset<i} ml-1m berisi 1.000.209 peringkat anonim dari sekitar 3.706 film yang dibuat oleh 6.040 pengguna yang bergabung dengan MovieLens pada tahun 2000. Semua rating terdapat dalam file "ratings.dat" tanpa baris header, dan memiliki format berikut:

UserID::MovieID::Rating::Timestamp

  • UserID memiliki rentang antara 1 dan 6040.
  • MovieID berkisar antara 1 dan 3952.
  • Rating dibuat dengan skala 5 bintang (hanya rating bintang utuh).

ml-20m

Dataset ml-20m berisi 20.000.263 rating dari 26.744 film oleh 138493 pengguna. Semua peringkat terdapat dalam file "ratings.csv". Setiap baris file ini setelah baris header merepresentasikan rating satu pengguna untuk sebuah film, dan memiliki format berikut:

userId,movieId,rating,timestamp

Baris dalam file ini akan diurutkan pertama menurut userId, kemudian, dalam pengguna, menurut movieId. Rating dibuat pada skala 5 bintang, dengan kenaikan setengah bintang (0,5 bintang - 5,0 bintang). Di kedua set data, stempel waktu direpresentasikan dalam detik sejak Waktu Universal Terkoordinasi tengah malam (UTC) 1 Januari 1970. Setiap pengguna memiliki setidaknya 20 rating.

Tujuan

  • Membuat bucket Cloud Storage untuk menyimpan set data dan output model
  • Menyiapkan set data MovieLens
  • Menyiapkan VM Compute Engine dan node Cloud TPU untuk pelatihan dan evaluasi
  • Menjalankan pelatihan dan evaluasi

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

Sebelum memulai tutorial ini, pastikan project Google Cloud Anda sudah disiapkan dengan benar.

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  5. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  6. Panduan ini menggunakan komponen Google Cloud yang dapat ditagih. Lihat halaman harga Cloud TPU untuk memperkirakan biaya Anda. Pastikan untuk membersihkan resource yang Anda buat setelah selesai menggunakannya untuk menghindari biaya yang tidak perlu.

Menyiapkan resource

Bagian ini memberikan informasi tentang penyiapan resource Cloud Storage, VM, dan Cloud TPU untuk tutorial ini.

  1. Buka jendela Cloud Shell.

    Buka Cloud Shell

  2. Buat variabel lingkungan untuk ID project Anda.

    export PROJECT_ID=project-id
  3. Konfigurasikan Google Cloud CLI untuk menggunakan project tempat Anda ingin membuat Cloud TPU.

    gcloud config set project ${PROJECT_ID}

    Saat pertama kali menjalankan perintah ini di VM Cloud Shell baru, halaman Authorize Cloud Shell akan ditampilkan. Klik Authorize di bagian bawah halaman untuk mengizinkan gcloud melakukan panggilan API dengan kredensial Anda.

  4. Membuat Akun Layanan untuk project Cloud TPU.

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

    Perintah akan menampilkan Akun Layanan Cloud TPU dengan format berikut:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    
  5. Buat bucket Cloud Storage menggunakan perintah berikut:

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

    Bucket Cloud Storage ini menyimpan data yang Anda gunakan untuk melatih model dan hasil pelatihan. Perintah gcloud yang digunakan dalam tutorial ini untuk menyiapkan TPU juga menyiapkan izin default untuk Akun Layanan Cloud TPU yang Anda siapkan di langkah sebelumnya. Jika Anda menginginkan izin yang lebih terperinci, tinjau izin tingkat akses.

    Lokasi bucket harus berada di region yang sama dengan virtual machine (VM) dan TPU node Anda. VM dan node TPU terletak di zona tertentu, yang merupakan subdivisi dalam suatu region.

  6. Luncurkan VM Compute Engine dan Cloud TPU menggunakan perintah gcloud. Perintah yang digunakan bergantung pada apakah Anda menggunakan VM TPU atau node TPU. Untuk informasi selengkapnya tentang dua arsitektur VM, lihat Arsitektur Sistem.

    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

    Deskripsi flag perintah

    zone
    Zona tempat Anda berencana membuat Cloud TPU.
    accelerator-type
    Jenis akselerator menentukan versi dan ukuran Cloud TPU yang ingin Anda buat. Untuk mengetahui informasi selengkapnya tentang jenis akselerator yang didukung untuk setiap versi TPU, lihat versi TPU.
    version
    Versi software Cloud TPU.

    Node 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

    Deskripsi flag perintah

    zone
    Zona tempat Anda berencana membuat Cloud TPU.
    name
    Nama TPU. Jika tidak ditentukan, setelan defaultnya adalah nama pengguna Anda.
    accelerator-type
    Jenis Cloud TPU yang akan dibuat.
    machine-type
    Jenis mesin VM Compute Engine yang akan dibuat.
    disk-size
    Ukuran volume root VM Compute Engine Anda (dalam GB).
    tf-version
    Versi Tensorflow gcloud dapat diinstal di VM.

    Untuk mengetahui informasi lebih lanjut tentang perintah gcloud, lihat Referensi gcloud.

  7. Jika Anda tidak login secara otomatis ke instance Compute Engine, login dengan menjalankan perintah ssh berikut. Saat Anda login ke VM, perintah shell Anda akan berubah dari username@projectname menjadi username@vm-name:

    VM TPU

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

    Node TPU

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

Menyiapkan data

  1. Tambahkan variabel lingkungan untuk bucket penyimpanan Anda. Ganti bucket-name dengan nama bucket Anda.

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
  2. Tambahkan variabel lingkungan untuk direktori data.

    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/ncf_data
  3. Siapkan lokasi model dan tetapkan variabel lingkungan 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}"

    Node TPU

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    (vm)$ pip3 install -r /usr/share/models/official/requirements.txt
  4. Ubah ke direktori yang menyimpan file pemrosesan model:

    VM TPU

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

    Node TPU

    (vm)$ cd /usr/share/models/official/recommendation
  5. Buat data pelatihan dan evaluasi untuk set data ml-20m di 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}

Skrip ini menghasilkan dan memproses set data di VM Anda. Prapemrosesan mengonversi data menjadi format TFRecord yang diperlukan oleh model. Download dan pra-pemrosesan memerlukan waktu sekitar 25 menit dan menghasilkan output yang mirip dengan berikut ini:

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

Menyiapkan dan mulai melatih Cloud TPU

  1. Tetapkan variabel nama Cloud TPU.

    VM TPU

    (vm)$ export TPU_NAME=local

    Node TPU

    (vm)$ export TPU_NAME=ncf-tutorial

Menjalankan pelatihan dan evaluasi

Skrip berikut menjalankan contoh pelatihan selama 3 epoch,

  1. Tambahkan variabel lingkungan untuk direktori Model guna menyimpan checkpoint dan ringkasan TensorBoard:

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/ncf
  2. Saat membuat TPU, jika Anda menetapkan parameter --version ke versi yang diakhiri dengan -pjrt, tetapkan variabel lingkungan berikut untuk mengaktifkan runtime PJRT:

      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
  3. Jalankan perintah berikut untuk melatih model 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
     

Pelatihan dan evaluasi ini memerlukan waktu sekitar 2 menit, lalu menghasilkan output akhir yang mirip dengan:

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

Pembersihan

Agar tidak dikenakan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource-nya.

  1. Putuskan koneksi dari instance Compute Engine jika Anda belum melakukannya:

    (vm)$ exit

    Prompt Anda sekarang akan menjadi username@projectname, yang menunjukkan bahwa Anda berada di Cloud Shell.

  2. Hapus resource Cloud TPU dan Compute Engine Anda. Perintah yang digunakan untuk menghapus resource bergantung pada apakah Anda menggunakan VM TPU atau Node TPU. Untuk informasi selengkapnya, lihat Arsitektur Sistem.

    VM TPU

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

    Node TPU

    $ gcloud compute tpus execution-groups delete ncf-tutorial \
    --zone=europe-west4-a
  3. Verifikasi bahwa resource telah dihapus dengan menjalankan gcloud compute tpus execution-groups list. Penghapusan memerlukan waktu beberapa menit. Respons seperti di bawah ini menunjukkan bahwa instance Anda telah berhasil dihapus.

    VM TPU

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

    Node TPU

    $ gcloud compute tpus execution-groups list --zone=europe-west4-a
    Listed 0 items.
    
  4. Jalankan gsutil seperti yang ditunjukkan, dengan mengganti bucket-name dengan nama bucket Cloud Storage yang Anda buat untuk tutorial ini:

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

Langkah selanjutnya

Tutorial TensorFlow Cloud TPU umumnya melatih model menggunakan sampel set data. Hasil pelatihan ini tidak dapat digunakan untuk inferensi. Agar dapat menggunakan model untuk inferensi, Anda dapat melatih data pada set data yang tersedia untuk publik atau set data Anda sendiri. Model TensorFlow yang dilatih di Cloud TPU umumnya memerlukan set data dalam format TFRecord.

Anda dapat menggunakan contoh alat konversi set data untuk mengonversi set data klasifikasi gambar menjadi format TFRecord. Jika tidak menggunakan model klasifikasi gambar, Anda harus mengonversi set data ke format TFRecord sendiri. Untuk mengetahui informasi selengkapnya, lihat TFRecord dan tf.Example.

Penyesuaian hyperparameter

Untuk meningkatkan performa model dengan set data, Anda dapat menyesuaikan hyperparameter model. Anda dapat menemukan informasi tentang hyperparameter yang umum untuk semua model yang didukung TPU di GitHub. Informasi tentang hyperparameter khusus model dapat ditemukan di kode sumber untuk setiap model. Untuk informasi selengkapnya tentang penyesuaian hyperparameter, lihat Ringkasan penyesuaian hyperparameter dan Menyesuaikan hyperparameter.

Inferensi

Setelah melatih model, Anda dapat menggunakannya untuk inferensi (juga disebut prediksi). Anda dapat menggunakan alat konverter inferensi Cloud TPU untuk menyiapkan dan mengoptimalkan model TensorFlow untuk inferensi di Cloud TPU v5e. Untuk mengetahui informasi selengkapnya tentang inferensi di Cloud TPU v5e, lihat pengantar inferensi Cloud TPU v5e.