LLM 推断指南

借助 LLM Inference API,您可以完全在设备上运行大型语言模型 (LLM),以执行各种任务,例如生成文本、以自然语言形式检索信息以及对文档进行总结。该任务内置了对多个文本到文本大语言模型的支持,因此您可以将最新的设备端生成式 AI 模型应用于应用和产品。

试试吧!

该任务支持 Gemma 2B 和 7B,这两个模型系列采用了先进轻量级开放式模型系列,这些模型采用与创建 Gemini 模型相同的研究和技术构建而成。它还支持以下外部模型:Phi-2Falcon-RW-1BStableLM-3B

除了原生支持的模型之外,用户还可以使用 Google 的 AI Edge 产品(包括映射 PyTorch 模型)来映射其他模型。这样,用户就可以将映射的模型导出到多签名 TensorFlow Lite 模型中,这些模型与标记生成器参数捆绑在一起,用于创建任务包。

开始使用

如需开始使用此任务,请按照适用于您的目标平台的其中一个实现指南进行操作。这些平台专用指南将引导您完成此任务的基本实现,并包含使用可用模型的代码示例和推荐的配置选项:

任务详情

本部分介绍此任务的功能、输入、输出和配置选项。

特性

LLM Inference API 包含以下主要功能:

  1. 文本到文本生成 - 根据输入的文本提示生成文本。
  2. LLM 选择 - 应用多个模型,针对您的特定用例定制应用。您还可以重新训练模型并将其应用自定义权重。
  3. LoRA 支持 - 使用 LoRA 模型扩展和自定义 LLM 功能,方法是基于所有数据集进行训练,或者从开源社区获取准备好的预构建 LoRA 模型(仅限原生模型)。
任务输入 任务输出
LLM Inference API 接受以下输入:
  • 文本提示(例如问题、电子邮件主题、要总结的文档)
LLM Inference API 会输出以下结果:
  • 根据输入提示生成文本(例如,问题的回答、电子邮件草稿、文档摘要)

配置选项

此任务具有以下配置选项:

选项名称 说明 值范围 默认值
modelPath 项目目录中存储模型的路径。 PATH N/A
maxTokens 模型处理的词元(输入词元 + 输出词元)的数量上限。 整数 512
topK 模型在生成时的每一步考虑的词元数。将预测限制为前 k 个概率最高的词元。设置 topK 时,您还必须为 randomSeed 设置一个值。 整数 40
temperature 生成期间引入的随机性。较高的温度可以使生成的文本更具创造性,而较低的温度会产生更可预测的生成。设置 temperature 时,您还必须为 randomSeed 设置一个值。 浮点数 0.8
randomSeed 在文本生成过程中使用的随机种子。 整数 0
loraPath 设备本地 LoRA 模型的绝对路径。注意:这仅与 GPU 模型兼容。 PATH N/A
resultListener 设置结果监听器,以异步接收结果。 仅在使用异步生成方法时适用。 N/A N/A
errorListener 设置可选的错误监听器。 N/A N/A

模型

LLM Inference API 内置了对可拆分的文本到文本大语言模型的支持,这些模型针对浏览器和移动设备进行了优化。您可以下载这些轻量级模型,以便完全在设备上运行推断。

在初始化 LLM Inference API 之前,请下载一个受支持的模型,并将该文件存储在项目目录中。

Gemma 2B

Gemma 2B 是轻量级、先进的开放模型系列的一部分,这些模型采用与创建 Gemini 模型相同的研究和技术构建而成。该模型包含 2B 参数和开放权重。该模型非常适合各种文本生成任务,包括问题解答、摘要和推理。

下载 Gemma 2B

Gemma 2B 型号有以下四种款式:

您还可以在将模型添加到应用之前调整模型并添加新的权重。如需详细了解如何调整和自定义 Gemma,请参阅调整 Gemma。从 Kaggle 模型下载 Gemma 后,该模型已经具有可与 MediaPipe 搭配使用的适当格式。

如果您下载 Gemma 2B from Hugging Face,必须将模型转换为适用于 MediaPipe 的格式。LLM Inference API 需要下载并转换以下文件:

  • model-00001-of-00002.safetensors
  • model-00002-of-00002.safetensors
  • tokenizer.json
  • tokenizer_config.json

Gemma 7B

Gemma 7B 是一个更大的 Gemma 模型,具有 7B 参数和开放权重。该模型的功能更强大,适用于各种文本生成任务,包括问答、摘要和推理。Gemma 7B 仅适用于网站。

下载 Gemma 7B

Gemma 7B 型号有一个变体:

如果您下载 Gemma 7B from Hugging Face,则必须将模型转换为适用于 MediaPipe 的格式。LLM Inference API 要求下载并转换以下文件:

  • model-00001-of-00004.safetensors
  • model-00002-of-00004.safetensors
  • model-00003-of-00004.safetensors
  • model-00004-of-00004.safetensors
  • tokenizer.json
  • tokenizer_config.json

猎鹰 1B 号飞船

Falcon-1B 是一个仅使用 10 亿参数的因果解码器模型,该模型基于 350B 的 RefinedWeb 令牌进行训练。

下载 Falcon 1B

LLM Inference API 要求将以下文件下载并存储在本地:

  • tokenizer.json
  • tokenizer_config.json
  • pytorch_model.bin

下载 Falcon 模型文件后,就可以将该模型转换为 MediaPipe 格式了。按照将模型转换为 MediaPipe 格式中的步骤操作。

稳定版 LM3B

StableLM-3B 是一个包含 30 亿个参数解码器的语言模型,该模型基于 1 万亿个不同英语和代码数据集的 1 万亿个令牌进行了 4 个周期的预训练。

下载 StableLM 3B

LLM Inference API 要求将以下文件下载并存储在本地:

  • tokenizer.json
  • tokenizer_config.json
  • model.safetensors

下载 StableLM 模型文件后,模型就可以转换为 MediaPipe 格式了。按照将模型转换为 MediaPipe 格式中的步骤操作。

Phi-2

Phi-2 是一个拥有 27 亿个参数的 Transformer 模型。该模型是使用各种 NLP 合成文本和过滤的网站进行训练的。该模型最适合采用问答、聊天和代码格式的提示。

下载 Phi-2

LLM Inference API 要求将以下文件下载并存储在本地:

  • tokenizer.json
  • tokenizer_config.json
  • model-00001-of-00002.safetensors
  • model-00002-of-00002.safetensors

下载 Phi-2 模型文件后,该模型就可以转换为 MediaPipe 格式了。按照将模型转换为 MediaPipe 格式中的步骤操作。

AI Edge 导出的模型

AI Edge 是 Google 推出的一项产品,可让您将用户映射的模型转换为多签名 TensorFlow Lite 模型。如需详细了解如何映射和导出模型,请访问 AI Edge Torch 的 GitHub 页面

将模型导出为 TFLite 格式后,就可以将其转换为 MediaPipe 格式了。如需了解详情,请参阅将模型转换为 MediaPipe 格式

将模型转换为 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 平面缓冲区文件,一个用于基本模型,另一个用于 LoRA 模型。

参数 说明 可接受的值
input_ckpt 指向 model.safetensorspytorch.bin 文件的路径。请注意,有时模型安全张量格式会被分片为多个文件,例如 model-00001-of-00003.safetensorsmodel-00001-of-00003.safetensors。您可以指定文件格式,例如 model*.safetensors PATH
ckpt_format 模型文件格式。 {"safetensors", "pytorch"}
model_type 正在转换的 LLM。 {"PHI_2", "FALCON_RW_1B", "STABLELM_4E1T_3B", "GEMMA_2B"}
backend 用于运行模型的处理器(代理)。 {"cpu", "gpu"}
output_dir 托管每层权重文件的输出目录的路径。 PATH
output_tflite_file 输出文件的路径。例如,“model_cpu.bin”或“model_gpu.bin”。此文件仅与 LLM Inference API 兼容,无法用作常规“tflite”文件。 PATH
vocab_model_file 存储 tokenizer.jsontokenizer_config.json 文件的目录的路径。对于 Gemma,请指向单个 tokenizer.model 文件。 PATH
lora_ckpt 安全张量文件的 LoRA ckpt 路径,用于存储 LoRA 适配器权重。 PATH
lora_rank 一个整数,表示 LoRA ckpt 的排名。必需,以便转换 lora 权重。如果未提供,则转换器会假定没有 LoRA 权重。注意:只有 GPU 后端支持 LoRA。 整数
lora_output_tflite_file 输出 LoRA 权重的 tflite 文件名。 PATH

AI Edge 模型转换

如果您正在使用通过 AI Edge 映射到 TFLite 模型的 LLM,请使用我们的捆绑脚本创建任务包。捆绑流程会使用额外的元数据(例如Tokenizer 参数)。

模型捆绑过程需要使用 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 模型的路径。 PATH
tokenizer_model 到 SentencePiece 分词器模型的路径。 PATH
start_token 模型专用的开始令牌。起始标记必须存在于提供的分词器模型中。 字符串
stop_tokens 模型专用的停止令牌。停止标记必须存在于提供的分词器模型中。 列表 [字符串]
output_filename 输出任务包文件的名称。 PATH

LoRA 自定义

Mediapipe LLM 推理 API 可以配置为支持针对大型语言模型的低秩自适应 (LoRA)。利用经微调的 LoRA 模型,开发者可以通过经济高效的训练过程来自定义 LLM 的行为。

LLM Inference API 的 LoRA 支持适用于 GPU 后端的 Gemma-2B 和 Phi-2 模型,LoRA 权重仅适用于注意力层。这一初始实现可用作未来开发的实验性 API,并计划在未来的更新中支持更多模型和各种类型的层。

准备 LoRA 模型

按照 HuggingFace 说明,使用受支持的模型类型(Gemma-2B 或 Phi-2)在您自己的数据集上训练微调后的 LoRA 模型。HuggingFace 上均以安全张量格式提供 Gemma-2B 和 Phi-2 模型。由于 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 模型。例如,对于 Gemma-2B,使用 monsterapi/gemma-2b-lora-maths-orca-200k,对于 Phi-2,使用 lole25/phi-2-sft-ultrachat-lora

使用准备好的数据集进行训练并保存模型后,您会获得一个 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 平面缓冲区文件,一个用于基本模型,另一个用于 LoRA 模型。

LoRA 模型推断

Web、Android 和 iOS LLM Inference API 已更新,以支持 LoRA 模型推断。Web 支持动态 LoRA,其可以在运行时切换不同的 LoRA 模型。Android 和 iOS 支持静态 LoRA,它会在任务的生命周期内使用相同的 LoRA 权重。

Android 在初始化期间支持静态 LoRA。如需加载 LoRA 模型,用户需指定 LoRA 模型路径以及基本 LLM。

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPath('<path to base model>')
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .setLoraPath('<path to LoRA model>')
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)

如需使用 LoRA 运行 LLM 推断,请使用与基本模型相同的 generateResponse()generateResponseAsync() 方法。