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 iOS 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
- Xcode 11 (ou version ultérieure)
- CocoaPods 1.9.1 (ou version ultérieure)
Comment allez-vous utiliser ce tutoriel ?
Comment évalueriez-vous votre niveau en matière de création d'applications iOS ?
2. Créer un projet dans la console Firebase
Ajouter Firebase au projet
- Accédez à la console Firebase.
- Sélectionnez Create New Project (Créer un projet) et nommez votre projet "Firebase ML iOS Codelab".
3. Obtenir l'exemple de projet
Télécharger le code
Commencez par cloner l'exemple de projet et exécutez pod update
dans le répertoire du projet :
git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-ios.git cd codelab-contentrecommendation-ios/start pod install --repo-update
Si vous n'avez pas installé git, vous pouvez également télécharger l'exemple de projet depuis sa page GitHub ou en cliquant sur ce lien. Une fois le projet téléchargé, exécutez-le dans Xcode et testez la recommandation pour comprendre comment elle fonctionne.
Configurer Firebase
Suivez la documentation pour créer un projet Firebase. Une fois votre projet créé, téléchargez le fichier GoogleService-Info.plist
de votre projet depuis la console Firebase et faites-le glisser à la racine du projet Xcode.
Ajoutez Firebase à votre Podfile et exécutez pod install.
pod 'FirebaseAnalytics' pod 'FirebaseMLModelDownloader', '9.3.0-beta' pod 'TensorFlowLiteSwift'
Dans la méthode didFinishLaunchingWithOptions
de votre AppDelegate
, importez Firebase en haut du fichier.
import FirebaseCore
Ajoutez un appel pour configurer Firebase.
FirebaseApp.configure()
Exécutez à nouveau le projet pour vous assurer que l'application est correctement configurée et qu'elle ne plante pas au lancement.
- 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).
4. 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.
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 le code ci-dessous pour enregistrer un événement Analytics lorsque l'utilisateur clique sur "J'aime" pour un film.
AllMoviesCollectionViewController.swift
import FirebaseAnalytics
//
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
//
if movie.liked == nil {
movie.liked = true
Analytics.logEvent(AnalyticsEventSelectItem, parameters: [AnalyticsParameterItemID: movie.id])
} else {
movie.liked?.toggle()
}
}
5. 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
En règle générale, les événements enregistrés par votre application sont regroupés par lots sur une période d'environ une heure et importés ensemble. Cette approche permet d'économiser la batterie des appareils des utilisateurs finaux et de réduire l'utilisation des données réseau. Toutefois, pour valider votre implémentation Analytics (et pour afficher vos données analytiques dans le rapport DebugView), vous pouvez activer le mode débogage sur votre appareil de développement afin d'importer les événements avec un délai minimal.
Pour activer le mode débogage d'Analytics sur votre appareil de développement, spécifiez l'argument de ligne de commande suivant dans Xcode :
-FIRDebugEnabled
À 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 Xcode, 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.
6. 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.
7. 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.
8. 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
9. 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).
Podfile
import FirebaseCore
import FirebaseMLModelDownloader
Télécharger le modèle avec l'API Firebase Model Manager
Copiez le code ci-dessous dans ModelLoader.swift pour configurer les conditions dans lesquelles le modèle est téléchargé et créer une tâche de téléchargement pour synchroniser le modèle distant avec notre application.
ModelLoader.swift
static func downloadModel(named name: String,
completion: @escaping (CustomModel?, DownloadError?) -> Void) {
guard FirebaseApp.app() != nil else {
completion(nil, .firebaseNotInitialized)
return
}
guard success == nil && failure == nil else {
completion(nil, .downloadInProgress)
return
}
let conditions = ModelDownloadConditions(allowsCellularAccess: false)
ModelDownloader.modelDownloader().getModel(name: name, downloadType: .localModelUpdateInBackground, conditions: conditions) { result in
switch (result) {
case .success(let customModel):
// Download complete.
// The CustomModel object contains the local path of the model file,
// which you can use to instantiate a TensorFlow Lite classifier.
return completion(customModel, nil)
case .failure(let error):
// Download was unsuccessful. Notify error message.
completion(nil, .downloadFailed(underlyingError: error))
}
}
}
10. 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 à la recommandation par le modèle de recommandations sont listés dans le fichier sorted_movie_vocab.json du dossier "assets". Copiez le code suivant pour charger ces candidats.
RecommendationsViewController.swift
func getMovies() -> [MovieItem] {
let barController = self.tabBarController as! TabBarController
return barController.movies
}
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 :
RecommendationsViewController.swift
// Given a list of selected items, preprocess to get tflite input.
func preProcess() -> Data {
let likedMovies = getLikedMovies().map { (MovieItem) -> Int32 in
return MovieItem.id
}
var inputData = Data(copyingBufferOf: Array(likedMovies.prefix(10)))
// Pad input data to have a minimum of 10 context items (4 bytes each)
while inputData.count < 10*4 {
inputData.append(0)
}
return inputData
}
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.
RecommendationsViewController.swift
import TensorFlowLite
RecommendationsViewController.swift
private var interpreter: Interpreter?
func loadModel() {
// Download the model from Firebase
print("Fetching recommendations model...")
ModelDownloader.fetchModel(named: "recommendations") { (filePath, error) in
guard let path = filePath else {
if let error = error {
print(error)
}
return
}
print("Recommendations model download complete")
self.loadInterpreter(path: path)
}
}
func loadInterpreter(path: String) {
do {
interpreter = try Interpreter(modelPath: path)
// Allocate memory for the model's input `Tensor`s.
try interpreter?.allocateTensors()
let inputData = preProcess()
// Copy the input data to the input `Tensor`.
try self.interpreter?.copy(inputData, toInputAt: 0)
// Run inference by invoking the `Interpreter`.
try self.interpreter?.invoke()
// Get the output `Tensor`
let confidenceOutputTensor = try self.interpreter?.output(at: 0)
let idOutputTensor = try self.interpreter?.output(at: 1)
// Copy output to `Data` to process the inference results.
let confidenceOutputSize = confidenceOutputTensor?.shape.dimensions.reduce(1, {x, y in x * y})
let idOutputSize = idOutputTensor?.shape.dimensions.reduce(1, {x, y in x * y})
let confidenceResults =
UnsafeMutableBufferPointer<Float32>.allocate(capacity: confidenceOutputSize!)
let idResults =
UnsafeMutableBufferPointer<Int32>.allocate(capacity: idOutputSize!)
_ = confidenceOutputTensor?.data.copyBytes(to: confidenceResults)
_ = idOutputTensor?.data.copyBytes(to: idResults)
postProcess(idResults, confidenceResults)
print("Successfully ran inference")
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch {
print("Error occurred creating model interpreter: \(error)")
}
}
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.
RecommendationsViewController.swift
// Postprocess to get results from tflite inference.
func postProcess(_ idResults: UnsafeMutableBufferPointer<Int32>, _ confidenceResults: UnsafeMutableBufferPointer<Float32>) {
for i in 0..<10 {
let id = idResults[i]
let movieIdx = getMovies().firstIndex { $0.id == id }
let title = getMovies()[movieIdx!].title
recommendations.append(Recommendation(title: title, confidence: confidenceResults[i]))
}
}
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.
11. 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.
En savoir plus
Vous avez une question ?
Signaler des problèmes