1. Обзор
|
|
Добро пожаловать на практический урок по созданию рекомендательных моделей с использованием TensorFlow Lite и Firebase. В этом уроке вы узнаете, как использовать TensorFlow Lite и Firebase для развертывания рекомендательной модели в вашем приложении. Этот урок основан на примере TensorFlow Lite.
Система рекомендаций позволяет приложениям использовать машинное обучение для интеллектуальной подачи наиболее релевантного контента каждому пользователю. Она учитывает предыдущее поведение пользователей, предлагая контент приложения, с которым пользователь может захотеть взаимодействовать в будущем, используя модель, обученную на основе совокупного поведения большого количества других пользователей.
В этом руководстве показано, как получить данные от пользователей вашего приложения с помощью Firebase Analytics, создать модель машинного обучения для рекомендаций на основе этих данных, а затем использовать эту модель в приложении Android для выполнения вывода и получения рекомендаций. В частности, наши рекомендации будут предлагать, какие фильмы пользователь, скорее всего, посмотрит, учитывая список фильмов, которые ему понравились ранее.
Что вы узнаете
- Интегрируйте Firebase Analytics в Android-приложение для сбора данных о поведении пользователей.
- Экспортируйте эти данные в Google Big Query.
- Предварительная обработка данных и обучение модели рекомендаций TF Lite.
- Разверните модель TF Lite в Firebase ML и получите к ней доступ из своего приложения.
- Запустите модель на устройстве, чтобы предлагать пользователям рекомендации.
Что вам понадобится
- Последняя версия Android Studio .
- Пример кода.
- Тестовое устройство с Android 7+ и Google Play Services 9.8 или более поздней версии, или эмулятор с Google Play Services 9.8 или более поздней версии.
- Если используется устройство, потребуется соединительный кабель.
Как вы будете использовать этот учебный материал?
Как бы вы оценили свой опыт разработки приложений для Android?
2. Получите пример кода.
Клонируйте репозиторий GitHub из командной строки.
$ git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-android.git
3. Импортируйте стартовое приложение.
В Android Studio выберите каталог codelab-recommendations-android (
) из загруженного примера кода ( Файл > Открыть > .../codelab-recommendations-android/start).
Теперь в Android Studio должен быть открыт стартовый проект.
4. Создайте проект консоли Firebase.
Создать новый проект
- Перейдите в консоль Firebase .
- Выберите «Добавить проект» (или «Создать проект», если это первый вариант).
- Выберите или введите название проекта и нажмите «Продолжить» .
- Убедитесь, что параметр "Включить Google Analytics для этого проекта" включен.
- Выполните оставшиеся шаги настройки в консоли Firebase, затем нажмите «Создать проект» (или «Добавить Firebase», если вы используете существующий проект Google).
5. Добавьте Firebase
- На экране обзора вашего нового проекта нажмите на значок Android, чтобы запустить процесс настройки.
- Введите имя пакета для выполнения задания:
com.google.firebase.codelabs.recommendations - Выберите «Зарегистрироваться в приложении» .
Добавьте файл google-services.json в ваше приложение.
После добавления имени пакета и выбора пункта «Зарегистрировать» нажмите «Скачать google-services.json» , чтобы получить файл конфигурации Firebase Android, затем скопируйте файл google-services.json в каталог app вашего проекта. После загрузки файла вы можете пропустить следующие шаги, отображаемые в консоли (они уже выполнены за вас в проекте build-android-start).
Добавьте плагин google-services в ваше приложение.
Плагин google-services использует файл google-services.json для настройки вашего приложения на использование Firebase. Следующие строки уже должны быть добавлены в файлы build.gradle.kts в проекте (проверьте для подтверждения):
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
}
Синхронизируйте свой проект с файлами Gradle.
Чтобы убедиться, что все зависимости доступны вашему приложению, на этом этапе следует синхронизировать проект с файлами Gradle. Выберите File > Sync Project with Gradle Files на панели инструментов Android Studio.
6. Запустите стартовое приложение.
Теперь, когда вы импортировали проект в Android Studio и настроили плагин google-services с помощью вашего JSON-файла, вы готовы запустить приложение в первый раз. Подключите ваше устройство Android и нажмите «Запустить» (
) на панели инструментов Android Studio.
Приложение должно запуститься на вашем устройстве. На этом этапе вы увидите работающее приложение, отображающее вкладку со списком фильмов, вкладку «Понравившиеся фильмы» и вкладку «Рекомендации». Вы можете нажать на фильм в списке фильмов, чтобы добавить его в свой список понравившихся. После выполнения оставшихся шагов этого практического задания мы сможем генерировать рекомендации фильмов на вкладке «Рекомендации».
7. Добавьте Firebase Analytics в приложение.
На этом этапе вы добавите Firebase Analytics в приложение для регистрации данных о поведении пользователей (в данном случае, какие фильмы нравятся пользователю). Эти данные будут использоваться в совокупности на последующих этапах для обучения модели рекомендаций.
Добавьте зависимости Firebase Bill of Materials и Analytics.
Для добавления Firebase Analytics в ваше приложение необходимы следующие зависимости. Они уже должны быть включены в файл app/build.gradle.kts (проверьте это).
app/build.grade.kts
implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
implementation("com.google.firebase:firebase-analytics-ktx")
Настройте Firebase Analytics в приложении.
В модели LikedMoviesViewModel содержатся функции для хранения фильмов, которые понравились пользователю. Каждый раз, когда пользователь ставит лайк новому фильму, мы хотим также отправлять событие в журнал аналитики, чтобы зафиксировать этот лайк.
Добавьте функцию onMovieLiked с приведенным ниже кодом, чтобы зарегистрировать событие аналитики, когда пользователь нажимает кнопку «Нравится» на фильме.
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())
}
}
Добавьте следующее поле и функцию для регистрации события Analytics при добавлении фильма в список понравившихся пользователю.
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. Протестируйте интеграцию с Analytics.
На этом этапе мы сгенерируем события Analytics в приложении и убедимся, что они отправляются в консоль Firebase.
Включить отладочное логирование аналитики
Firebase Analytics разработан для максимального увеличения времени автономной работы устройства и собирает события в пакеты на устройстве, отправляя их в Firebase лишь изредка. В целях отладки мы можем отключить это поведение, чтобы видеть события, регистрируемые в режиме реального времени, выполнив следующую команду в командной оболочке.
Терминал
adb shell setprop debug.firebase.analytics.app com.google.firebase.codelabs.recommendations
Проверьте, что события Analytics сгенерированы.
- В Android Studio откройте окно Logcat, чтобы просмотреть логи вашего приложения.
- Установите для фильтра Logcat значение строки "Событие логирования".
- Убедитесь, что события аналитики "select_item" генерируются каждый раз, когда вы ставите лайк фильму в приложении.
На этом этапе вы успешно интегрировали Firebase Analytics в свое приложение. По мере того, как пользователи используют ваше приложение и ставят лайки фильмам, их лайки будут регистрироваться в агрегированном виде. Мы будем использовать эти агрегированные данные в оставшейся части этого практического занятия для обучения нашей модели рекомендаций. Следующий шаг является необязательным и позволяет увидеть те же события Analytics, которые вы видели в Logcat, также поступающие в консоль Firebase. Можете смело переходить на следующую страницу.
(Необязательно) Подтверждайте события аналитики в консоли Firebase.
- Перейдите в консоль Firebase .
- Выберите DebugView в разделе Analytics.
- В Android Studio выберите «Запустить» , чтобы запустить приложение и добавить несколько фильмов в список «Понравилось».
- В окне отладки (DebugView) консоли Firebase убедитесь, что эти события регистрируются при добавлении фильмов в приложение.
9. Экспорт аналитических данных в Big Query
Big Query — это продукт Google Cloud, позволяющий анализировать и обрабатывать большие объемы данных. На этом шаге вы подключите свой проект Firebase Console к Big Query, чтобы данные аналитики, генерируемые вашим приложением, автоматически экспортировались в Big Query.
Включить экспорт в Big Query
- Перейдите в консоль Firebase .
- Выберите значок шестеренки «Настройки» рядом с разделом «Обзор проекта» , а затем выберите «Настройки проекта».
- Выберите вкладку «Интеграции» .
- Выберите «Ссылка» (или «Управление» ) внутри блока BigQuery .
- На шаге «О подключении Firebase к BigQuery» выберите «Далее» .
- В разделе «Настройка интеграции» включите отправку данных Google Analytics и выберите «Связать с BigQuery» .
Теперь ваш проект в консоли Firebase настроен на автоматическую отправку данных о событиях Firebase Analytics в Big Query. Это происходит автоматически без какого-либо дополнительного вмешательства, однако первый экспорт, создающий набор данных аналитики в Big Query, может произойти только через 24 часа. После создания набора данных Firebase постоянно экспортирует новые события Analytics в Big Query в таблицу внутридневных событий и группирует события за прошедшие дни в таблице событий.
Для обучения модели рекомендаций требуется много данных. Поскольку у нас пока нет приложения, генерирующего большие объемы данных, на следующем шаге мы импортируем пример набора данных в BigQuery, который будем использовать в оставшейся части этого руководства.
10. Используйте BigQuery для получения данных для обучения модели.
Теперь, когда мы подключили консоль Firebase для экспорта в BigQuery, данные о событиях аналитики нашего приложения автоматически отобразятся в консоли BigQuery через некоторое время. Чтобы получить исходные данные для целей этого руководства, на этом шаге мы импортируем существующий пример набора данных в вашу консоль BigQuery для использования при обучении нашей модели рекомендаций.
Импортируйте пример набора данных в BigQuery.
- Перейдите на панель управления BigQuery в консоли Google Cloud.
- Выберите название своего проекта в меню.
- Чтобы просмотреть подробности, выберите название своего проекта в нижней части левой панели навигации BigQuery.
- Выберите «Создать набор данных» , чтобы открыть панель создания набора данных.
- Введите 'firebase_recommendations_dataset' в поле "Идентификатор набора данных " и выберите "Создать набор данных" .
- Новый набор данных появится в левом меню под названием проекта. Щёлкните по нему.
- Выберите «Создать таблицу» , чтобы открыть панель создания таблицы.
- Для создания таблицы выберите «Google Cloud Storage».
- В поле «Выберите файл из корзины GCS» введите 'gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt'.
- В раскрывающемся списке «Формат файла» выберите «JSONL».
- Введите 'recommendations_table' в качестве имени таблицы .
- Установите флажок в разделе Схема > Автоматическое определение > Схема и входные параметры
- Выберите «Создать таблицу»
Изучите пример набора данных.
На этом этапе вы можете по желанию изучить схему и предварительно просмотреть этот набор данных.
- Выберите firebase-recommendations-dataset в левом меню, чтобы развернуть список содержащихся в нем таблиц.
- Выберите таблицу recommendations-table , чтобы просмотреть схему таблицы.
- Выберите «Предварительный просмотр» , чтобы увидеть фактические данные о событиях Analytics, содержащиеся в этой таблице.
Создать учетные данные сервисной учетной записи
Теперь мы создадим учетные данные сервисной учетной записи в нашем проекте консоли Google Cloud, которые мы сможем использовать в среде Colab на следующем шаге для доступа и загрузки данных BigQuery.
- Убедитесь, что для вашего проекта в Google Cloud включена функция выставления счетов.
- Включите API BigQuery и BigQuery Storage. < нажмите здесь >
- Перейдите на страницу создания ключа учетной записи службы .
- В списке учетных записей служб выберите «Новая учетная запись службы» .
- В поле « Имя учетной записи службы» введите имя.
- В списке ролей выберите Проект > Владелец .
- Нажмите «Создать». Будет создан JSON-файл, содержащий ключи, которые можно загрузить на ваш компьютер.
На следующем этапе мы воспользуемся Google Colab для предварительной обработки этих данных и обучения нашей модели рекомендаций.
11. Предварительная обработка данных и обучение модели рекомендаций.
На этом этапе мы будем использовать блокнот Colab для выполнения следующих действий:
- Импортируйте данные BigQuery в блокнот Colab.
- предварительная обработка данных для подготовки их к обучению модели.
- обучить модель рекомендаций на аналитических данных
- экспортируйте модель как модель TF Lite.
- Разверните модель в консоли Firebase, чтобы мы могли использовать её в нашем приложении.
Прежде чем запустить обучающий блокнот Colab, мы сначала включим API управления моделями Firebase, чтобы Colab мог развернуть обученную модель в нашей консоли Firebase.
Включить API управления моделями Firebase
Создайте хранилище (bucket) для ваших моделей машинного обучения.
В консоли Firebase перейдите в раздел «Хранилище» и нажмите «Начать». 
Следуйте инструкциям в диалоговом окне, чтобы настроить ваше хранилище.

Включить API Firebase ML
Перейдите на страницу Firebase ML API в консоли Google Cloud и нажмите «Включить».
Используйте блокнот Colab для обучения и развертывания модели.
Откройте блокнот Colab, используя следующую ссылку, и выполните описанные в нем шаги. После завершения всех шагов в блокноте Colab у вас будет файл модели TF Lite, развернутый в консоли Firebase, который мы сможем синхронизировать с нашим приложением.
Открыть в Colab
12. Загрузите модель в свое приложение.
На этом этапе мы изменим наше приложение, чтобы оно загружало только что обученную нами модель из Firebase Machine Learning.
Добавить зависимость Firebase ML
Для использования моделей машинного обучения Firebase в вашем приложении необходима следующая зависимость. Она уже должна быть добавлена (проверьте).
app/build.grade.kts
implementation("com.google.firebase:firebase-ml-modeldownloader:24.1.2")
Загрузите модель с помощью API Firebase Model Manager.
Скопируйте приведенный ниже код в файл RecommendationClient.kt , чтобы настроить условия загрузки модели и создать задачу загрузки для синхронизации удаленной модели с нашим приложением.
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. Интегрируйте модель рекомендаций Tensorflow Lite в ваше приложение.
Среда выполнения TensorFlow Lite позволит вам использовать вашу модель в приложении для генерации рекомендаций. На предыдущем шаге мы инициализировали интерпретатор TFlite с помощью загруженного файла модели. На этом шаге мы сначала загрузим словарь и метки для сопровождения нашей модели на этапе вывода, затем добавим предварительную обработку для генерации входных данных для нашей модели и постобработку, где мы извлечем результаты из нашего вывода.
Загрузить словарь и метки
Метки, используемые моделью рекомендаций для генерации кандидатов в рекомендации, перечислены в файле sorted_movie_vocab.json в папке res/assets. Скопируйте следующий код, чтобы загрузить эти кандидаты.
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.")
}
}
Реализовать предварительную обработку
На этапе предварительной обработки мы изменяем форму входных данных в соответствии с ожиданиями нашей модели. Здесь мы добавляем к длине входных данных значение-заполнитель, если у нас еще не сгенерировано много пользовательских лайков. Скопируйте приведенный ниже код:
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
}
}
Запустите интерпретатор для генерации рекомендаций.
Здесь мы используем модель, загруженную на предыдущем шаге, для выполнения вывода на предварительно обработанных входных данных. Мы задаем тип входных и выходных данных для нашей модели и запускаем вывод для генерации рекомендаций фильмов. Скопируйте следующий код в ваше приложение.
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()
}
}
}
Реализовать постобработку
Наконец, на этом этапе мы обрабатываем выходные данные нашей модели, выбирая результаты с наибольшей степенью достоверности и удаляя содержащиеся в них значения (фильмы, которые пользователь уже лайкнул). Скопируйте следующий код в ваше приложение.
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
}
}
Протестируйте своё приложение!
Перезапустите приложение. После выбора нескольких фильмов оно должно автоматически загрузить новую модель и начать генерировать рекомендации!
14. Поздравляем!
Вы интегрировали функцию рекомендаций в свое приложение, используя TensorFlow Lite и Firebase. Обратите внимание, что методы и конвейер, показанные в этом практическом примере, могут быть обобщены и использованы для предоставления рекомендаций и других типов.
Что мы рассмотрели
- Firebase ML
- Firebase Analytics
- Экспорт аналитических событий в BigQuery
- Предварительная обработка аналитических событий
- Рекомендации по обучению модели TensorFlow
- Экспортируйте модель и разверните её в консоли Firebase.
- Предлагайте рекомендации фильмов в приложении.
Следующие шаги
- Внедрите рекомендации Firebase ML в ваше приложение.

