适用于 iOS 的 LLM 推断指南

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

借助 LLM Inference API,您可以完全在设备端运行大型语言模型 (LLM) 用于执行各种任务,例如 例如生成文本、检索自然语言形式的信息,以及 汇总文档。任务为多个 文本到文本大语言模型,以便在大语言模型中应用最新的 生成式 AI 模型。

您可以通过 MediaPipe Studio 查看此任务的实际效果。 演示。 如需详细了解功能、模型和配置选项 部分,请参阅概览

代码示例

MediaPipe Tasks 示例代码是 LLM 推断 API 的基本实现 。您可以以此为基础来创建自己的 iOS 应用,或者 在修改现有应用时引用它。LLM Inference API 示例代码为 托管于 GitHub

下载代码

以下说明介绍了如何创建示例的本地副本 使用 git 命令行工具运行 git 代码库。

如需下载示例代码,请执行以下操作:

  1. 使用以下命令克隆 git 代码库:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. (可选)配置您的 git 实例以使用稀疏检出,这样您 只有 LLM Inference API 示例应用的文件:

    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/llm_inference/ios/
    

创建示例代码的本地版本后,您可以安装 MediaPipe 任务库,使用 Xcode 打开项目并运行应用。对于 请参阅 iOS 设置指南

设置

本部分介绍了设置开发环境和 以便使用 LLM Inference API。有关如何设置 用于使用 MediaPipe 任务(包括平台版本)的开发环境 要求,请参阅 iOS 设置指南

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

依赖项

LLM Inference API 使用 MediaPipeTasksGenai 库,您必须安装该库 使用 CocoaPods 构建容器。该库与 Swift 和 Objective-C 应用兼容 并且不需要任何额外的语言相关设置。

如需了解如何在 macOS 上安装 CocoaPods,请参阅 CocoaPods 安装指南。 如需了解如何创建包含必要 Pod 的 Podfile,请参阅 请参阅使用 CocoaPods

使用以下代码在 Podfile 中添加 MediaPipeTasksGenai pod:

target 'MyLlmInferenceApp' do
  use_frameworks!
  pod 'MediaPipeTasksGenAI'
  pod 'MediaPipeTasksGenAIC'
end

如果您的应用包含单元测试目标,请参阅应用的设置指南 iOS 设备,详细了解如何设置 您的Podfile

型号

MediaPipe LLM Inference API 任务需要一个与 此任务。想要详细了解 LLM Inference API,请参阅任务概览的“模型”部分

下载模型

下载模型并使用 Xcode 将其添加到您的项目目录。对于 有关如何向 Xcode 项目添加文件的说明,请参阅管理文件 和文件夹 项目

<ph type="x-smartling-placeholder"></ph> 下载 Gemma 2B

构建 iOS 应用时,请使用以下变体之一:

如需详细了解其他模型,请参阅任务概览模型 部分

创建任务

您可以通过调用 LLM Inference API 任务之一来创建该任务。通过 LlmInference(options:) 初始化程序用于为配置选项设置值。

如果您不需要使用自定义配置初始化的 LLM Inference API 可以使用 LlmInference(modelPath:) 初始化程序创建 使用默认选项的 LLM Inference API。如需详细了解配置 选项,请参阅配置概览

以下代码演示了如何构建和配置此任务。

import MediaPipeTasksGenai

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "bin")

let options = LlmInferenceOptions()
options.baseOptions.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101

let LlmInference = try LlmInference(options: options)

配置选项

此任务具有以下适用于 iOS 应用的配置选项:

选项名称 说明 值范围 默认值
modelPath 指向模型存储在项目目录中的路径。 路径 不适用
maxTokens 模型处理的词元(输入词元 + 输出词元)数量上限。 整数 512
topk 模型在生成过程的每个步骤中考虑的词元数量。 将预测范围限制为前 k 个概率最高的词元。 整数 40
temperature 生成期间引入的随机性程度。较高 温度可以使生成的文本更具创造性,而 较低的温度会产生更具可预测性的生成。 浮点数 0.8
randomSeed 文本生成期间使用的随机种子。 整数 0
loraPath 设备本地本地 LoRA 模型的绝对路径。注意:这仅与 GPU 模型兼容。 路径 不适用

准备数据

LLM Inference API 处理文本数据。任务处理数据输入 预处理,包括标记化和张量预处理。

所有预处理都在 generateResponse(inputText:) 函数中进行处理。 无需预先对输入文本进行额外的预处理。

let inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."

运行任务

如需运行 LLM Inference API,请使用 generateResponse(inputText:) 方法。通过 LLM Inference API 返回输入文本的可能类别。

let result = try LlmInference.generateResponse(inputText: inputPrompt)

如需流式传输响应,请使用 generateResponseAsync(inputText:) 方法。

let resultStream =  LlmInference.generateResponseAsync(inputText: inputPrompt)

do {
  for try await partialResult in resultStream {
    print("\(partialResult)")
  }
  print("Done")
}
catch {
  print("Response error: '\(error)")
}

处理和显示结果

LLM Inference API 会返回一个 LlmInferenceResult,其中包含生成的 响应文本。

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 权重。

在初始化期间,iOS 支持静态 LoRA。为了加载 LoRA 模型,用户需要指定 LoRA 模型路径以及基础 LLM。

import MediaPipeTasksGenai

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "bin")
let loraPath= Bundle.main.path(forResource: "lora_model",
                                      ofType: "bin")
let options = LlmInferenceOptions()
options.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101
options.loraPath = loraPath

let LlmInference = try LlmInference(options: options)

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