1. Ringkasan
Selamat datang di codelab Rekomendasi dengan TensorFlow Lite dan Firebase. Dalam codelab ini, Anda akan mempelajari cara menggunakan TensorFlow Lite dan Firebase untuk men-deploy model rekomendasi ke aplikasi Anda. Codelab ini didasarkan pada contoh TensorFlow Lite ini.
Rekomendasi memungkinkan aplikasi menggunakan machine learning untuk menyajikan konten yang paling relevan bagi setiap pengguna secara cerdas. Model ini memperhitungkan perilaku pengguna sebelumnya untuk menyarankan konten aplikasi yang mungkin ingin diajak berinteraksi oleh pengguna di masa mendatang menggunakan model yang dilatih berdasarkan perilaku gabungan dari sejumlah besar pengguna lain.
Tutorial ini menunjukkan cara mendapatkan data dari pengguna aplikasi Anda dengan Firebase Analytics, membuat model machine learning untuk rekomendasi dari data tersebut, lalu menggunakan model tersebut di aplikasi Android untuk menjalankan inferensi dan mendapatkan rekomendasi. Secara khusus, rekomendasi kami akan menyarankan film mana yang kemungkinan besar akan ditonton pengguna berdasarkan daftar film yang sebelumnya disukai pengguna.
Yang akan Anda pelajari
- Mengintegrasikan Firebase Analytics ke aplikasi Android untuk mengumpulkan data perilaku pengguna
- Mengekspor data tersebut ke Google BigQuery
- Melakukan pra-pemrosesan data dan melatih model rekomendasi TF Lite
- Men-deploy model TF Lite ke Firebase ML dan mengaksesnya dari aplikasi Anda
- Menjalankan inferensi di perangkat menggunakan model untuk menyarankan rekomendasi kepada pengguna
Hal yang akan Anda perlukan
- Versi Android Studio terbaru.
- Kode contoh.
- Perangkat pengujian dengan Android 7+ dan layanan Google Play 9.8 atau yang lebih baru, atau Emulator dengan layanan Google Play 9.8 atau yang lebih baru
- Jika menggunakan perangkat, kabel koneksi.
Bagaimana Anda akan menggunakan tutorial ini?
Bagaimana Anda menilai pengalaman Anda dalam mem-build aplikasi Android?
2. Mendapatkan kode contoh
Clone repositori GitHub dari command line.
$ git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-android.git
3. Mengimpor aplikasi awal
Dari Android Studio, pilih direktori codelab-recommendations-android
() dari download kode contoh (File > Open > .../codelab-recommendations-android/start).
Sekarang Anda akan membuka project awal di Android Studio.
4. Membuat project Firebase console
Membuat project baru
- Buka Firebase console.
- Pilih Tambahkan project (atau Buat project jika ini adalah project pertama Anda).
- Pilih atau masukkan Nama project, lalu klik Continue.
- Pastikan "Aktifkan Google Analytics untuk project ini" diaktifkan.
- Ikuti langkah-langkah penyiapan yang tersisa di Firebase console, lalu klik Create project (atau Add Firebase, jika Anda menggunakan project Google yang sudah ada).
5. Tambahkan Firebase
- Dari layar ringkasan project baru Anda, klik ikon Android untuk meluncurkan alur kerja penyiapan.
- Masukkan nama paket codelab:
com.google.firebase.codelabs.recommendations
- Pilih Register app.
Menambahkan file google-services.json ke aplikasi Anda
Setelah menambahkan nama paket dan memilih Daftarkan, klik Download google-services.json untuk mendapatkan file konfigurasi Android Firebase Anda, lalu salin file google-services.json ke direktori app
di project Anda. Setelah file didownload, Anda dapat memilih Skip langkah berikutnya yang ditampilkan di konsol (yang telah dilakukan untuk Anda dalam project build-android-start).
Menambahkan plugin google-services ke aplikasi Anda
Plugin google-services menggunakan file google-services.json untuk mengonfigurasi aplikasi Anda agar dapat menggunakan Firebase. Baris berikut seharusnya sudah ditambahkan ke file build.gradle.kts dalam project (periksa untuk mengonfirmasi):
app/build.grade.kts
plugins {
id("com.google.gms.google-services")
}
build.grade.kts
plugins {
id("com.google.gms.google-services") version "4.3.15" apply false
}
Menyinkronkan project dengan file gradle
Guna memastikan bahwa semua dependensi tersedia untuk aplikasi, Anda harus menyinkronkan project dengan file gradle pada tahap ini. Pilih File > Sinkronkan Project dengan File Gradle dari toolbar Android Studio.
6. Menjalankan aplikasi awal
Setelah mengimpor project ke Android Studio dan mengonfigurasi plugin google-services
dengan file JSON, Anda siap menjalankan aplikasi untuk pertama kalinya. Hubungkan perangkat Android Anda, lalu klik Run ( ) di toolbar Android Studio.
Aplikasi akan diluncurkan di perangkat Anda. Pada tahap ini, Anda dapat melihat aplikasi yang berfungsi yang menampilkan tab dengan daftar film, tab Film yang disukai, dan tab Rekomendasi. Anda dapat mengklik film dalam daftar film untuk menambahkannya ke daftar yang Anda sukai. Setelah menyelesaikan langkah-langkah codelab yang tersisa, kita akan dapat membuat rekomendasi film di tab Rekomendasi.
7. Menambahkan Firebase Analytics ke aplikasi
Pada langkah ini, Anda akan menambahkan Firebase Analytics ke aplikasi untuk mencatat data perilaku pengguna (dalam hal ini, film yang disukai pengguna). Data ini akan digunakan secara agregat pada langkah-langkah mendatang untuk melatih model rekomendasi.
Menambahkan Firebase Bill of Materials dan dependensi Analytics
Dependensi berikut diperlukan untuk menambahkan Firebase Analytics ke aplikasi Anda. Dependensi tersebut seharusnya sudah disertakan dalam file app/build.gradle.kts (verifikasi).
app/build.grade.kts
implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
implementation("com.google.firebase:firebase-analytics-ktx")
Menyiapkan Firebase Analytics di aplikasi
LikedMoviesViewModel berisi fungsi untuk menyimpan film yang disukai pengguna. Setiap kali pengguna menyukai film baru, kita juga ingin mengirim peristiwa log analisis untuk mencatat suka tersebut.
Tambahkan fungsi onMovieLiked dengan kode di bawah untuk mendaftarkan peristiwa analisis saat pengguna mengklik suka pada film.
LikedMoviesViewModel.kt
import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.analytics.ktx.logEvent
import com.google.firebase.ktx.Firebase
class LikedMoviesViewModel internal constructor (application: Application) : AndroidViewModel(application) {
...
fun onMovieLiked(movie: Movie) {
movies.setLike(movie, true)
logAnalyticsEvent(movie.id.toString())
}
}
Tambahkan kolom dan fungsi berikut untuk mencatat peristiwa Analytics saat film ditambahkan ke daftar Disukai pengguna.
LikedMoviesViewModel.kt
import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.analytics.ktx.logEvent
import com.google.firebase.ktx.Firebase
class LikedMoviesViewModel internal constructor (application: Application) : AndroidViewModel(application) {
...
private val firebaseAnalytics = Firebase.analytics
...
/**
* Logs an event in Firebase Analytics that is used in aggregate to train the recommendations
* model.
*/
private fun logAnalyticsEvent(id: String) {
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_ITEM) {
param(FirebaseAnalytics.Param.ITEM_ID, id)
}
}
8. Menguji integrasi Analytics
Pada langkah ini, kita akan menghasilkan peristiwa Analytics di aplikasi dan memastikan bahwa peristiwa tersebut dikirim ke Firebase Console.
Mengaktifkan Logging Debug Analytics
Firebase Analytics dirancang untuk memaksimalkan masa pakai baterai pengguna dan akan mengelompokkan peristiwa di perangkat dan hanya mengirimkannya ke Firebase sesekali. Untuk tujuan proses debug, kita dapat menonaktifkan perilaku ini untuk melihat peristiwa saat dicatat dalam log secara real time dengan menjalankan perintah berikut di shell.
Terminal
adb shell setprop debug.firebase.analytics.app com.google.firebase.codelabs.recommendations
Memastikan peristiwa Analytics dibuat
- Di Android Studio, buka jendela Logcat untuk memeriksa logging dari aplikasi Anda.
- Setel filter Logcat ke string "Logging event".
- Verifikasi bahwa "select_item" Peristiwa Analytics muncul setiap kali Anda menyukai film dalam aplikasi.
Pada tahap ini, Anda telah berhasil mengintegrasikan Firebase Analytics ke dalam aplikasi. Saat pengguna menggunakan aplikasi Anda dan menyukai film, suka mereka akan dicatat secara agregat. Kita akan menggunakan data gabungan ini di bagian lain codelab ini untuk melatih model rekomendasi. Berikut adalah langkah opsional untuk melihat peristiwa Analytics yang sama dengan yang Anda lihat di Logcat juga mengalir ke Firebase console. Jangan ragu untuk melanjutkan ke halaman berikutnya.
Opsional: Mengonfirmasi peristiwa Analytics di Firebase Console
- Buka Firebase console.
- Pilih DebugView di bagian Analytics
- Di Android Studio, pilih Run untuk meluncurkan aplikasi dan menambahkan beberapa film ke daftar Disukai.
- Di DebugView Firebase console, pastikan peristiwa ini dicatat dalam log saat Anda menambahkan film di aplikasi.
9. Mengekspor data Analytics ke BigQuery
BigQuery adalah produk Google Cloud yang memungkinkan Anda memeriksa dan memproses data dalam jumlah besar. Pada langkah ini, Anda akan menghubungkan project Firebase Console ke BigQuery sehingga data Analytics yang dihasilkan oleh aplikasi Anda otomatis diekspor ke BigQuery.
Mengaktifkan BigQuery Export
- Buka Firebase console.
- Pilih ikon roda gigi Setelan di samping Ringkasan Project, lalu pilih Setelan project
- Pilih tab Integrations.
- Pilih Link (atau Manage) di dalam blok BigQuery.
- Pilih Next di langkah About Linking Firebase to BigQuery.
- Di bagian Konfigurasi integrasi, klik tombol untuk mengaktifkan pengiriman data Google Analytics, lalu pilih Tautkan ke BigQuery.
Anda kini telah mengaktifkan project Firebase console untuk mengirim data peristiwa Firebase Analytics ke Big Query secara otomatis. Hal ini terjadi secara otomatis tanpa interaksi lebih lanjut, tetapi ekspor pertama yang membuat set data analisis di BigQuery mungkin tidak terjadi selama 24 jam. Setelah set data dibuat, Firebase terus mengekspor peristiwa Analytics baru ke Big Query ke dalam tabel intrahari, dan mengelompokkan peristiwa dari hari-hari sebelumnya di tabel peristiwa.
Melatih model rekomendasi memerlukan banyak data. Karena kita belum memiliki aplikasi yang menghasilkan data dalam jumlah besar, pada langkah berikutnya kita akan mengimpor set data contoh ke BigQuery untuk digunakan di sisa tutorial ini.
10. Menggunakan BigQuery untuk mendapatkan data pelatihan model
Setelah menghubungkan Firebase Console untuk diekspor ke BigQuery, data peristiwa analisis aplikasi akan otomatis muncul di konsol BigQuery setelah beberapa waktu. Guna mendapatkan beberapa data awal untuk keperluan tutorial ini, pada langkah ini kita akan mengimpor contoh {i>dataset<i} yang ada ke konsol BigQuery Anda untuk digunakan dalam melatih model rekomendasi kita.
Mengimpor set data sampel ke BigQuery
- Buka dasbor BigQuery di Konsol Google Cloud.
- Pilih nama project Anda di menu.
- Pilih nama project Anda di bagian bawah navigasi sebelah kiri BigQuery untuk melihat detailnya.
- Pilih Create dataset untuk membuka panel pembuatan set data.
- Masukkan 'firebase_recommendations_dataset' untuk Dataset ID lalu pilih Create dataset.
- {i>Dataset<i} yang baru akan muncul di menu kiri di bawah nama proyek. Klik lab-report-service tersebut.
- Pilih Buat tabel untuk membuka panel pembuatan tabel.
- Untuk Create table from, pilih 'Google Cloud Storage'.
- Di kolom Select file from GCS bucket, masukkan 'gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt'.
- Pilih 'JSONL' di drop-down File format.
- Masukkan 'recommendations_table' untuk Table name.
- Centang kotak di bagian Skema > Deteksi otomatis > Skema dan parameter input
- Pilih Create table
Mempelajari contoh set data
Pada tahap ini, Anda dapat secara opsional menjelajahi skema dan melakukan pratinjau pada {i>dataset<i} ini.
- Pilih firebase-recommendations-dataset di menu kiri untuk meluaskan tabel yang ada di dalamnya.
- Pilih tabel recommendations-table untuk melihat skema tabel.
- Pilih Pratinjau untuk melihat data peristiwa Analytics aktual yang ada dalam tabel ini.
Membuat kredensial akun layanan
Sekarang, kita akan membuat kredensial akun layanan di project Konsol Google Cloud yang dapat digunakan di lingkungan Colab pada langkah berikut untuk mengakses dan memuat data BigQuery.
- Pastikan penagihan diaktifkan untuk project Google Cloud Anda.
- Aktifkan BigQuery API dan BigQuery Storage API. < klik di sini>
- Buka halaman Membuat Kunci Akun Layanan.
- Dari daftar Service account, pilih New service account.
- Di kolom Nama akun layanan, masukkan nama.
- Dari daftar Role, pilih Project > Owner.
- Klik Buat. File JSON yang berisi kunci Anda yang didownload ke komputer.
Pada langkah berikutnya, kita akan menggunakan Google Colab untuk memproses data ini sebelumnya dan melatih model rekomendasi.
11. Lakukan prapemrosesan data dan latih model rekomendasi
Pada langkah ini, kita akan menggunakan notebook Colab untuk melakukan langkah-langkah berikut:
- mengimpor data BigQuery ke notebook Colab
- melakukan prapemrosesan data untuk mempersiapkannya untuk pelatihan model
- melatih model rekomendasi pada data analisis
- mengekspor model sebagai model TF lite
- men-deploy model ke Firebase Console agar dapat digunakan di aplikasi
Sebelum meluncurkan notebook pelatihan Colab, kami akan mengaktifkan Firebase Model Management API terlebih dahulu agar Colab dapat men-deploy model terlatih ke Firebase console.
Mengaktifkan Firebase Model Management API
Membuat bucket untuk menyimpan model ML Anda
Di Firebase Console, buka Storage, lalu klik Mulai.
Ikuti dialog untuk menyiapkan bucket.
Mengaktifkan Firebase ML API
Buka halaman API Firebase ML di Google Cloud Console dan klik Aktifkan.
Menggunakan notebook Colab untuk melatih dan men-deploy model
Buka notebook colab menggunakan link berikut dan selesaikan langkah-langkah di dalamnya. Setelah menyelesaikan langkah-langkah di notebook Colab, file model TF lite akan di-deploy ke Firebase console yang dapat disinkronkan ke aplikasi kita.
Buka di Colab
12. Mendownload model di aplikasi
Pada langkah ini, kita akan memodifikasi aplikasi untuk mendownload model yang baru saja kita latih dari Firebase Machine Learning.
Menambahkan dependensi Firebase ML
Dependensi berikut diperlukan untuk menggunakan model Machine Learning Firebase di aplikasi Anda. Dependensi ini seharusnya sudah ditambahkan (verifikasi).
app/build.grade.kts
implementation("com.google.firebase:firebase-ml-modeldownloader:24.1.2")
Mendownload model dengan Firebase Model Manager API
Salin kode di bawah ke RecommendationClient.kt untuk menyiapkan kondisi saat download model terjadi dan buat tugas download untuk menyinkronkan model jarak jauh ke aplikasi kita.
RecommendationClient.kt
private fun downloadModel(modelName: String) {
val conditions = CustomModelDownloadConditions.Builder()
.requireWifi()
.build()
FirebaseModelDownloader.getInstance()
.getModel(modelName, DownloadType.LOCAL_MODEL, conditions)
.addOnCompleteListener {
if (!it.isSuccessful) {
showToast(context, "Failed to get model file.")
} else {
showToast(context, "Downloaded remote model: $modelName")
GlobalScope.launch { initializeInterpreter(it.result) }
}
}
.addOnFailureListener {
showToast(context, "Model download failed for recommendations, please check your connection.")
}
}
13. Mengintegrasikan model rekomendasi Tensorflow Lite di aplikasi Anda
Runtime TensorFlow Lite akan memungkinkan Anda menggunakan model di aplikasi untuk membuat rekomendasi. Pada langkah sebelumnya, kita telah melakukan inisialisasi penafsir TFlite dengan file model yang didownload. Pada langkah ini, pertama-tama kita akan memuat kamus dan label untuk menyertai model kita pada langkah inferensi, lalu menambahkan pra-pemrosesan untuk menghasilkan input ke model dan pasca-pemrosesan yang mana kita akan mengekstrak hasil dari inferensi.
Memuat Kamus dan Label
Label yang digunakan untuk membuat kandidat rekomendasi oleh model rekomendasi tercantum dalam file sorted_movie_vocab.json di folder res/assets. Salin kode berikut untuk memuat kandidat ini.
RecommendationClient.kt
/** Load recommendation candidate list. */
private suspend fun loadCandidateList() {
return withContext(Dispatchers.IO) {
val collection = MovieRepository.getInstance(context).getContent()
for (item in collection) {
candidates[item.id] = item
}
Log.v(TAG, "Candidate list loaded.")
}
}
Menerapkan Prapemrosesan
Pada langkah prapemrosesan, kita mengubah bentuk data input agar sesuai dengan yang diharapkan model. Di sini, kita menambahkan panjang input dengan nilai placeholder jika kita belum menghasilkan banyak suka pengguna. Salin kode di bawah ini:
RecommendationClient.kt
/** Given a list of selected items, preprocess to get tflite input. */
@Synchronized
private suspend fun preprocess(selectedMovies: List<Movie>): IntArray {
return withContext(Dispatchers.Default) {
val inputContext = IntArray(config.inputLength)
for (i in 0 until config.inputLength) {
if (i < selectedMovies.size) {
val (id) = selectedMovies[i]
inputContext[i] = id
} else {
// Padding input.
inputContext[i] = config.pad
}
}
inputContext
}
}
Menjalankan penafsir untuk menghasilkan rekomendasi
Di sini kita menggunakan model yang didownload pada langkah sebelumnya untuk menjalankan inferensi pada input yang telah diproses sebelumnya. Kita menetapkan jenis input dan output untuk model dan menjalankan inferensi untuk membuat rekomendasi film. Salin kode berikut ke dalam aplikasi Anda.
RecommendationClient.kt
/** Given a list of selected items, and returns the recommendation results. */
@Synchronized
suspend fun recommend(selectedMovies: List<Movie>): List<Result> {
return withContext(Dispatchers.Default) {
val inputs = arrayOf<Any>(preprocess(selectedMovies))
// Run inference.
val outputIds = IntArray(config.outputLength)
val confidences = FloatArray(config.outputLength)
val outputs: MutableMap<Int, Any> = HashMap()
outputs[config.outputIdsIndex] = outputIds
outputs[config.outputScoresIndex] = confidences
tflite?.let {
it.runForMultipleInputsOutputs(inputs, outputs)
postprocess(outputIds, confidences, selectedMovies)
} ?: run {
Log.e(TAG, "No tflite interpreter loaded")
emptyList()
}
}
}
Menerapkan Pasca-pemrosesan
Terakhir, pada langkah ini kita melakukan pascapemrosesan terhadap output dari model, dengan memilih hasil dengan tingkat keyakinan tertinggi dan menghapus nilai yang terdapat di dalamnya (film yang sudah disukai pengguna). Salin kode berikut ke dalam aplikasi Anda.
RecommendationClient.kt
/** Postprocess to gets results from tflite inference. */
@Synchronized
private suspend fun postprocess(
outputIds: IntArray, confidences: FloatArray, selectedMovies: List<Movie>
): List<Result> {
return withContext(Dispatchers.Default) {
val results = ArrayList<Result>()
// Add recommendation results. Filter null or contained items.
for (i in outputIds.indices) {
if (results.size >= config.topK) {
Log.v(TAG, String.format("Selected top K: %d. Ignore the rest.", config.topK))
break
}
val id = outputIds[i]
val item = candidates[id]
if (item == null) {
Log.v(TAG, String.format("Inference output[%d]. Id: %s is null", i, id))
continue
}
if (selectedMovies.contains(item)) {
Log.v(TAG, String.format("Inference output[%d]. Id: %s is contained", i, id))
continue
}
val result = Result(
id, item,
confidences[i]
)
results.add(result)
Log.v(TAG, String.format("Inference output[%d]. Result: %s", i, result))
}
results
}
}
Uji aplikasi Anda
Jalankan kembali aplikasi Anda. Saat Anda memilih beberapa film, model baru tersebut akan otomatis didownload dan mulai menghasilkan rekomendasi!
14. Selamat!
Anda telah membangun fitur rekomendasi ke dalam aplikasi menggunakan TensorFlow Lite dan Firebase. Perhatikan bahwa teknik dan pipeline yang ditampilkan dalam codelab ini dapat digeneralisasi dan digunakan untuk menayangkan jenis rekomendasi lainnya juga.
Yang telah kita bahas
- Firebase ML
- Firebase Analytics
- Mengekspor peristiwa analisis ke BigQuery
- Memproses peristiwa analisis sebelumnya
- Melatih model TensorFlow rekomendasi
- Mengekspor model dan men-deploy ke Firebase Console
- Menyajikan rekomendasi film dalam aplikasi
Langkah Berikutnya
- Terapkan rekomendasi Firebase ML di aplikasi Anda.