API LLM Inference позволяет полностью запускать большие языковые модели (LLM) в браузере для веб-приложений, которые можно использовать для выполнения широкого спектра задач, таких как генерация текста, получение информации в форме естественного языка и обобщение документов. Задача обеспечивает встроенную поддержку нескольких больших языковых моделей преобразования текста в текст, поэтому вы можете применять новейшие генеративные модели искусственного интеллекта на устройстве к своим веб-приложениям.
Задача поддерживает следующие варианты Gemma : Gemma-2 2B, Gemma 2B и Gemma 7B. Gemma — это семейство легких современных открытых моделей, созданных на основе тех же исследований и технологий, которые использовались при создании моделей Gemini . Он также поддерживает следующие внешние модели: Phi-2 , Falcon-RW-1B и StableLM-3B .
Вы можете увидеть эту задачу в действии с помощью демо-версии MediaPipe Studio . Дополнительные сведения о возможностях, моделях и параметрах конфигурации этой задачи см. в разделе Обзор .
Пример кода
Пример приложения для LLM Inference API предоставляет вам базовую реализацию этой задачи на JavaScript. Вы можете использовать этот пример приложения, чтобы начать создавать собственное приложение для генерации текста.
Вы можете получить доступ к примеру приложения LLM Inference API на GitHub .
Настраивать
В этом разделе описаны ключевые шаги по настройке среды разработки и проектов кода специально для использования LLM Inference API. Общие сведения о настройке среды разработки для использования задач MediaPipe, включая требования к версии платформы, см. в руководстве по настройке для Web .
Совместимость с браузером
Для API вывода LLM требуется веб-браузер, совместимый с WebGPU. Полный список совместимых браузеров см. в разделе «Совместимость браузеров с графическим процессором» .
JavaScript-пакеты
Код API LLM Inference доступен через пакет @mediapipe/tasks-genai
. Вы можете найти и загрузить эти библиотеки по ссылкам, приведенным в руководстве по установке платформы.
Установите необходимые пакеты для локального промежуточного хранения:
npm install @mediapipe/tasks-genai
Для развертывания на сервере используйте службу сети доставки контента (CDN), например jsDelivr, чтобы добавить код непосредственно на вашу HTML-страницу:
<head>
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai/genai_bundle.cjs"
crossorigin="anonymous"></script>
</head>
Модель
Для API вывода MediaPipe LLM требуется обученная модель, совместимая с этой задачей. Для веб-приложений модель должна быть совместима с графическим процессором.
Дополнительную информацию о доступных обученных моделях для LLM Inference API см. в разделе «Модели» обзора задач.
Скачать модель
Перед инициализацией 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. Чтобы узнать, как конвертировать другие модели, см. раздел «Преобразование модели» .
Добавить модель в каталог проекта
Сохраните модель в каталоге вашего проекта:
<dev-project-root>/assets/gemma-2b-it-gpu-int4.bin
Укажите путь к модели с помощью параметра modelAssetPath
объекта baseOptions
:
baseOptions: { modelAssetPath: `/assets/gemma-2b-it-gpu-int4.bin`}
Создать задачу
Используйте одну из функций createFrom...()
API LLM Inference API, чтобы подготовить задачу к выполнению логических выводов. Вы можете использовать функцию createFromModelPath()
с относительным или абсолютным путем к файлу обученной модели. В примере кода используется функция createFromOptions()
. Дополнительные сведения о доступных параметрах конфигурации см. в разделе Параметры конфигурации .
Следующий код демонстрирует, как построить и настроить эту задачу:
const genai = await FilesetResolver.forGenAiTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
llmInference = await LlmInference.createFromOptions(genai, {
baseOptions: {
modelAssetPath: '/assets/gemma-2b-it-gpu-int4.bin'
},
maxTokens: 1000,
topK: 40,
temperature: 0.8,
randomSeed: 101
});
Варианты конфигурации
Эта задача имеет следующие параметры конфигурации для веб-приложений и приложений JavaScript:
Название опции | Описание | Диапазон значений | Значение по умолчанию |
---|---|---|---|
modelPath | Путь к хранению модели в каталоге проекта. | ПУТЬ | Н/Д |
maxTokens | Максимальное количество токенов (входные токены + выходные токены), которые обрабатывает модель. | Целое число | 512 |
topK | Количество токенов, которые модель учитывает на каждом этапе генерации. Ограничивает прогнозы первыми k наиболее вероятными токенами. | Целое число | 40 |
temperature | Количество случайности, введенной во время генерации. Более высокая температура приводит к большей креативности в сгенерированном тексте, а более низкая температура обеспечивает более предсказуемую генерацию. | Плавать | 0,8 |
randomSeed | Случайное начальное число, используемое при генерации текста. | Целое число | 0 |
loraRanks | Ранги LoRA будут использоваться моделями LoRA во время выполнения. Примечание. Это совместимо только с моделями графических процессоров. | Целочисленный массив | Н/Д |
Подготовьте данные
LLM Inference API принимает текстовые ( string
) данные. Задача выполняет предварительную обработку входных данных, включая токенизацию и предварительную обработку тензоров.
Вся предварительная обработка выполняется в функции generateResponse()
. Нет необходимости в дополнительной предварительной обработке входного текста.
const inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday.";
Запустить задачу
API-интерфейс LLM Inference использует generateResponse()
для инициирования выводов. Для классификации текста это означает возврат возможных категорий входного текста.
Следующий код демонстрирует, как выполнить обработку с помощью модели задачи.
const response = await llmInference.generateResponse(inputPrompt);
document.getElementById('output').textContent = response;
Для потоковой передачи ответа используйте следующее:
llmInference.generateResponse(
inputPrompt,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});
Обработка и отображение результатов
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.
Интернет поддерживает динамический LoRA во время выполнения. То есть пользователи заявляют, что ранги LoRA будут использоваться во время инициализации, и могут менять разные модели LoRA во время выполнения.const genai = await FilesetResolver.forGenAiTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
const llmInference = await LlmInference.createFromOptions(genai, {
// options for the base model
...
// LoRA ranks to be used by the LoRA models during runtime
loraRanks: [4, 8, 16]
});
Во время выполнения, после инициализации базовой модели, загрузите модели LoRA, которые будут использоваться. Кроме того, запустите модель LoRA, передав ссылку на модель LoRA при создании ответа LLM.
// Load several LoRA models. The returned LoRA model reference is used to specify
// which LoRA model to be used for inference.
loraModelRank4 = await llmInference.loadLoraModel(loraModelRank4Url);
loraModelRank8 = await llmInference.loadLoraModel(loraModelRank8Url);
// Specify LoRA model to be used during inference
llmInference.generateResponse(
inputPrompt,
loraModelRank4,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});