Android 適用的 LLM 推論指南

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

此工作可支援以下 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 示範,瞭解如何執行此工作。如要進一步瞭解這項工作的功能、模型和設定選項,請參閱總覽

程式碼範例

本指南將以 Android 版基本文字產生應用程式為例。您可以將此應用程式做為自有 Android 應用程式的起點,或是在修改現有應用程式時參考。範例程式碼已託管於 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/android
    

建立本機版本的範例程式碼後,您可以將專案匯入 Android Studio 並執行應用程式。如需操作說明,請參閱 Android 設定指南

設定

本節將說明設定開發環境和程式碼專案的關鍵步驟,以便使用 LLM Inference API。如要進一步瞭解如何設定開發環境以使用 MediaPipe 工作,包括平台版本需求,請參閱 Android 設定指南

依附元件

LLM 推論 API 會使用 com.google.mediapipe:tasks-genai 程式庫。請將這個依附元件新增至 Android 應用程式的 build.gradle 檔案:

dependencies {
    implementation 'com.google.mediapipe:tasks-genai:0.10.14'
}

如果是搭載 Android 12 (API 31) 以上版本的裝置,請新增原生 OpenCL 程式庫依附元件。詳情請參閱 uses-native-library 標記的說明文件。

將下列 uses-native-library 標記新增至 AndroidManifest.xml 檔案:

<uses-native-library android:name="libOpenCL.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-car.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-pixel.so" android:required="false"/>

型號

MediaPipe LLM 推論 API 需要經過訓練的文字轉文字語言模型,且必須與此工作相容。下載模型後,請安裝必要的依附元件,並將模型推送至 Android 裝置。如果您使用的是 Gemma 以外的模型,就必須將模型轉換為與 MediaPipe 相容的格式。

如要進一步瞭解 LLM Inference API 適用的已訓練模型,請參閱任務總覽的「模型」一節。

下載模型

在初始化 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 直接部署這些模型。如要瞭解如何轉換其他模型,請參閱「模型轉換」一節。

將模型推送至裝置

output_path 資料夾的內容推送至 Android 裝置。

$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push output_path /data/local/tmp/llm/model_version.bin

建立工作

MediaPipe LLM 推論 API 會使用 createFromOptions() 函式設定工作。createFromOptions() 函式會接受設定選項的值。如要進一步瞭解設定選項,請參閱「設定選項」。

以下程式碼會使用基本設定選項初始化工作:

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPATH('/data/local/.../')
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)

設定選項

請使用下列設定選項設定 Android 應用程式:

選項名稱 說明 值範圍 預設值
modelPath 模型在專案目錄中的儲存路徑。 路徑 不適用
maxTokens 模型處理的符記數量上限 (輸入符記 + 輸出符記)。 整數 512
topK 模型在產生過程的每個步驟中會考慮的符記數量。將預測結果限制在機率最高的符記前 k 個。 整數 40
temperature 產生期間引入的隨機程度。溫度越高,產生的文字就越有創意;溫度越低,產生的文字就越容易預測。 浮點值 0.8
randomSeed 文字產生期間使用的隨機種子。 整數 0
loraPath 裝置本機上 LoRA 模型的絕對路徑。注意:這項功能僅適用於 GPU 型號。 路徑 不適用
resultListener 將結果事件監聽器設為以非同步方式接收結果。僅適用於使用非同步產生方法時。 不適用 不適用
errorListener 設定選用的錯誤事件監聽器。 不適用 不適用

準備資料

LLM 推論 API 可接受下列輸入內容:

  • prompt (字串):問題或提示。
val inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."

執行工作

使用 generateResponse() 方法,針對先前提供的輸入文字 (inputPrompt) 產生文字回應。這會產生單一產生回應。

val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")

如要串流回應,請使用 generateResponseAsync() 方法。

val options = LlmInference.LlmInferenceOptions.builder()
  ...
  .setResultListener { partialResult, done ->
    logger.atInfo().log("partial result: $partialResult")
  }
  .build()

llmInference.generateResponseAsync(inputPrompt)

處理及顯示結果

大型語言模型推論 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 推論 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 模型推論。

Android 在初始化期間支援靜態 LoRA。如要載入 LoRA 模型,使用者必須指定 LoRA 模型路徑和基礎 LLM。

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPath('<path to base model>')
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .setLoraPath('<path to LoRA model>')
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)

如要使用 LoRA 執行 LLM 推論,請使用與基礎模型相同的 generateResponse()generateResponseAsync() 方法。