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

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

Задача поддерживает Gemma 2B , часть семейства легких современных открытых моделей, созданных на основе тех же исследований и технологий, которые использовались при создании моделей Gemini . Он также поддерживает следующие внешние модели: Phi-2 , Falcon-RW-1B и StableLM-3B , а также все модели, экспортированные через AI Edge.

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

Пример кода

В этом руководстве рассматривается пример базового приложения для генерации текста для Android. Вы можете использовать это приложение в качестве отправной точки для своего собственного приложения для Android или обращаться к нему при изменении существующего приложения. Код примера размещен на GitHub .

Загрузите код

Следующие инструкции показывают, как создать локальную копию кода примера с помощью инструмента командной строки git .

Чтобы загрузить пример кода:

  1. Клонируйте репозиторий git, используя следующую команду:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. При желании настройте свой экземпляр git на использование разреженной проверки, чтобы у вас были только файлы для примера приложения LLM Inference API:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/llm_inference/android
    

После создания локальной версии кода примера вы можете импортировать проект в Android Studio и запустить приложение. Инструкции см. в Руководстве по установке для Android .

Настраивать

В этом разделе описаны ключевые шаги по настройке среды разработки и проектов кода специально для использования API LLM Inference. Общие сведения о настройке среды разработки для использования задач MediaPipe, включая требования к версии платформы, см. в руководстве по настройке для Android .

Зависимости

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

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

Модель

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

Дополнительную информацию о доступных обученных моделях для LLM Inference API см. в разделе «Модели » обзора задач.

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

Перед инициализацией API вывода LLM загрузите одну из поддерживаемых моделей и сохраните файл в каталоге вашего проекта:

  • Gemma 2B : часть семейства легких современных открытых моделей, созданных на основе тех же исследований и технологий, которые использовались при создании моделей Gemini . Хорошо подходит для различных задач по созданию текста, включая ответы на вопросы, обобщение и рассуждения.
  • Phi-2 : модель преобразователя с 2,7 миллиардами параметров, лучше всего подходит для формата вопросов-ответов, чата и кода.
  • Falcon-RW-1B : модель причинного декодера с 1 миллиардом параметров, обученная на 350 миллиардах токенов RefinedWeb .
  • StableLM-3B : языковая модель только для декодера с 3 миллиардами параметров, предварительно обученная на 1 триллионе токенов различных наборов данных английского языка и кода.

Альтернативно вы можете использовать модели, сопоставленные и экспортированные через AI Edge Troch .

Мы рекомендуем использовать Gemma 2B, которая доступна на Kaggle Models и имеет формат, уже совместимый с API вывода LLM. Если вы используете другой LLM, вам нужно будет преобразовать модель в формат, совместимый с MediaPipe. Дополнительную информацию о Gemma 2B можно найти на сайте Gemma . Дополнительную информацию о других доступных моделях см. в разделе «Модели обзора задач».

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

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

Если вы используете внешний LLM (Phi-2, Falcon или StableLM) или версию Gemma, отличную от Kaggle, используйте наши сценарии преобразования, чтобы отформатировать модель, чтобы она была совместима с MediaPipe.

Для процесса преобразования модели требуется пакет MediaPipe PyPI. Сценарий преобразования доступен во всех пакетах MediaPipe после 0.10.11 .

Установите и импортируйте зависимости следующим образом:

$ python3 -m pip install mediapipe

Используйте библиотеку genai.converter для преобразования модели:

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

config = converter.ConversionConfig(
  input_ckpt=INPUT_CKPT,
  ckpt_format=CKPT_FORMAT,
  model_type=MODEL_TYPE,
  backend=BACKEND,
  output_dir=OUTPUT_DIR,
  combine_file_only=False,
  vocab_model_file=VOCAB_MODEL_FILE,
  output_tflite_file=OUTPUT_TFLITE_FILE,
)

converter.convert_checkpoint(config)

Чтобы преобразовать модель LoRA, ConversionConfig должен указать параметры базовой модели, а также дополнительные параметры LoRA. Обратите внимание: поскольку API поддерживает вывод LoRA только с помощью графического процессора, для серверной части необходимо установить значение 'gpu' .

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_TFLITE_FILE,
)

converter.convert_checkpoint(config)

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

Параметр Описание Принятые значения
input_ckpt Путь к файлу model.safetensors или pytorch.bin . Обратите внимание, что иногда формат защитных тензоров модели разбивается на несколько файлов, например model-00001-of-00003.safetensors , model-00001-of-00003.safetensors . Вы можете указать шаблон файла, например model*.safetensors . ПУТЬ
ckpt_format Формат файла модели. {"safetensors", "pytorch"}
model_type LLM конвертируется. {"PHI_2", "FALCON_RW_1B", "STABLELM_4E1T_3B", "GEMMA_2B"}
backend Процессор (делегат), используемый для запуска модели. {"процессор", "графический процессор"}
output_dir Путь к выходному каталогу, в котором хранятся файлы весов каждого слоя. ПУТЬ
output_tflite_file Путь к выходному файлу. Например, «model_cpu.bin» или «model_gpu.bin». Этот файл совместим только с API вывода LLM и не может использоваться в качестве обычного файла tflite. ПУТЬ
vocab_model_file Путь к каталогу, в котором хранятся файлы tokenizer.json и tokenizer_config.json . Для Gemma укажите один файл tokenizer.model . ПУТЬ
lora_ckpt Путь к файлу LoRA ckpt ofsafetensors, в котором хранится вес адаптера LoRA. ПУТЬ
lora_rank Целое число, представляющее ранг LoRA ckpt. Требуется для преобразования весов Лоры. Если он не указан, преобразователь предполагает, что веса LoRA отсутствуют. Примечание. Только серверная часть графического процессора поддерживает LoRA. Целое число
lora_output_tflite_file Выходное имя файла tflite для весов LoRA. ПУТЬ

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

Если вы используете LLM, сопоставленный с моделью TFLite через AI Edge, используйте наш сценарий связывания для создания пакета задач . Процесс объединения упаковывает сопоставленную модель с дополнительными метаданными (например, параметрами токенизатора), необходимыми для выполнения сквозного вывода.

Для процесса объединения моделей требуется пакет MediaPipe PyPI. Сценарий преобразования доступен во всех пакетах MediaPipe после 0.10.14 .

Установите и импортируйте зависимости следующим образом:

$ python3 -m pip install mediapipe

Используйте библиотеку genai.bundler для объединения модели:

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

config = bundler.BundleConfig(
    tflite_model=TFLITE_MODEL,
    tokenizer_model=TOKENIZER_MODEL,
    start_token=START_TOKEN,
    stop_tokens=STOP_TOKENS,
    output_filename=OUTPUT_FILENAME,
    enable_bytes_to_unicode_mapping=ENABLE_BYTES_TO_UNICODE_MAPPING,
)
bundler.create_bundle(config)
Параметр Описание Принятые значения
tflite_model Путь к экспортированной модели TFLite из AI Edge. ПУТЬ
tokenizer_model Путь к модели токенизатора SentencePiece. ПУТЬ
start_token Стартовый токен конкретной модели. Стартовый токен должен присутствовать в предоставленной модели токенизатора. НИТЬ
stop_tokens Токены остановки для конкретной модели. Стоп-токены должны присутствовать в предоставленной модели токенизатора. СПИСОК[СТРОКА]
output_filename Имя выходного файла пакета задач. ПУТЬ

Отправьте модель на устройство

Отправьте содержимое папки 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.bin

Создать задачу

API вывода MediaPipe LLM использует функцию createFromOptions() для настройки задачи. Функция createFromOptions() принимает значения параметров конфигурации. Дополнительные сведения о параметрах конфигурации см. в разделе Параметры конфигурации .

Следующий код инициализирует задачу, используя базовые параметры конфигурации:

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPATH('/data/local/.../')
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .build()

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

Варианты конфигурации

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

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

Подготовьте данные

API вывода LLM принимает следующие входные данные:

  • подсказка (строка): вопрос или подсказка.
val inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."

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

Используйте generateResponse() , чтобы сгенерировать текстовый ответ на введенный текст, указанный в предыдущем разделе ( inputPrompt ). Это создает один сгенерированный ответ.

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 возвращает LlmInferenceResult , который включает сгенерированный текст ответа.

Here's a draft you can use:

Subject: Lunch on Saturday Reminder

Hi Brett,

Just a quick reminder about our lunch plans this Saturday at noon.
Let me know if that still works for you.

Looking forward to it!

Best,
[Your Name]

Настройка модели LoRA

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

Поддержка LoRA API вывода LLM работает для моделей Gemma-2B и Phi-2 для серверной части графического процессора, при этом веса LoRA применимы только к уровням внимания. Эта первоначальная реализация служит экспериментальным API для будущих разработок, и в следующих обновлениях планируется поддерживать больше моделей и различных типов слоев.

Подготовьте модели LoRA

Следуйте инструкциям на HuggingFace , чтобы обучить точно настроенную модель LoRA на вашем собственном наборе данных с поддерживаемыми типами моделей: Gemma-2B или Phi-2. Модели Gemma-2B и Phi-2 доступны на HuggingFace в формате защитных тензоров. Поскольку API LLM Inference поддерживает LoRA только на уровнях внимания, при создании LoraConfig указывайте только уровни внимания следующим образом:

# For Gemma-2B
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"],
)

Для тестирования на HuggingFace доступны общедоступные точно настроенные модели LoRA, соответствующие API LLM Inference. Например, monsterapi/gemma-2b-lora-maths-orca-200k для Gemma-2B и lole25/phi-2-sft-ultrachat-lora для Phi-2.

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

На следующем шаге вам необходимо преобразовать веса модели в плоский буфер TensorFlow Lite с помощью пакета Python MediaPipe. ConversionConfig должен указывать параметры базовой модели, а также дополнительные параметры LoRA. Обратите внимание: поскольку API поддерживает вывод LoRA только с помощью графического процессора, для серверной части необходимо установить значение 'gpu' .

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_TFLITE_FILE,
)

converter.convert_checkpoint(config)

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

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

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

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

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPath('<path to base model>')
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .setLoraPath('<path to LoRA model>')
        .build()

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

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