iOS 適用的 LLM 推論指南

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

此工作可支援以下 Gemma 變體:Gemma-2 2B、Gemma 2B 和 Gemma 7B。Gemma 是一系列先進的輕量級開放式模型,採用與建立 Gemini 模型時相同的研究成果和技術。它也支援以下外部模型:Phi-2Falcon-RW-1BStableLM-3B

除了支援的模型之外,使用者還可以使用 Google 的 AI Edge Torch,將 PyTorch 模型匯出至多簽名 LiteRT (tflite) 模型,並與符記產生器參數一起套用,以便建立與 LLM 推論 API 相容的工作組合。

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

程式碼範例

MediaPipe Tasks 程式碼範例是 iOS 版 LLM 推論 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 容器:

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

如果您的應用程式包含單元測試目標,請參閱「iOS 設定指南」,進一步瞭解如何設定 Podfile

型號

MediaPipe LLM 推論 API 工作需要訓練的模型,且必須與此工作相容。如要進一步瞭解 LLM Inference API 適用的訓練模型,請參閱任務總覽的「模型」一節。

下載模型

下載模型,然後使用 Xcode 將其新增至專案目錄。如需在 Xcode 專案中新增檔案的操作說明,請參閱「管理 Xcode 專案中的檔案和資料夾」。

在初始化 LLM Inference API 之前,請下載其中一個支援的模型,並將檔案儲存在專案目錄中:

  • Gemma-2 2B:最新版的 Gemma 系列模型。這是一系列先進的輕量級開放式模型,採用與建立 Gemini 模型時相同的研究成果和技術。
  • Gemma 2B:這是一系列先進的輕量級開放式模型,採用與建立 Gemini 模型時相同的研究成果和技術打造而成。非常適合各種文字生成工作,包括回答問題、摘要和推理。
  • Phi-2:參數為 27 億的 Transformer 模型,最適合問答、即時通訊和程式碼格式。
  • Falcon-RW-1B:以 RefinedWeb 的 3500 億個符記訓練的 10 億參數因果解碼器專用模型。
  • StableLM-3B:30 億個參數的解碼器專用語言模型,已預先訓練 1 兆個符記的多樣英文和程式碼資料集。

除了支援的模型之外,您還可以使用 Google 的 AI Edge Torch,將 PyTorch 模型匯出至多簽名 LiteRT (tflite) 模型。詳情請參閱「Torch 產生轉換器 (適用於 PyTorch 模型)」。

建議您使用 Gemma-2 2B,這個模型可在 Kaggle 模型中找到。如要進一步瞭解其他可用模型,請參閱任務總覽的「模型」一節。

將模型轉換為 MediaPipe 格式

LLM 推論 API 支援兩種類型的模型,其中部分模型需要轉換。請使用下表找出模型的必要步驟方法。

模型 轉換方法 相容的平台 檔案類型
支援的型號 Gemma 2B、Gemma 7B、Gemma-2 2B、Phi-2、StableLM、Falcon MediaPipe Android、iOS、網頁 .bin
其他 PyTorch 模型 所有 PyTorch 大型語言模型 AI Edge Torch 生成式程式庫 Android、iOS 裝置 .task

我們在 Kaggle 上託管 Gemma 2B、Gemma 7B 和 Gemma-2 2B 的轉換後 .bin 檔案。您可以使用 LLM 推論 API 直接部署這些模型。如要瞭解如何轉換其他模型,請參閱「模型轉換」一節。

建立工作

您可以呼叫其中一個初始化器,建立 LLM Inference API 工作。LlmInference(options:) 初始化器會設定設定選項的值。

如果您不需要使用自訂設定選項初始化的 LLM 推論 API,可以使用 LlmInference(modelPath:) 初始化工具,以預設選項建立 LLM 推論 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 推論 API 可處理文字資料。這個工作會處理資料輸入的預先處理作業,包括斷詞和張量預先處理。

所有預先處理作業都會在 generateResponse(inputText:) 函式中處理。您不需要事先對輸入文字進行額外預處理。

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

執行工作

如要執行 LLM 推論 API,請使用 generateResponse(inputText:) 方法。LLM 推論 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)")
}

處理及顯示結果

大型語言模型推論 API 會傳回產生的回應文字。

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 推論 API 的 LoRA 支援功能適用於 GPU 後端的所有 Gemma 變化版本和 Phi-2 模型,且 LoRA 權重僅適用於注意力層。這個初始實作是實驗性 API,可用於日後的開發作業,我們預計在即將推出的更新中支援更多模型和各種圖層。

準備 LoRA 模型

請按照HuggingFace 上的操作說明,使用支援的模型類型 (Gemma 或 Phi-2) 訓練自己的資料集,以便精調 LoRA 模型。Gemma-2 2BGemma 2BPhi-2 模型皆可在 HuggingFace 上使用,格式為安全張量。由於 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"],
)

為了進行測試,我們在 HuggingFace 上提供公開可用的微調 LoRA 模型,這些模型符合 LLM 推論 API 的規範。例如,Gemma-2B 的 monsterapi/gemma-2b-lora-maths-orca-200k 和 Phi-2 的 lole25/phi-2-sft-ultrachat-lora

在準備資料集並儲存模型後,您會取得包含精細調整 LoRA 模型權重的 adapter_model.safetensors 檔案。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 推論 API 已更新,以支援 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() 方法。