iOS 適用的 LLM 推論指南

,瞭解如何調查及移除這項存取權。

透過 LLM Inference API,您可以在裝置上完全執行大型語言模型 (LLM) 可用來執行多種工作,例如 像是生成文字、以自然語言格式擷取資訊 總結文件內容這項工作內建支援 文字轉文字大型語言模型,方便你在裝置上套用 整合生成式 AI 模型

您可以透過 MediaPipe Studio 查看實際執行這項工作 示範。 進一步瞭解功能、模型和設定選項 請參閱總覽

程式碼範例

MediaPipe Tasks 程式碼範例是 LLM Inference API 的基本實作 App Engine 應用程式您可以使用這款應用程式做為 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 程式庫 開發應用程式這個程式庫同時與 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 應用程式時,請使用下列其中一種變化版本:

如要進一步瞭解其他模型,請參閱工作總覽:Models 專區

建立工作

您可以呼叫其中一個初始化器,建立 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 儲存模型在專案目錄中的模型路徑。 路徑 不適用
maxTokens 模型可處理的符記數量上限 (輸入符記 + 輸出符記)。 整數 512
topk 模型在產生各步驟時考慮的符記數量。 將預測範圍限制在可能性前 K 高的符記。 整數 40
temperature 在產生過程中出現的隨機程度。更高 就能提高生成文字的創造力 較低的隨機性參數會產生較容易預測的生成器 浮點值 0.8
randomSeed 文字產生時使用的隨機種子。 整數 0
loraPath 裝置上 LoRA 模型的絕對路徑。注意:這項功能僅適用於 GPU 型號。 路徑 不適用

準備資料

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 支援 Gemma-2B 和 Phi-2 模型 ,且 LoRA 權重僅適用於注意力層這個 初始實作的用意是供未來開發的實驗性 API 並計劃在未來支援更多模型和各種圖層類型 更新。

準備 LoRA 模型

按照 HuggingFace 的操作說明,在自己的資料集內使用支援的模型類型 Gemma-2B 或 Phi-2 訓練微調的 LoRA 模型。HuggingFace 同時提供 Gemma-2B 和 Phi-2 模型,並採用安全張量格式。由於 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 模型,這些模型與 LLM Inference API 相容。例如,Gemma-2B 的 monsterapi/gemma-2b-lora-maths-orca-200k,而 Phi-2 代表 lole25/phi-2-sft-ultrachat-lora

在準備的資料集訓練及儲存模型後,您會取得一個 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 模型推論。網頁支援動態 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() 方法。