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

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

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

В дополнение к поддерживаемым моделям пользователи могут использовать Google AI Edge Torch для экспорта моделей PyTorch в модели LiteRT ( tflite ) с мультиподписью, которые связаны с параметрами токенизатора для создания пакетов задач, совместимых с API вывода LLM.

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

Пример кода

Пример кода задач MediaPipe — это базовая реализация приложения LLM Inference API для iOS. Вы можете использовать это приложение в качестве отправной точки для своего собственного приложения для iOS или обращаться к нему при изменении существующего приложения. Пример кода LLM Inference API размещен на 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/ios/
    

После создания локальной версии примера кода вы можете установить библиотеку задач MediaPipe, открыть проект с помощью Xcode и запустить приложение. Инструкции см. в Руководстве по установке для iOS .

Настраивать

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

Зависимости

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

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

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

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

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

Модель

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

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

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

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

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

В дополнение к поддерживаемым моделям вы можете использовать Google AI Edge Torch для экспорта моделей PyTorch в модели LiteRT ( tflite ) с мультиподписью. Дополнительную информацию см. в разделе Генеративный преобразователь Torch для моделей PyTorch .

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

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

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

Модели Метод преобразования Совместимые платформы Тип файла
Поддерживаемые модели Джемма 2Б, Джемма 7Б, Джемма-2 2Б, Фи-2, СтабилЛМ, Сокол МедиаПайп Android, iOS, веб .bin
Другие модели PyTorch Все модели PyTorch LLM Генеративная библиотека AI Edge Torch Андроид, iOS .задача

Мы размещаем преобразованные файлы .bin для Gemma 2B, Gemma 7B и Gemma-2 2B на Kaggle. Эти модели можно развертывать напрямую с помощью нашего API вывода LLM. Чтобы узнать, как конвертировать другие модели, см. раздел «Преобразование модели» .

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

Вы можете создать задачу LLM Inference API, вызвав один из ее инициализаторов. Инициализатор LlmInference(options:) устанавливает значения для параметров конфигурации.

Если вам не нужен API вывода LLM, инициализированный с настраиваемыми параметрами конфигурации, вы можете использовать инициализатор LlmInference(modelPath:) для создания API вывода LLM с параметрами по умолчанию. Дополнительные сведения о параметрах конфигурации см. в разделе Обзор конфигурации .

Следующий код демонстрирует, как создать и настроить эту задачу.

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)

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

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

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

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

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

Вся предварительная обработка выполняется в generateResponse(inputText:) . Предварительная дополнительная обработка входного текста не требуется.

let inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."

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

Чтобы запустить API вывода LLM, используйте generateResponse(inputText:) . API вывода LLM возвращает возможные категории входного текста.

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)")
}

Обработка и отображение результатов

API вывода LLM возвращает сгенерированный текст ответа.

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 Inference работает для всех вариантов Gemma и моделей Phi-2 для серверной части графического процессора, при этом веса LoRA применимы только к уровням внимания. Эта первоначальная реализация служит экспериментальным API для будущих разработок, и в будущих обновлениях планируется поддерживать больше моделей и различных типов слоев.

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

Следуйте инструкциям на HuggingFace , чтобы обучить точно настроенную модель LoRA на вашем собственном наборе данных с поддерживаемыми типами моделей, Gemma или Phi-2. Модели Gemma-2 2B , Gemma 2B и Phi-2 доступны на HuggingFace в формате защитных тензоров. Поскольку API LLM Inference поддерживает 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"],
)

Для тестирования на 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.

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 generateResponse() generateResponseAsync() что и в базовой модели.