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

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

Чтобы быстро добавить LLM Inference API в приложение Android, следуйте Quickstart . Для простого примера приложения Android, работающего с LLM Inference API, см. пример приложения . Для более глубокого понимания того, как работает LLM Inference API, см. разделы конфигурации , преобразования моделей и настройки LoRA .

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

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

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

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

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

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

Загрузить модель

Загрузите 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
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 в действии и изучить широкий спектр возможностей генеративного ИИ на устройстве, ознакомьтесь с приложением Google AI Edge Gallery .

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

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

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

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

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

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

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

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

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

  • Gemma-3n E2B : модель 2B семейства Gemma-3n.
  • Gemma-3n E4B : модель 4B семейства Gemma-3n.

Более подробную информацию см. в документации Gemma-3n .

Чтобы предоставить изображения в приглашении, преобразуйте входные изображения или кадры в объект 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();

Gemma-3n принимает максимум одно изображение за сеанс, поэтому установите MaxNumImages на 1.

LlmInferenceOptions options = LlmInferenceOptions.builder()
  ...
  .setMaxNumImages(1)
  .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();
}

Настройка LoRA

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

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

Базовая модель должна быть в формате safetensors для создания весов LoRA. После обучения 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, используемой во время преобразования модели.

Конверсия модели

Используйте пакет MediaPipe Python для преобразования весов модели в формат 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() что и в базовой модели.