借助 LLM Inference API,您可以在 iOS 应用中完全在设备上运行大语言模型 (LLM),从而执行各种任务,例如生成文本、以自然语言形式检索信息和总结文档。该任务内置了对多种文本到文本大语言模型的支持,因此您可以将最新的设备端生成式 AI 模型应用于 iOS 应用。
如需快速将 LLM 推理 API 添加到 iOS 应用,请按照快速入门操作。如需查看运行 LLM 推理 API 的 iOS 应用的基本示例,请参阅示例应用。如需更深入地了解 LLM 推理 API 的运作方式,请参阅配置选项、模型转换和 LoRA 调整部分。
您可以观看 MediaPipe Studio 演示,了解此任务的实际效果。 如需详细了解此任务的功能、模型和配置选项,请参阅概览。
快速入门
请按以下步骤将 LLM Inference API 添加到您的 iOS 应用。
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。
下载模型
从 Kaggle Models 下载采用 8 位量化格式的 Gemma-2 2B。 如需详细了解可用的模型,请参阅模型文档。
使用 Xcode 将模型添加到项目目录中。如需了解如何向 Xcode 项目添加文件,请参阅 Managing files and folders in your Xcode project(管理 Xcode 项目中的文件和文件夹)。
初始化任务
使用基本配置选项初始化任务:
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)
运行任务
使用 generateResponse(inputText:) 方法生成文本回答。这会生成单个生成的回答。
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 推理 API 的基本 iOS 文本生成应用示例。您可以将该应用作为自己的 iOS 应用的起点,也可以在修改现有应用时参考该应用。示例代码托管在 GitHub 上。
使用以下命令克隆 Git 代码库:
git clone https://github.com/google-ai-edge/mediapipe-samples
创建示例代码的本地版本后,您可以将项目导入 iOS Studio 并运行应用。如需了解详情,请参阅 iOS 设置指南。
配置选项
使用以下配置选项设置 iOS 应用:
| 选项名称 | 说明 | 值范围 | 默认值 |
|---|---|---|---|
modelPath |
模型在项目目录中的存储路径。 | 路径 | 不适用 |
maxTokens |
模型可处理的 token 数(输入 token 数 + 输出 token 数)上限。 | 整数 | 512 |
topk |
模型在生成过程的每一步中考虑的 token 数量。 将预测限制为概率最高的 k 个词元。 | 整数 | 40 |
temperature |
生成期间引入的随机性程度。温度越高,生成的文本就越具创造性;温度越低,生成的文本就越可预测。 | 浮点数 | 0.8 |
randomSeed |
文本生成期间使用的随机种子。 | 整数 | 0 |
loraPath |
设备上 LoRA 模型的本地绝对路径。注意:此功能仅与 GPU 模型兼容。 | 路径 | 不适用 |
模型转换
LLM 推理 API 与以下类型的模型兼容,其中一些模型需要进行转换。使用该表确定相应型号所需的步骤方法。
| 模型 | 转换方法 | 兼容的平台 | 文件类型 |
|---|---|---|---|
| Gemma-3 1B | 无需转换 | Android、网页 | .task |
| Gemma 2B、Gemma 7B、Gemma-2 2B | 无需转换 | Android、iOS、Web | .bin |
| Phi-2、StableLM、Falcon | MediaPipe 转换脚本 | Android、iOS、Web | .bin |
| 所有 PyTorch LLM 模型 | LiteRT Torch Generative 库 | Android、iOS | .task |
如需了解如何转换其他模型,请参阅模型转换部分。
LoRA 自定义
LLM 推理 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)
转换器将生成两个 Flatbuffer 文件,一个用于基础模型,另一个用于 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() 方法。