Руководство по выводу LLM для Android

API LLM Inference позволяет запускать большие языковые модели (LLM) полностью на устройстве для приложений Android, что дает возможность выполнять широкий спектр задач, таких как генерация текста, извлечение информации на естественном языке и составление резюме документов. Эта функция обеспечивает встроенную поддержку нескольких больших языковых моделей преобразования текста в текст, позволяя применять новейшие модели генеративного ИИ на устройстве к вашим приложениям Android.

Чтобы быстро добавить API вывода LLM в ваше Android-приложение, следуйте инструкциям в разделе «Быстрый старт» . Простой пример Android-приложения, работающего с API вывода LLM, можно найти в примере приложения . Для более подробного понимания принципов работы API вывода LLM обратитесь к разделам «Параметры конфигурации» , «Преобразование модели » и «Настройка LoRA» .

Вы можете увидеть эту задачу в действии в демонстрационной версии MediaPipe Studio . Для получения дополнительной информации о возможностях, моделях и параметрах конфигурации этой задачи см. раздел «Обзор» .

Быстрый старт

Выполните следующие шаги, чтобы добавить API LLM Inference в ваше Android-приложение. API LLM Inference оптимизирован для высокопроизводительных Android-устройств, таких как Pixel 8 и Samsung S23 или более поздних моделей, и не обеспечивает надежную поддержку эмуляторов устройств.

Добавить зависимости

API LLM Inference использует библиотеку com.google.mediapipe:tasks-genai . Добавьте эту зависимость в файл build.gradle вашего Android-приложения:

dependencies {
    implementation 'com.google.mediapipe:tasks-genai:0.10.27'
}

Скачать модель

Загрузите Gemma-3 1B в 4-битном квантованном формате с сайта Hugging Face . Для получения дополнительной информации о доступных моделях см. документацию по моделям .

Загрузите содержимое папки output_path на устройство Android.

$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push output_path /data/local/tmp/llm/model_version.task

Инициализировать задачу

Инициализируйте задачу с основными параметрами конфигурации:

// Set the configuration options for the LLM Inference task
val taskOptions = LlmInferenceOptions.builder()
        .setModelPath("/data/local/tmp/llm/model_version.task")
        .setMaxTopK(64)
        .build()

// Create an instance of the LLM Inference task
val llmInference = LlmInference.createFromOptions(context, taskOptions)

Запустить задачу

Используйте метод generateResponse() для генерации текстового ответа. В результате будет получен один сгенерированный ответ.

val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")

Для потоковой передачи ответа используйте метод generateResponseAsync() .

val options = LlmInference.LlmInferenceOptions.builder()
  ...
  .setResultListener { partialResult, done ->
    logger.atInfo().log("partial result: $partialResult")
  }
  .build()

llmInference.generateResponseAsync(inputPrompt)

Пример приложения

Чтобы увидеть API-интерфейсы LLM Inference в действии и изучить полный спектр возможностей генеративного ИИ на устройстве, ознакомьтесь с приложением Google AI Edge Gallery .

Google AI Edge Gallery — это приложение для Android с открытым исходным кодом, которое служит интерактивной площадкой для разработчиков. В нём представлены:

  • Практические примеры использования API LLM Inference для решения различных задач, в том числе:
    • Запрос изображения: Загрузите изображение и задайте к нему вопросы. Получите описания, решите проблемы или определите объекты.
    • Лабораторная работа с подсказками: составьте краткое изложение, перепишите, сгенерируйте код или используйте подсказки в свободной форме, чтобы изучить примеры использования материалов LLM в рамках одного занятия.
    • AI Chat: Участвуйте в многоэтапных диалогах.
  • Возможность находить, загружать и экспериментировать с различными оптимизированными для LiteRT моделями из сообщества Hugging Face LiteRT и официальных релизов Google (например, Gemma 3N).
  • Результаты тестов производительности на устройстве в режиме реального времени для различных моделей (время до получения первого токена, скорость декодирования и т. д.).
  • Как импортировать и тестировать собственные пользовательские модели .litertlm или .task .

Это приложение — ресурс для понимания практической реализации API LLM Inference и потенциала генеративного ИИ на устройствах. Изучите исходный код и загрузите приложение из репозитория Google AI Edge Gallery на GitHub .

Параметры конфигурации

Для настройки приложения Android используйте следующие параметры конфигурации:

Название варианта Описание Диапазон значений Значение по умолчанию
modelPath Путь к месту хранения модели в каталоге проекта. ПУТЬ Н/Д
maxTokens Максимальное количество токенов (входные токены + выходные токены), которое обрабатывает модель. Целое число 512
topK Количество токенов, которые модель рассматривает на каждом шаге генерации. Ограничивает прогнозы k наиболее вероятными токенами. Целое число 40
temperature Степень случайности, вносимая в процесс генерации. Более высокая температура приводит к большей креативности в генерируемом тексте, в то время как более низкая температура обеспечивает более предсказуемую генерацию. Плавать 0,8
randomSeed Начальное значение генератора случайных чисел, используемое при генерации текста. Целое число 0
loraPath Абсолютный путь к локальной модели LoRA на устройстве. Примечание: это совместимо только с моделями с графическим процессором (GPU). ПУТЬ Н/Д
resultListener Устанавливает обработчик результатов для асинхронного получения результатов. Применимо только при использовании метода асинхронной генерации. Н/Д Н/Д
errorListener Устанавливает необязательный обработчик ошибок. Н/Д Н/Д

Мультимодальная подсказка

API вывода LLM в Android поддерживает многомодальные подсказки с моделями, принимающими текст, изображения и аудиовходные данные. При включенной многомодальности пользователи могут включать в свои подсказки комбинацию изображений и текста или аудио и текста. Затем LLM предоставляет текстовый ответ.

Для начала используйте вариант Gemma 3n , совместимый с MediaPipe:

  • Gemma-3n E2B : эффективная модель 2B семейства Gemma-3n.
  • Gemma-3n E4B : эффективная 4B-модель семейства Gemma-3n.

Для получения более подробной информации см. документацию Gemma-3n .

Выполните следующие шаги, чтобы включить ввод изображений или звука для API вывода LLM.

Ввод изображения

Чтобы добавить изображения в подсказку, преобразуйте входные изображения или фреймы в объект com.google.mediapipe.framework.image.MPImage перед передачей его в API вывода LLM:

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(image).build()

Чтобы включить поддержку машинного зрения для API вывода LLM, установите параметр конфигурации EnableVisionModality в true в параметрах Graph:

LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
  LlmInferenceSession.LlmInferenceSessionOptions.builder()
    ...
    .setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
    .build();

Установите максимальное количество изображений на сессию — 10.

LlmInferenceOptions options = LlmInferenceOptions.builder()
  ...
  .setMaxNumImages(10)
  .build();

Ниже приведен пример реализации API вывода LLM, настроенного для обработки визуального и текстового ввода:

MPImage image = getImageFromAsset(BURGER_IMAGE);

LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
  LlmInferenceSession.LlmInferenceSessionOptions.builder()
    .setTopK(10)
    .setTemperature(0.4f)
    .setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
    .build();

try (LlmInference llmInference =
    LlmInference.createFromOptions(ApplicationProvider.getApplicationContext(), options);
  LlmInferenceSession session =
    LlmInferenceSession.createFromOptions(llmInference, sessionOptions)) {
  session.addQueryChunk("Describe the objects in the image.");
  session.addImage(image);
  String result = session.generateResponse();
}

Аудиовход

Включите поддержку звука в LlmInferenceOptions

val inferenceOptions = LlmInference.LlmInferenceOptions.builder()
  ...
  .setAudioModelOptions(AudioModelOptions.builder().build())
  .build()

Включите поддержку звука в параметрах сессии.

    val sessionOptions =  LlmInferenceSessionOptions.builder()
      ...
      .setGraphOptions(GraphOptions.builder().setEnableAudioModality(true).build())
      .build()

Отправляйте аудиоданные во время обработки. Примечание: Аудио должно быть монофоническим и иметь формат .wav.


val audioData: ByteArray = ...
inferenceEngine.llmInferenceSession.addAudio(audioData)

Ниже приведен пример реализации API вывода LLM, настроенного для обработки аудио- и текстовых входных данных:

val audioData: ByteArray = ...
val inferenceOptions = LlmInference.LlmInferenceOptions.builder()
  ...
  .setAudioModelOptions(AudioModelOptions.builder().build())
  .build()
val sessionOptions =  LlmInferenceSessionOptions.builder()
  ...
  .setGraphOptions(GraphOptions.builder().setEnableAudioModality(true).build())
  .build()

LlmInference.createFromOptions(context, inferenceOptions).use { llmInference ->
  LlmInferenceSession.createFromOptions(llmInference, sessionOptions).use { session ->
    session.addQueryChunk("Transcribe the following speech segment:")
    session.addAudio(audioData)
    val result = session.generateResponse()
  }
}

Настройка LoRA

API для вывода LLM поддерживает настройку LoRA (Low-Rank Adaptation) с использованием библиотеки PEFT (Parameter-Efficient Fine-Tuning). Настройка LoRA позволяет адаптировать поведение LLM с помощью экономичного процесса обучения, создавая небольшой набор обучаемых весов на основе новых обучающих данных, а не переобучая всю модель целиком.

API LLM Inference поддерживает добавление весов LoRA к слоям внимания моделей Gemma-2 2B , Gemma 2B и Phi-2 . Загрузите модель в формате safetensors .

Для создания весов LoRA базовая модель должна быть в формате safetensors . После обучения LoRA вы можете преобразовать модели в формат FlatBuffers для работы на MediaPipe.

Подготовьте веса LoRA

Используйте руководство по методам LoRA от PEFT, чтобы обучить доработанную модель LoRA на собственном наборе данных.

API вывода LLM поддерживает LoRA только для слоев внимания, поэтому указывайте слои внимания только в LoraConfig :

# For Gemma
from peft import LoraConfig
config = LoraConfig(
    r=LORA_RANK,
    target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
)

# For Phi-2
config = LoraConfig(
    r=LORA_RANK,
    target_modules=["q_proj", "v_proj", "k_proj", "dense"],
)

После обучения на подготовленном наборе данных и сохранения модели, точно настроенные веса модели LoRA становятся доступны в adapter_model.safetensors . Файл safetensors является контрольной точкой LoRA, используемой во время преобразования модели.

Преобразование модели

Используйте пакет Python MediaPipe для преобразования весов модели в формат Flatbuffer. Параметр ConversionConfig задает базовые параметры модели, а также дополнительные параметры LoRA.

import mediapipe as mp
from mediapipe.tasks.python.genai import converter

config = converter.ConversionConfig(
  # Other params related to base model
  ...
  # Must use gpu backend for LoRA conversion
  backend='gpu',
  # LoRA related params
  lora_ckpt=LORA_CKPT,
  lora_rank=LORA_RANK,
  lora_output_tflite_file=LORA_OUTPUT_FILE,
)

converter.convert_checkpoint(config)

Конвертер создаст два файла Flatbuffer: один для базовой модели, а другой для модели LoRA.

вывод модели LoRA

Android поддерживает статическую модель LoRA во время инициализации. Для загрузки модели LoRA необходимо указать путь к модели LoRA, а также базовый LLM.

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPath(BASE_MODEL_PATH)
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .setLoraPath(LORA_MODEL_PATH)
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)

Для выполнения вывода LLM с помощью LoRA используйте те же методы generateResponse() или generateResponseAsync() , что и в базовой модели.