iOS 適用的 LLM 推論指南

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

您可以使用 MediaPipe Studio 示範查看這項工作的運作情形。如要進一步瞭解這項工作的功能、模型和設定選項,請參閱總覽

程式碼範例

MediaPipe Tasks 範例程式碼是 iOS 適用 LLM Inference API 應用程式的基本實作。您可以將該應用程式做為自己的 iOS 應用程式起點,或在修改現有應用程式時參照該應用程式。LLM Inference API 範例程式碼由 GitHub 代管。

下載程式碼

以下操作說明說明如何使用 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 設定指南」。

依附元件

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 專案的操作說明,請參閱管理 Xcode 專案中的檔案和資料夾

下載 Gemma 2B

建構 iOS 應用程式時,請使用下列其中一種變化版本:

  • gemma-2b-it-cpu-int4:具備 CPU 相容性的 Gemma 4 位元模型。
  • gemma-2b-it-gpu-int4:具備 GPU 相容性的 Gemma 4 位元模型。
  • 符合 iOS 記憶體需求的 AI Edge Torch 對應模型。

如要進一步瞭解其他模型,請參閱工作總覽「模型」一節

建立工作

如要建立 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 專案目錄中儲存模型的路徑。 PATH 不適用
maxTokens 模型處理的符記數量上限 (輸入符記 + 輸出符記)。 整數 512
topk 模型在產生每個步驟時考量的符記數量。將預測範圍限制在機率最高的前 K 個符記。設定 topk 時,您也必須設定 randomSeed 的值。 整數 40
temperature 在產生過程中引入的隨機量。隨機性參數越高,生成文字就能發揮更多創意,而低溫則能產生更準確的生成結果。設定 temperature 時,您也必須設定 randomSeed 的值。 浮點值 0.8
randomSeed 用來產生文字的隨機種子值。 整數 0
loraPath 在裝置上本機的 LoRA 模型絕對路徑。注意:這項功能僅與 GPU 型號相容。 PATH 不適用

準備資料

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 支援適用於 GPU 後端的 Gemma-2B 和 Phi-2 模型,而 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 上可供公開存取且經過微調的 LoRA 模型。例如 monsterapi/gemma-2b-lora-maths-orca-200k 代表 Gemma-2B,以及 lole25/phi-2-sft-ultrachat-lora 代表「Phi-2」。

使用準備好的資料集進行訓練並儲存模型後,您就會取得 adapter_model.safetensors 檔案,其中包含經過微調的 LoRA 模型權重。安全張量檔案是模型轉換中使用的 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() 方法。