借助 LLM 推理 API,您可以在设备上完全运行大语言模型 (LLM),以用于 Web 应用,从而执行各种任务,例如生成文本、以自然语言形式检索信息和总结文档。该任务内置了对多种文本到文本的大型语言模型的支持,因此您可以将最新的设备端生成式 AI 模型应用于 Web 应用。如果您使用的是最新的 Gemma-3n 模型,则还支持图片和音频输入。
如需快速将 LLM 推理 API 添加到 Web 应用,请参阅快速入门。如需查看运行 LLM 推理 API 的网页应用的基本示例,请参阅示例应用。如需更深入地了解 LLM 推理 API 的工作原理,请参阅配置选项、模型转换和 LoRA 调整部分。
您可以观看 MediaPipe Studio 演示,了解此任务的实际效果。 如需详细了解此任务的功能、模型和配置选项,请参阅概览。
快速入门
按照以下步骤将 LLM Inference API 添加到您的 Web 应用。LLM 推理 API 需要兼容 WebGPU 的网络浏览器。如需查看兼容浏览器的完整列表,请参阅 GPU 浏览器兼容性。
添加依赖项
LLM Inference API 使用 @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>
下载模型
从 HuggingFace 下载 Gemma-3n E4B 或 E2B。名称中带有“-Web”的模型是专门为 Web 用途转换的,因此强烈建议您始终使用其中一种。
如需详细了解可用的模型,请参阅模型文档,或浏览我们的 HuggingFace 社区页面,其中提供了文档中未涵盖的多种其他 Gemma 3 变体,但这些变体已专门针对 Web 进行了转换,例如 2.7 亿、40 亿、120 亿、270 亿和 MedGemma-27B-Text。
将模型存储在项目目录中:
<dev-project-root>/assets/gemma-3n-E4B-it-int4-Web.litertlm
使用 baseOptions
对象 modelAssetPath
参数指定模型路径:
baseOptions: { modelAssetPath: `/assets/gemma-3n-E4B-it-int4-Web.litertlm`}
初始化任务
使用基本配置选项初始化任务:
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-3n-E4B-it-int4-Web.litertlm'
},
maxTokens: 1000,
topK: 40,
temperature: 0.8,
randomSeed: 101
});
运行任务
使用 generateResponse()
函数触发推理。
const response = await llmInference.generateResponse(inputPrompt);
document.getElementById('output').textContent = response;
如需流式传输响应,请使用以下代码:
llmInference.generateResponse(
inputPrompt,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});
多模态提示
对于 Gemma-3n 模型,LLM 推理 API Web API 支持多模态提示。启用多模态后,用户可以在提示中按顺序组合使用图片、音频和文本。然后,LLM 会提供文本回答。
如需开始使用,请使用 MediaPipe 和 Web 兼容格式的 Gemma-3n E4B 或 Gemma-3n E2B。如需了解详情,请参阅 Gemma-3n 文档。
如需启用视觉支持,请确保 maxNumImages
设置为正值。此值决定了 LLM 在单个提示中可以处理的最大图片块数。
如需启用音频支持,请确保 supportAudio
设置为 true
。
llmInference = await LlmInference.createFromOptions(genai, {
baseOptions: {
modelAssetPath: '/assets/gemma-3n-E4B-it-int4-Web.litertlm'
},
maxTokens: 1000,
topK: 40,
temperature: 0.8,
randomSeed: 101,
maxNumImages: 5,
supportAudio: true,
});
现在,您可以像以前一样生成回答,但使用的是有序的字符串、图片和音频数据数组:
const response = await llmInference.generateResponse([
'<ctrl99>user\nDescribe ',
{imageSource: '/assets/test_image.png'},
' and then transcribe ',
{audioSource: '/assets/test_audio.wav'},
'<ctrl100>\n<ctrl99>model\n',
]);
对于视觉模型,支持图片网址和最常见的图片、视频或画布对象。对于音频,仅支持单声道 AudioBuffer 和单声道音频文件网址。如需了解详情,请浏览源代码。
示例应用
该示例应用是一个使用 LLM 推理 API 的基本 Web 文本生成应用示例。您可以将该应用作为自己的 Web 应用的起点,也可以在修改现有应用时参考该应用。示例代码托管在 GitHub 上。
使用以下命令克隆 Git 代码库:
git clone https://github.com/google-ai-edge/mediapipe-samples
如需了解详情,请参阅 Web 版设置指南。
配置选项
使用以下配置选项设置 Web 应用:
选项名称 | 说明 | 值范围 | 默认值 |
---|---|---|---|
modelPath |
模型在项目目录中的存储路径。 | 路径 | 不适用 |
maxTokens |
模型处理的词元数(输入词元数 + 输出词元数)上限。 | 整数 | 512 |
topK |
模型在生成过程的每个步骤中考虑的 token 数量。 将预测限制为概率最高的 k 个词元。 | 整数 | 40 |
temperature |
生成期间引入的随机性程度。温度越高,生成的文本就越具创造性;温度越低,生成的文本就越可预测。 | 浮点数 | 0.8 |
randomSeed |
文本生成期间使用的随机种子。 | 整数 | 0 |
loraRanks |
LoRA 模型在运行时使用的 LoRA 秩。注意:此功能仅与 GPU 模型兼容。 | 整数数组 | 不适用 |
模型转换
LLM 推理 API 与以下类型的模型兼容,其中一些模型需要进行转换。使用此表确定相应型号所需的步骤方法。
模型 | 转换方法 | 兼容的平台 | 文件类型 |
---|---|---|---|
Gemma-3 1B | 无需转换 | Android、Web | .task |
Gemma 2B、Gemma 7B、Gemma-2 2B | 无需转换 | Android、iOS、Web | .bin |
Phi-2、StableLM、Falcon | MediaPipe 转换脚本 | Android、iOS、Web | .bin |
所有 PyTorch LLM 模型 | AI Edge Torch Generative 库 | Android、iOS | .task |
如需了解如何转换其他模型,请参阅模型转换部分。
LoRA 自定义
LLM Inference API 支持使用 PEFT(参数高效微调)库进行 LoRA(低秩自适应)调优。LoRA 调优通过经济高效的训练流程自定义 LLM 的行为,基于新的训练数据创建一小部分可训练的权重,而不是重新训练整个模型。
LLM 推理 API 支持将 LoRA 权重添加到 Gemma-2 2B、Gemma 2B 和 Phi-2 模型的注意力层。下载 safetensors
格式的模型。
为了创建 LoRA 权重,基础模型必须采用 safetensors
格式。LoRA 训练完成后,您可以将模型转换为 FlatBuffers 格式,以便在 MediaPipe 上运行。
准备 LoRA 权重
使用 PEFT 中的 LoRA 方法指南,基于您自己的数据集训练微调后的 LoRA 模型。
LLM 推理 API 仅支持对注意力层应用 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)
转换器将生成两个与 MediaPipe 兼容的文件,一个用于基础模型,另一个用于 LoRA 模型。
LoRA 模型推理
Web 在运行时支持动态 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 模型。在生成 LLM 回答时传递模型引用,以触发 LoRA 模型。
// 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;
});