适用于 Web 的 LLM 推理指南

<ph type="x-smartling-placeholder">

借助 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.safetensorspytorch.bin 文件的路径。请注意,模型安全张量格式有时会拆分为多个文件,例如model-00001-of-00003.safetensorsmodel-00001-of-00003.safetensors。您可以指定文件格式,例如 model*.safetensors 路径
ckpt_format 模型文件格式。 {"safetensors", "pytorch"}
model_type 要转换的 LLM。 {&quot;PHI_2&quot;, &quot;FALCON_RW_1B&quot;, &quot;STABLELM_4E1T_3B&quot;, &quot;GEMMA_2B&quot;}
backend 用于运行模型的处理器(代理)。 {&quot;cpu&quot;, &quot;gpu&quot;}
output_dir 托管每层权重文件的输出目录的路径。 路径
output_tflite_file 输出文件的路径。例如,“model_cpu.bin”或“model_gpu.bin”。此文件仅与 LLM Inference API 兼容,不能用作常规“tflite”文件。 路径
vocab_model_file 用于存储 tokenizer.jsontokenizer_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;
});