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

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

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

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

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

Выполните следующие шаги, чтобы добавить API LLM Inference в ваше iOS-приложение. API LLM Inference использует библиотеку MediaPipeTasksGenai , которую необходимо установить с помощью CocoaPods. Библиотека совместима как с приложениями на Swift, так и на Objective-C и не требует дополнительной настройки, специфичной для конкретного языка.

Инструкции по установке CocoaPods на macOS см. в руководстве по установке CocoaPods . Инструкции по созданию Podfile с необходимыми pod-ами для вашего приложения см. в разделе «Использование CocoaPods» .

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

Добавьте модуль MediaPipeTasksGenai в Podfile , используя следующий код:

target 'MyLlmInferenceApp' do
  use_frameworks!
  pod 'MediaPipeTasksGenAI'
  pod 'MediaPipeTasksGenAIC'
end

Если ваше приложение включает в себя цели для модульных тестов, обратитесь к Руководству по настройке для iOS для получения дополнительной информации о настройке Podfile .

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

Загрузите модель Gemma-2 2B в 8-битном квантованном формате с Kaggle Models . Для получения дополнительной информации о доступных моделях см. документацию по моделям .

Добавьте модель в каталог вашего проекта с помощью Xcode. Инструкции по добавлению файлов в проект Xcode см. в разделе «Управление файлами и папками в проекте Xcode» .

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

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

import MediaPipeTasksGenai

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "bin")

let options = LlmInferenceOptions()
options.baseOptions.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101

let llmInference = try LlmInference(options: options)

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

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

let result = try LlmInference.generateResponse(inputText: inputPrompt)

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

let resultStream =  LlmInference.generateResponseAsync(inputText: inputPrompt)

do {
  for try await partialResult in resultStream {
    print("\(partialResult)")
  }
  print("Done")
}
catch {
  print("Response error: '\(error)")
}

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

Представленное приложение — это пример базового приложения для генерации текста на iOS, использующего API LLM Inference. Вы можете использовать это приложение в качестве отправной точки для своего собственного iOS-приложения или ссылаться на него при модификации существующего приложения. Пример кода размещен на GitHub .

Клонируйте репозиторий Git, используя следующую команду:

git clone https://github.com/google-ai-edge/mediapipe-samples

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

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

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

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

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

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

Модели Метод преобразования Совместимые платформы Тип файла
Джемма-3 1Б Преобразование не требуется Android, веб .задача
Джемма 2Б, Джемма 7Б, Джемма-2 2Б Преобразование не требуется Android, iOS, веб .bin
Phi-2, StableLM, Falcon скрипт преобразования MediaPipe Android, iOS, веб .bin
Все модели LLM на основе PyTorch Генеративная библиотека LiteRT Torch Android, iOS .задача

Чтобы узнать, как конвертировать другие модели, см. раздел «Конвертация моделей» .

Настройка 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

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

import MediaPipeTasksGenai

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "bin")
let loraPath= Bundle.main.path(forResource: "lora_model",
                                      ofType: "bin")
let options = LlmInferenceOptions()
options.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101
options.loraPath = loraPath

let llmInference = try LlmInference(options: options)

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