LLM Inference API 可讓您在 iOS 應用程式中完全在裝置上執行大型語言模型 (LLM),用於執行各種工作,例如產生文字、以自然語言形式擷取資訊,以及摘要文件。此工作會為多種文字轉文字大型語言模型提供內建支援,讓您將最新的裝置端生成式 AI 模型套用至 iOS 應用程式。
此工作可支援以下 Gemma 變體:Gemma-2 2B、Gemma 2B 和 Gemma 7B。Gemma 是一系列先進的輕量級開放式模型,採用與建立 Gemini 模型時相同的研究成果和技術。它也支援以下外部模型:Phi-2、Falcon-RW-1B 和 StableLM-3B。
除了支援的模型之外,使用者還可以使用 Google 的 AI Edge Torch,將 PyTorch 模型匯出至多簽名 LiteRT (tflite
) 模型,並與符記產生器參數一起套用,以便建立與 LLM 推論 API 相容的工作組合。
您可以透過 MediaPipe Studio 示範,瞭解如何執行此工作。如要進一步瞭解這項工作的功能、模型和設定選項,請參閱總覽。
程式碼範例
MediaPipe Tasks 程式碼範例是 iOS 版 LLM 推論 API 應用程式的基本實作。您可以將該應用程式做為自有 iOS 應用程式的起點,或是在修改現有應用程式時參考該應用程式。LLM Inference API 範例程式碼已託管於 GitHub。
下載程式碼
以下操作說明說明如何使用 git 指令列工具,建立範例程式碼的本機副本。
下載程式碼範例:
使用下列指令複製 Git 存放區:
git clone https://github.com/google-ai-edge/mediapipe-samples
您可以選擇將 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 2B、Gemma 2B 和 Phi-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()
方法。