借助 LLM Inference API,您可以完全在 Google Cloud 上 用于 Web 应用的浏览器,您可以使用它执行各种 例如生成文本、检索自然语言形式的信息、 以及总结文档的功能。任务为多个 文本到文本大语言模型,以便在大语言模型中应用最新的 生成式 AI 模型。
您可以通过 MediaPipe Studio 查看此任务的实际效果。 演示。 如需详细了解功能、模型和配置选项 部分,请参阅概览。
代码示例
LLM Inference API 示例应用提供了 此任务的 JavaScript 内容,供您参考。您可以使用此示例应用 开始构建自己的文本生成应用。
您可以在以下位置访问 LLM Inference API 示例应用: GitHub。
设置
本部分介绍了设置开发环境和 LLM Inference API 专用代码项目。有关 设置开发环境以使用 MediaPipe Tasks,包括 平台版本要求,请参阅适用于 网站。
浏览器兼容性
LLM Inference API 需要与 WebGPU 兼容的网络浏览器。有关 兼容浏览器列表,请参阅 GPU 浏览器 兼容性。
JavaScript 软件包
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>
型号
MediaPipe LLM Inference API 需要一个与 任务。对于 Web 应用,该模型必须与 GPU 兼容。
如需详细了解适用于 LLM Inference API 且经过训练的模型,请参阅 概览模型部分。
下载模型
在初始化 LLM Inference API 之前,请下载一个受支持的模型并 将文件存储在项目目录中:
- Gemma: 属于轻量级、先进的开放式模型系列的一部分, 研发创新型企业所用的研究和技术, Gemini 模型。非常适合各种 包括问题解答、摘要和 推理。下载 Gemma 2B 或 Gemma 7B 模型变体。
- Phi-2:27 亿个参数 Transformer 模型,最适合用于问答、聊天和 格式。
- Falcon-RW-1B:10 亿 基于 3500 亿个词元的纯因果解码器模型。 RefinedWeb。
- StableLM-3B:3 使用 1 万亿个参数预训练的 10 亿个参数纯解码器语言模型 不同英语和代码数据集的词元。
我们建议使用 Kaggle 的 Gemma 2B 或 Gemma 7B 模型 采用与 LLM Inference API 兼容的格式。如果您使用 另一个 LLM,您需要将该模型转换为 兼容 MediaPipe 的格式。有关 Gemma 的更多信息,请参阅 Gemma 网站。如需详细了解 请参阅任务概览的“模型”部分。
将模型转换为 MediaPipe 格式
原生模型转换
如果您使用的是外部 LLM(Phi-2、Falcon 或 StableLM)或非 Kaggle Gemma 版本,请使用我们的转换脚本来设置 与 MediaPipe 兼容。
模型转换过程需要 MediaPipe PyPI 软件包。转化
脚本在 0.10.11
之后的所有 MediaPipe 软件包中都可用。
使用以下命令安装并导入依赖项:
$ 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
支持通过 GPU 进行 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 Flatbuffer 文件,一个用于基础模型 另一个用于 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 |
用于运行模型的处理器(代理)。 | {"cpu", "gpu"} |
output_dir |
托管每层权重文件的输出目录的路径。 | 路径 |
output_tflite_file |
输出文件的路径。例如,“model_cpu.bin”或“model_gpu.bin”。此文件仅与 LLM Inference API 兼容,不能用作常规“tflite”文件。 | 路径 |
vocab_model_file |
用于存储 tokenizer.json 和
tokenizer_config.json 个文件。对于 Gemma,请指向单个 tokenizer.model 文件。 |
路径 |
lora_ckpt |
Safetensors 文件的 LoRA ckpt 的路径,该路径用于存储 LoRA 适配器权重。 | 路径 |
lora_rank |
表示 LoRA ckpt 排名的整数。必需,才能转换 lora 权重。如果未提供,转换器会假定没有 LoRA 权重。注意:只有 GPU 后端支持 LoRA。 | 整数 |
lora_output_tflite_file |
LoRA 权重的输出 tflite 文件名。 | 路径 |
AI Edge 模型转换
如果您正在使用通过 AI Edge 映射到 TFLite 模型的 LLM,请使用我们的 捆绑脚本来创建任务包。捆绑流程会将 映射的模型与其他元数据(例如,分词器参数) 来运行端到端推理。
模型捆绑过程需要 MediaPipe PyPI 软件包。转化
脚本在 0.10.14
之后的所有 MediaPipe 软件包中都可用。
使用以下命令安装并导入依赖项:
$ 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 |
AI Edge 导出的 TFLite 模型的路径。 | 路径 |
tokenizer_model |
SentencePiece 标记生成器模型的路径。 | 路径 |
start_token |
模型专用开始令牌。起始标记必须出现在 提供的标记生成器模型。 | STRING |
stop_tokens |
特定于模型的停止令牌。停止令牌必须出现在 提供的标记生成器模型。 | 列表 [STRING] |
output_filename |
输出任务软件包文件的名称。 | 路径 |
将模型添加到项目目录
将模型存储在项目目录中:
<dev-project-root>/assets/gemma-2b-it-gpu-int4.bin
使用 baseOptions
对象 modelAssetPath
指定模型的路径
参数:
baseOptions: { modelAssetPath: `/assets/gemma-2b-it-gpu-int4.bin`}
创建任务
使用其中一个 LLM Inference API createFrom...()
函数为
运行推理。您可以将 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
});
配置选项
此任务具有以下适用于 Web 和 JavaScript 应用的配置选项:
选项名称 | 说明 | 值范围 | 默认值 |
---|---|---|---|
modelPath |
指向模型存储在项目目录中的路径。 | 路径 | 不适用 |
maxTokens |
模型处理的词元(输入词元 + 输出词元)数量上限。 | 整数 | 512 |
topK |
模型在生成过程的每个步骤中考虑的词元数量。 将预测范围限制为前 k 个概率最高的词元。 | 整数 | 40 |
temperature |
生成期间引入的随机性程度。较高 温度可以使生成的文本更具创造性,而 较低的温度会产生更具可预测性的生成。 | 浮点数 | 0.8 |
randomSeed |
文本生成期间使用的随机种子。 | 整数 | 0 |
loraRanks |
LoRA 模型在运行时要使用的 LoRA 排名。注意:这仅与 GPU 模型兼容。 | 整数数组 | 不适用 |
准备数据
LLM Inference API 接受文本 (string
) 数据。任务处理数据输入
预处理,包括标记化和张量预处理。
所有预处理都在 generateResponse()
函数中进行处理。还有
不需要对输入文本进行额外的预处理。
const inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday.";
运行任务
LLM Inference API 使用 generateResponse()
函数来触发推理。
对于文本分类,这意味着返回文本分类的
输入文本。
以下代码演示了如何使用任务执行处理 模型。
const response = await llmInference.generateResponse(inputPrompt);
document.getElementById('output').textContent = response;
如需流式传输响应,请使用以下命令:
llmInference.generateResponse(
inputPrompt,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});
处理和显示结果
LLM Inference API 返回一个字符串,其中包含生成的响应文本。
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 模型自定义
可配置 Mediapipe LLM 推理 API 以支持低排名自适应 (LoRA) 大型语言模型。利用经过微调的 LoRA 模型,开发者可以 通过经济有效的训练过程来自定义 LLM 的行为。
LLM Inference API 的 LoRA 支持适用于 Gemma-2B 和 Phi-2 模型, GPU 后端,LoRA 权重仅适用于注意力层。这个 初始实现可用作未来开发中的实验性 API 计划在不久的将来推出 更新。
准备 LoRA 模型
按照 HuggingFace 说明,使用你支持的模型类型(Gemma-2B 或 Phi-2)使用自己的数据集训练经过微调的 LoRA 模型。Gemma-2B 和 Phi-2 模型都可以以安全张量格式在 HuggingFace 上获得。由于 LLM Inference API 仅在注意力层上支持 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 上提供了可公开访问且经过微调且适合 LLM Inference API 的 LoRA 模型。例如,monsterapi/gemma-2b-lora-maths-orca-200k 对应 Gemma-2B,lole25/phi-2-sft-ultrachat-lora 对应 Phi-2。
在准备好的数据集上进行训练并保存模型后,您将获得一个 adapter_model.safetensors
文件,其中包含经过微调的 LoRA 模型权重。Safetensors 文件是在模型转换中使用的 LoRA 检查点。
接下来,您需要使用 MediaPipe Python 软件包将模型权重转换为 TensorFlow Lite Flatbuffer。ConversionConfig
应指定基本模型选项以及其他 LoRA 选项。请注意,由于 API 仅支持使用 GPU 进行 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 Flatbuffer 文件,一个用于基础模型 另一个用于 LoRA 模型。
LoRA 模型推断
Web、Android 和 iOS LLM Inference API 已更新,以支持 LoRA 模型推断。Web 支持动态 LoRA,它可以在运行时切换不同的 LoRA 模型。Android 和 iOS 支持静态 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 模型引用以触发 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;
});