1. Présentation
Bienvenue dans l'atelier de programmation "Recommandations avec TensorFlow Lite et Firebase". Dans cet atelier de programmation, vous allez apprendre à utiliser TensorFlow Lite et Firebase pour déployer un modèle de recommandation dans votre application. Cet atelier de programmation est basé sur cet exemple TensorFlow Lite.
Les recommandations permettent aux applications d'utiliser le machine learning pour diffuser intelligemment le contenu le plus pertinent pour chaque utilisateur. Ils tiennent compte du comportement passé des utilisateurs pour suggérer des contenus d'application avec lesquels ils pourraient interagir à l'avenir, en utilisant un modèle entraîné sur le comportement global d'un grand nombre d'autres utilisateurs.
Ce tutoriel explique comment obtenir des données auprès des utilisateurs de votre application avec Firebase Analytics, créer un modèle de machine learning pour les recommandations à partir de ces données, puis utiliser ce modèle dans une application Android pour exécuter l'inférence et obtenir des recommandations. Plus précisément, nos recommandations suggéreront les films qu'un utilisateur est le plus susceptible de regarder en fonction de la liste des films qu'il a aimés précédemment.
Points abordés
- Intégrer Firebase Analytics à une application Android pour collecter des données sur le comportement des utilisateurs
- Exporter ces données vers Google BigQuery
- Prétraiter les données et entraîner un modèle de recommandations TF Lite
- Déployer le modèle TF Lite sur Firebase ML et y accéder depuis votre application
- Exécuter l'inférence sur l'appareil à l'aide du modèle pour suggérer des recommandations aux utilisateurs
Prérequis
- La dernière version d'Android Studio.
- Exemple de code.
- Un appareil de test équipé d'Android 7 ou version ultérieure et des services Google Play 9.8 ou version ultérieure, ou un émulateur avec les services Google Play 9.8 ou version ultérieure
- Si vous utilisez un appareil, un câble de connexion.
Comment allez-vous utiliser ce tutoriel ?
Comment évalueriez-vous votre niveau d'expérience en matière de création d'applications Android ?
2. Obtenir l'exemple de code
Clonez le dépôt GitHub à partir de la ligne de commande.
$ git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-android.git
3. Importer l'application de démarrage
Dans Android Studio, sélectionnez le répertoire codelab-recommendations-android
( ) à partir du téléchargement de l'exemple de code (Fichier > Ouvrir > .../codelab-recommendations-android/start).
Le projet de démarrage devrait maintenant être ouvert dans Android Studio.
4. Créer un projet dans la console Firebase
Créer un projet
- Accédez à la console Firebase.
- Sélectionnez Ajouter un projet (ou Créer un projet s'il s'agit de votre premier projet).
- Sélectionnez ou saisissez un nom de projet, puis cliquez sur Continuer.
- Assurez-vous que l'option "Activer Google Analytics pour ce projet" est activée.
- Suivez les autres étapes de configuration dans la console Firebase, puis cliquez sur "Créer un projet" (ou "Ajouter Firebase" si vous utilisez un projet Google existant).
5. Ajouter Firebase
- Sur l'écran de présentation de votre nouveau projet, cliquez sur l'icône Android pour lancer le workflow de configuration.
- Saisissez le nom du package du codelab :
com.google.firebase.codelabs.recommendations
- Sélectionnez Enregistrer l'application.
Ajouter le fichier google-services.json à votre application
Après avoir ajouté le nom du package et sélectionné "Register" (Enregistrer), cliquez sur Download google-services.json (Télécharger google-services.json) pour obtenir votre fichier de configuration Firebase Android, puis copiez le fichier google-services.json dans le répertoire app
de votre projet. Une fois le fichier téléchargé, vous pouvez ignorer les étapes suivantes affichées dans la console (elles ont déjà été effectuées pour vous dans le projet build-android-start).
Ajouter le plug-in google-services à votre application
Le plug-in google-services utilise le fichier google-services.json pour configurer votre application afin qu'elle utilise Firebase. Les lignes suivantes doivent déjà être ajoutées aux fichiers build.gradle.kts du projet (vérifiez pour confirmer) :
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
}
Synchroniser votre projet avec les fichiers Gradle
Pour vous assurer que toutes les dépendances sont disponibles pour votre application, vous devez synchroniser votre projet avec les fichiers Gradle à ce stade. Sélectionnez File > Sync Project with Gradle Files (Fichier > Synchroniser le projet avec les fichiers Gradle) dans la barre d'outils d'Android Studio.
6. Exécuter l'application de démarrage
Maintenant que vous avez importé le projet dans Android Studio et configuré le plug-in google-services
avec votre fichier JSON, vous êtes prêt à exécuter l'application pour la première fois. Connectez votre appareil Android, puis cliquez sur Run ( Exécuter) dans la barre d'outils Android Studio.
L'application doit se lancer sur votre appareil. À ce stade, vous pouvez voir une application fonctionnelle qui affiche un onglet avec une liste de films, un onglet "Films aimés" et un onglet "Recommandations". Vous pouvez cliquer sur un film dans la liste pour l'ajouter à votre liste de films "J'aime". Une fois les étapes restantes de l'atelier de programmation terminées, nous pourrons générer des recommandations de films dans l'onglet "Recommandations".
7. Ajouter Firebase Analytics à l'application
Dans cette étape, vous allez ajouter Firebase Analytics à l'application pour enregistrer les données sur le comportement des utilisateurs (dans ce cas, les films qu'ils aiment). Ces données seront agrégées lors des prochaines étapes pour entraîner le modèle de recommandations.
Ajouter la nomenclature Firebase et la dépendance Analytics
Les dépendances suivantes sont nécessaires pour ajouter Firebase Analytics à votre application. Elles devraient déjà être incluses dans le fichier app/build.gradle.kts (vérifiez).
app/build.grade.kts
implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
implementation("com.google.firebase:firebase-analytics-ktx")
Configurer Firebase Analytics dans l'application
LikedMoviesViewModel contient des fonctions permettant de stocker les films que l'utilisateur aime. Chaque fois que l'utilisateur aime un nouveau film, nous voulons également envoyer un événement de journal Analytics pour enregistrer ce "J'aime".
Ajoutez la fonction onMovieLiked avec le code ci-dessous pour enregistrer un événement Analytics lorsque l'utilisateur clique sur "J'aime" pour un 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())
}
}
Ajoutez le champ et la fonction suivants pour enregistrer un événement Analytics lorsqu'un film est ajouté à la liste "J'aime" de l'utilisateur.
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. Tester votre intégration Analytics
Au cours de cette étape, nous allons générer des événements Analytics dans l'application et vérifier qu'ils sont envoyés à la console Firebase.
Activer la journalisation du débogage Analytics
Firebase Analytics est conçu pour maximiser l'autonomie de la batterie des utilisateurs. Il regroupe les événements sur l'appareil et ne les envoie à Firebase qu'occasionnellement. À des fins de débogage, nous pouvons désactiver ce comportement pour afficher les événements tels qu'ils sont enregistrés en temps réel en exécutant la commande suivante dans le shell.
Terminal
adb shell setprop debug.firebase.analytics.app com.google.firebase.codelabs.recommendations
Vérifier que les événements Analytics sont générés
- Dans Android Studio, ouvrez la fenêtre Logcat pour examiner les journaux de votre application.
- Définissez le filtre Logcat sur la chaîne "Logging event" (Événement de journalisation).
- Vérifiez que les événements Analytics "select_item" sont émis chaque fois que vous aimez un film dans l'application.
À ce stade, vous avez intégré Firebase Analytics à votre application. Lorsque les utilisateurs l'utiliseront et aimeront des films, leurs "J'aime" seront enregistrés de manière agrégée. Nous utiliserons ces données agrégées dans le reste de cet atelier de programmation pour entraîner notre modèle de recommandations. L'étape suivante est facultative. Elle vous permet de voir les mêmes événements Analytics que ceux affichés dans Logcat également diffusés dans la console Firebase. N'hésitez pas à passer à la page suivante.
Facultatif : Confirmer les événements Analytics dans la console Firebase
- Accédez à la console Firebase.
- Sélectionnez DebugView sous "Analytics".
- Dans Android Studio, sélectionnez Run (Exécuter) pour lancer l'application et ajouter des films à votre liste "J'aime".
- Dans DebugView de la console Firebase, vérifiez que ces événements sont consignés lorsque vous ajoutez des films dans l'application.
9. Exporter des données Analytics vers BigQuery
BigQuery est un produit Google Cloud qui vous permet d'examiner et de traiter de grandes quantités de données. Dans cette étape, vous allez associer votre projet de la console Firebase à BigQuery afin que les données Analytics générées par votre application soient automatiquement exportées vers BigQuery.
Activer l'exportation BigQuery
- Accédez à la console Firebase.
- Sélectionnez l'icône en forme de roue dentée à côté de Vue d'ensemble du projet, puis sélectionnez Paramètres du projet.
- Sélectionnez l'onglet Intégrations.
- Sélectionnez Associer (ou Gérer) dans le bloc BigQuery.
- Sélectionnez Suivant à l'étape À propos de l'association de Firebase à BigQuery.
- Dans la section Configurer l'intégration, cliquez sur le bouton bascule pour activer l'envoi des données Google Analytics, puis sélectionnez Associer à BigQuery.
Vous avez activé l'envoi automatique des données d'événements Firebase Analytics vers BigQuery pour votre projet de console Firebase. Cette opération se produit automatiquement, sans autre interaction. Toutefois, la première exportation qui crée l'ensemble de données Analytics dans BigQuery peut prendre jusqu'à 24 heures. Une fois l'ensemble de données créé, Firebase exporte en continu de nouveaux événements Analytics vers BigQuery dans la table intrajournalière et regroupe les événements des jours précédents dans la table des événements.
L'entraînement d'un modèle de recommandations nécessite beaucoup de données. Comme nous ne disposons pas encore d'une application générant de grandes quantités de données, nous allons importer un exemple d'ensemble de données dans BigQuery à l'étape suivante pour l'utiliser dans le reste de ce tutoriel.
10. Utiliser BigQuery pour obtenir des données d'entraînement du modèle
Maintenant que nous avons associé la console Firebase à BigQuery pour l'exportation, les données d'événement d'analyse de notre application s'afficheront automatiquement dans la console BigQuery au bout de quelques temps. Pour obtenir des données initiales aux fins de ce tutoriel, nous allons importer un exemple d'ensemble de données existant dans votre console BigQuery afin de l'utiliser pour entraîner notre modèle de recommandations.
Importer un exemple d'ensemble de données dans BigQuery
- Accédez au tableau de bord BigQuery dans la console Google Cloud.
- Sélectionnez le nom de votre projet dans le menu.
- Sélectionnez le nom de votre projet en bas du panneau de navigation de gauche de BigQuery pour afficher les détails.
- Sélectionnez Créer un ensemble de données pour ouvrir le panneau de création d'ensemble de données.
- Saisissez "firebase_recommendations_dataset" comme ID de l'ensemble de données, puis sélectionnez Créer un ensemble de données.
- Le nouvel ensemble de données s'affiche dans le menu de gauche, sous le nom du projet. Cliquez dessus.
- Sélectionnez Créer une table pour ouvrir le panneau de création de table.
- Pour le champ Créer une table à partir de, sélectionnez "Google Cloud Storage".
- Dans le champ Sélectionner un fichier depuis le bucket GCS, saisissez "gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt".
- Sélectionnez "JSONL" dans le menu déroulant Format de fichier.
- Saisissez "recommendations_table" pour le nom de la table.
- Cochez la case sous Schéma > Détection automatique > Schéma et paramètres d'entrée.
- Sélectionnez Créer une table.
Explorer l'exemple d'ensemble de données
À ce stade, vous pouvez éventuellement explorer le schéma et prévisualiser cet ensemble de données.
- Sélectionnez firebase-recommendations-dataset dans le menu de gauche pour développer les tables qu'il contient.
- Sélectionnez la table recommendations-table pour afficher son schéma.
- Sélectionnez Aperçu pour afficher les données d'événement Analytics réelles contenues dans ce tableau.
Créer les identifiants du compte de service
Nous allons maintenant créer des identifiants de compte de service dans notre projet de console Google Cloud. Nous pourrons les utiliser dans l'environnement Colab à l'étape suivante pour accéder à nos données BigQuery et les charger.
- Vérifiez que la facturation est activée pour votre projet Google Cloud.
- Activez les API BigQuery et BigQuery Storage. < cliquez ici>
- Accédez à la page Créer une clé de compte de service.
- Dans la liste Compte de service, sélectionnez Nouveau compte de service.
- Dans le champ Nom du compte de service, saisissez un nom.
- Dans la liste Rôle, sélectionnez Projet > Propriétaire.
- Cliquez sur Créer. Un fichier JSON contenant votre clé est téléchargé sur votre ordinateur.
À l'étape suivante, nous utiliserons Google Colab pour prétraiter ces données et entraîner notre modèle de recommandations.
11. Prétraiter les données et entraîner le modèle de recommandations
Dans cette étape, nous allons utiliser un notebook Colab pour effectuer les opérations suivantes :
- importer les données BigQuery dans le notebook Colab ;
- prétraiter les données pour les préparer à l'entraînement du modèle ;
- entraîner le modèle de recommandations sur les données analytiques ;
- exporter le modèle en tant que modèle TF Lite
- déployer le modèle dans la console Firebase pour pouvoir l'utiliser dans notre application.
Avant de lancer le notebook d'entraînement Colab, nous allons d'abord activer l'API Firebase Model Management afin que Colab puisse déployer le modèle entraîné dans notre console Firebase.
Activer l'API Firebase Model Management
Créer un bucket pour stocker vos modèles de ML
Dans la console Firebase, accédez à "Storage" (Stockage), puis cliquez sur "Get started" (Premiers pas).
Suivez le dialogue pour configurer votre bucket.
Activer l'API Firebase ML
Accédez à la page de l'API Firebase ML dans la console Google Cloud, puis cliquez sur "Activer".
Utiliser un notebook Colab pour entraîner et déployer le modèle
Ouvrez le notebook Colab en cliquant sur le lien suivant et suivez les étapes. Une fois les étapes du notebook Colab terminées, vous disposerez d'un fichier de modèle TF Lite déployé dans la console Firebase, que nous pourrons synchroniser avec notre application.
Ouvrir dans Colab
12. Télécharger le modèle dans votre application
Dans cette étape, nous allons modifier notre application pour télécharger le modèle que nous venons d'entraîner à partir de Firebase Machine Learning.
Ajouter la dépendance Firebase ML
La dépendance suivante est nécessaire pour utiliser les modèles Firebase ML dans votre application. Elle devrait déjà être ajoutée (vérifiez).
app/build.grade.kts
implementation("com.google.firebase:firebase-ml-modeldownloader:24.1.2")
Télécharger le modèle avec l'API Firebase Model Manager
Copiez le code ci-dessous dans RecommendationClient.kt pour configurer les conditions dans lesquelles le téléchargement du modèle se produit et créer une tâche de téléchargement pour synchroniser le modèle distant avec notre application.
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. Intégrer le modèle de recommandation TensorFlow Lite dans votre application
Le runtime Tensorflow Lite vous permettra d'utiliser votre modèle dans l'application pour générer des recommandations. À l'étape précédente, nous avons initialisé un interpréteur TFLite avec le fichier de modèle que nous avons téléchargé. Dans cette étape, nous allons d'abord charger un dictionnaire et des libellés pour accompagner notre modèle dans l'étape d'inférence. Ensuite, nous allons ajouter un prétraitement pour générer les entrées de notre modèle et un post-traitement pour extraire les résultats de notre inférence.
Charger le dictionnaire et les libellés
Les libellés utilisés pour générer les candidats aux recommandations par le modèle de recommandations sont listés dans le fichier sorted_movie_vocab.json du dossier res/assets. Copiez le code suivant pour charger ces candidats.
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.")
}
}
Implémenter le prétraitement
Lors de l'étape de prétraitement, nous modifions la forme des données d'entrée pour qu'elles correspondent à ce que notre modèle attend. Ici, nous complétons la longueur de l'entrée avec une valeur d'espace réservé si nous n'avons pas encore généré beaucoup de "J'aime" d'utilisateurs. Copiez le code ci-dessous :
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
}
}
Exécuter l'interpréteur pour générer des recommandations
Ici, nous utilisons le modèle que nous avons téléchargé lors d'une étape précédente pour exécuter l'inférence sur notre entrée prétraitée. Nous définissons le type d'entrée et de sortie de notre modèle, puis nous exécutons l'inférence pour générer nos recommandations de films. Copiez le code suivant dans votre application.
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()
}
}
}
Implémenter le post-traitement
Enfin, lors de cette étape, nous post-traitons la sortie de notre modèle en sélectionnant les résultats avec la confiance la plus élevée et en supprimant les valeurs contenues (films que l'utilisateur a déjà aimés). Copiez le code suivant dans votre application.
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
}
}
Testez votre application !
Réexécutez votre application. Lorsque vous sélectionnez quelques films, le nouveau modèle devrait se télécharger automatiquement et commencer à générer des recommandations.
14. Félicitations !
Vous avez intégré une fonctionnalité de recommandations à votre application à l'aide de TensorFlow Lite et Firebase. Notez que les techniques et le pipeline présentés dans cet atelier de programmation peuvent être généralisés et utilisés pour diffuser d'autres types de recommandations.
Points abordés
- Firebase ML
- Firebase Analytics
- Exporter des événements Analytics vers BigQuery
- Prétraiter les événements Analytics
- Entraîner un modèle TensorFlow de recommandations
- Exporter le modèle et le déployer dans la console Firebase
- Diffuser des recommandations de films dans une application
Étapes suivantes
- Implémentez les recommandations Firebase ML dans votre application.