LLM 推論 API 可讓您在 iOS 應用程式中完全透過裝置執行大型語言模型 (LLM),並用於執行各種工作,例如生成文字、以自然語言形式擷取資訊,以及產生文件摘要。這項工作內建支援多種文字轉文字大型語言模型,因此您可以在 iOS 應用程式中套用最新的裝置端生成式 AI 模型。
如要快速將 LLM Inference 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 安裝指南。如需建立 Podfile 並加入應用程式所需 Pod 的操作說明,請參閱「使用 CocoaPods」。
新增依附元件
使用下列程式碼,在 Podfile 中新增 MediaPipeTasksGenai Pod:
target 'MyLlmInferenceApp' do
use_frameworks!
pod 'MediaPipeTasksGenAI'
pod 'MediaPipeTasksGenAIC'
end
如果應用程式包含單元測試目標,請參閱 iOS 設定指南,進一步瞭解如何設定 Podfile。
下載模型
從 Kaggle 模型下載 8 位元量化格式的 Gemma-2 2B。 如要進一步瞭解可用模型,請參閱模型說明文件。
使用 Xcode 將模型新增至專案目錄。如要瞭解如何將檔案新增至 Xcode 專案,請參閱「在 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)")
}
應用程式範例
這個範例應用程式是 iOS 適用的基本文字生成應用程式範例,使用 LLM 推論 API。您可以將這個應用程式做為自己 iOS 應用程式的範本,或在修改現有應用程式時參考。範例程式碼位於 GitHub。
使用下列指令複製 git 存放區:
git clone https://github.com/google-ai-edge/mediapipe-samples
建立範例程式碼的本機版本後,您可以將專案匯入 iOS Studio 並執行應用程式。詳情請參閱 iOS 設定指南。
設定選項
請使用下列設定選項設定 iOS 應用程式:
| 選項名稱 | 說明 | 值範圍 | 預設值 |
|---|---|---|---|
modelPath |
模型在專案目錄中的儲存路徑。 | 路徑 | 不適用 |
maxTokens |
模型可處理的詞元數量上限 (輸入詞元 + 輸出詞元)。 | 整數 | 512 |
topk |
模型在生成過程的每個步驟中會考量的權杖數量。 將預測結果限制為機率最高的 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、網頁 | .bin |
| Phi-2、StableLM、Falcon | MediaPipe 轉換指令碼 | Android、iOS、網頁 | .bin |
| 所有 PyTorch LLM 模型 | LiteRT Torch Generative 程式庫 | Android、iOS 裝置 | .task |
如要瞭解如何轉換其他模型,請參閱「模型轉換」一節。
LoRA 自訂
LLM 推論 API 支援使用 PEFT (參數高效微調) 程式庫進行 LoRA (低秩調整) 微調。LoRA 微調功能會透過經濟實惠的訓練程序,根據新的訓練資料建立一小組可訓練的權重,而非重新訓練整個模型,藉此自訂 LLM 的行為。
LLM Inference API 支援將 LoRA 權重新增至 Gemma-2 2B、Gemma 2B 和 Phi-2 模型的注意力層。下載 safetensors 格式的模型。
基礎模型必須採用 safetensors 格式,才能建立 LoRA 權重。完成 LoRA 訓練後,您可以將模型轉換為 FlatBuffers 格式,以便在 MediaPipe 上執行。
準備 LoRA 權重
使用 PEFT 的 LoRA 方法指南,根據自己的資料集訓練微調的 LoRA 模型。
LLM Inference 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() 方法。