iOS 適用的 LLM 推論指南

LLM Inference API 可讓您在 iOS 應用程式上完全執行大型語言模型 (LLM),用於執行多種工作,例如產生文字、以自然語言形式擷取資訊,以及摘要文件。這項工作會為多種文字轉文字大型語言模型提供內建支援,讓您將最新的裝置端生成式 AI 模型套用至 iOS 應用程式。

如要快速將 LLM Inference API 新增至 iOS 應用程式,請按照快速入門操作。如需 iOS 應用程式執行 LLM Inference API 的基本範例,請參閱範例應用程式。如要進一步瞭解 LLM Inference API 的運作方式,請參閱「設定選項」、「模型轉換」和「LoRA 調整」一節。

您可以透過 MediaPipe Studio 示範,瞭解如何執行此工作。如要進一步瞭解這項工作的功能、模型和設定選項,請參閱總覽

快速入門導覽課程

請按照下列步驟,將 LLM 推論 API 新增至 iOS 應用程式。LLM Inference API 會使用 MediaPipeTasksGenai 程式庫,必須使用 CocoaPods 安裝。這個程式庫與 Swift 和 Objective-C 應用程式相容,且不需要任何額外的語言專屬設定。

如需在 macOS 上安裝 CocoaPods 的操作說明,請參閱 CocoaPods 安裝指南。如需有關如何為應用程式建立包含必要 Pod 的 Podfile 的操作說明,請參閱「使用 CocoaPods」。

新增依附元件

使用下列程式碼,在 Podfile 中新增 MediaPipeTasksGenai 容器:

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 模型 AI Edge Torch 生成式程式庫 Android、iOS 裝置 .task

如要瞭解如何轉換其他模型,請參閱「模型轉換」一節。

LoRA 自訂

LLM 推論 API 支援使用 PEFT (參數高效率微調) 程式庫進行 LoRA (低秩調整) 調整。LoRA 調整功能會透過經濟實惠的訓練程序,自訂 LLM 的行為,並根據新的訓練資料建立一小組可訓練的權重,而非重新訓練整個模型。

LLM 推論 API 可在 Gemma-2 2BGemma 2BPhi-2 模型的注意力層中新增 LoRA 權重。以 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() 方法。