LLM 推論指南

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

試試看!

此工作支援 Gemma 2B 和 7B,這是一種輕量級開放式模型系列,兩者使用相同的研究和技術建構 Gemini 模型。此外,也支援下列外部模型:Phi-2Falcon-RW-1BStableLM-3B

除了原生支援的模型之外,使用者也可以使用 Google 的 AI Edge 產品 (包括對應 PyTorch 模型) 對應其他模型。這可讓使用者將對應的模型匯出至多特徵碼 TensorFlow Lite 模型,這些模型會隨附權杖化工具參數,以建立工作套件。

開始使用

如要開始使用這項工作,請按照目標平台適用的任一實作指南操作。下列平台專用指南會引導您逐步完成這項工作的基本實作方式,並提供使用可用模型的程式碼範例和建議設定選項:

任務詳細資料

本節說明這項工作的功能、輸入、輸出和設定選項。

功能

LLM Inference API 包含下列主要功能:

  1. 產生文字轉文字:根據輸入文字提示產生文字。
  2. LLM 選擇:套用多個模型,依據特定用途量身打造應用程式。您也可以重新訓練和套用自訂權重至模型。
  3. LoRA 支援:在所有資料集上進行訓練,或使用開放原始碼社群預先建構的 LoRA 模型 (僅限原生模型),運用 LoRA 模型擴充及自訂 LLM 功能。
工作輸入內容 工作輸出內容
LLM Inference API 接受下列輸入內容:
  • 文字提示,例如問題、電子郵件主旨、要匯總的文件
LLM Inference API 會輸出下列結果:
  • 根據輸入提示生成文字 (例如問題答案、電子郵件草稿、文件摘要)

設定選項

這項工作有以下設定選項:

選項名稱 說明 值範圍 預設值
modelPath 專案目錄中儲存模型的路徑。 PATH 不適用
maxTokens 模型處理的符記數量上限 (輸入符記 + 輸出符記)。 整數 512
topK 模型在產生每個步驟時考量的符記數量。將預測範圍限制在機率最高的前 K 個符記。設定 topK 時,您也必須設定 randomSeed 的值。 整數 400
temperature 在產生過程中引入的隨機量。隨機性參數越高,生成文字就能發揮更多創意,而低溫則能產生更準確的生成結果。設定 temperature 時,您也必須設定 randomSeed 的值。 浮點值 0.8
randomSeed 用來產生文字的隨機種子值。 整數 0
loraPath 在裝置上本機的 LoRA 模型絕對路徑。注意:這項功能僅與 GPU 型號相容。 PATH 不適用
resultListener 設定結果監聽器,以非同步方式接收結果。 僅適用於使用非同步產生方法的情況。 不適用 不適用
errorListener 設定選用的錯誤事件監聽器。 不適用 不適用

模型

LLM Inference API 內建支援可任意文字轉文字的大型語言模型,此模型經過最佳化調整,適合在瀏覽器和行動裝置上執行。這些輕量模型可下載,並在裝置端完整執行推論。

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

Gemma 2B

Gemma 2B 是一系列最先進的輕量開放模型的一部分,兩者都以建立 Gemini 模型所用的研究和技術為基礎建構而成。這個模型包含 2B 參數和開放式權重。這個模型非常適合用於各種文字產生工作,包括回答問題、提供摘要和推理。

下載 Gemma 2B

Gemma 2B 模型分為以下四種變化版本:

您也可以先調整模型並新增權重,然後再將模型加入應用程式。如要進一步瞭解如何調整及自訂 Gemma,請參閱 Tuning Gemma。從 Kaggle 模型下載 Gemma 後,該模型即採用適合與 MediaPipe 搭配使用的格式。

如果您從 Hugging Face 下載 Gemma 2B,必須將模型轉換為適合 MediaPipe 的格式。LLM Inference API 需要下載並轉換下列檔案:

  • model-00001-of-00002.safetensors
  • model-00002-of-00002.safetensors
  • tokenizer.json
  • tokenizer_config.json

Gemma 7B

Gemma 7B 是較大的 Gemma 模型,具有 7B 參數和開放式權重。這個模型已更強大的文字生成工作,包括回答問題、提供摘要和推理等。Gemma 7B 僅適用於網頁版。

下載 Gemma 7B

Gemma 7B 模型有兩個變化版本:

如果您從 Hugging Face 下載 Gemma 7B,必須將模型轉換為適用於 MediaPipe 的格式。LLM Inference API 需要下載並轉換下列檔案:

  • model-00001-of-00004.safetensors
  • model-00002-of-00004.safetensors
  • model-00003-of-00004.safetensors
  • model-00004-of-00004.safetensors
  • tokenizer.json
  • tokenizer_config.json

獵鷹 10 號星

Falcon-1B 是 10 億個參數純解碼器模型,使用 RefinedWeb 的 350B 符記訓練而成。

下載 Falcon 1B

如要使用 LLM Inference API,您必須將下列檔案下載及儲存在本機:

  • tokenizer.json
  • tokenizer_config.json
  • pytorch_model.bin

下載 Falcon 模型檔案之後,模型即可轉換為 MediaPipe 格式。按照「將模型轉換為 MediaPipe 格式」一文中的步驟進行。

StableLM 3B

StableLM-3B 是 30 億個僅含解碼器的參數模型模型,並使用 1 兆個各種英文和程式碼資料集進行 4 個訓練週期的預先訓練。

下載 StableLM 3B

如要使用 LLM Inference API,您必須將下列檔案下載及儲存在本機:

  • tokenizer.json
  • tokenizer_config.json
  • model.safetensors

下載 StableLM 模型檔案後,模型就可以轉換為 MediaPipe 格式。按照「將模型轉換為 MediaPipe 格式」一文中的步驟進行。

Phi-2

Phi-2 是 27 億個參數 Transformer 模型這個模型使用多種自然語言合成文字和篩選過的網站進行訓練。這個模型最適合使用問題答案、聊天功能和程式碼格式的提示。

下載 Phi-2

如要使用 LLM Inference API,您必須將下列檔案下載及儲存在本機:

  • tokenizer.json
  • tokenizer_config.json
  • model-00001-of-00002.safetensors
  • model-00002-of-00002.safetensors

下載 Phi-2 模型檔案之後,模型即可轉換為 MediaPipe 格式。按照「將模型轉換為 MediaPipe 格式」一文中的步驟進行。

AI Edge 匯出的模型

AI Edge 是 Google 提供的服務,可讓您將使用者對應的模型轉換為多特徵碼的 TensorFlow Lite 模型。如要進一步瞭解如何對應及匯出模型,請造訪 AI Edge Torch GitHub 頁面

將模型匯出成 TFLite 格式後,就可以將模型轉換為 MediaPipe 格式。詳情請參閱將模型轉換為 MediaPipe 格式

將模型轉換為 MediaPipe 格式

原生模型轉換

如果使用外部 LLM (Phi-2、Falcon 或 StableLM) 或非 Kaggle 版本 Gemma,請使用我們的轉換指令碼將模型格式化,以便與 MediaPipe 相容。

模型轉換程序需要使用 MediaPipe PyPI 套件。轉換指令碼適用於 0.10.11 之後的所有 MediaPipe 套件。

使用以下內容安裝及匯入依附元件:

$ python3 -m pip install mediapipe

使用 genai.converter 程式庫轉換模型:

import mediapipe as mp
from mediapipe.tasks.python.genai import converter

config = converter.ConversionConfig(
  input_ckpt=INPUT_CKPT,
  ckpt_format=CKPT_FORMAT,
  model_type=MODEL_TYPE,
  backend=BACKEND,
  output_dir=OUTPUT_DIR,
  combine_file_only=False,
  vocab_model_file=VOCAB_MODEL_FILE,
  output_tflite_file=OUTPUT_TFLITE_FILE,
)

converter.convert_checkpoint(config)

如要轉換 LoRA 模型,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 模型。

參數 說明 接受的值
input_ckpt model.safetensorspytorch.bin 檔案的路徑。請注意,有時模型安全張量格式會分割為多個檔案,例如 model-00001-of-00003.safetensorsmodel-00001-of-00003.safetensors。您可以指定檔案模式,例如 model*.safetensors PATH
ckpt_format 模型檔案格式。 {"safetensors", "pytorch"}
model_type 要轉換的 LLM。 {"PHI_2", "FALCON_RW_1B", "STABLELM_4E1T_3B", "GEMMA_2B"}
backend 用來執行模型的處理器 (委派)。 {"cpu", "gpu"}
output_dir 託管個別圖層權重檔案的輸出目錄路徑。 PATH
output_tflite_file 輸出檔案的路徑。例如「model_cpu.bin」或「model_gpu.bin」。這個檔案僅與 LLM Inference API 相容,無法做為一般的「tflite」檔案。 PATH
vocab_model_file 儲存 tokenizer.jsontokenizer_config.json 檔案的目錄路徑。如為 Gemma,請指向單一 tokenizer.model 檔案。 PATH
lora_ckpt 用於儲存 LoRA 配接權重安全張量檔案的 LoRA 底座路徑。 PATH
lora_rank 代表 LoRA 掛接位置的整數。如要轉換 lora 權重,此為必填屬性。如未提供,則轉換工具會假設沒有 LoRA 權重。注意:只有 GPU 後端支援 LoRA。 整數
lora_output_tflite_file 輸出 LoRA 權重的 tflite 檔案名稱。 PATH

AI Edge 模型轉換

如果是透過 AI Edge 使用對應到 TFLite 模型的 LLM,請使用我們的套裝組合指令碼建立工作組合。組合程序會將對應的模型與其他中繼資料 (例如權杖化工具參數) 才能執行端對端推論

模型組合程序需要使用 MediaPipe PyPI 套件。轉換指令碼適用於 0.10.14 之後的所有 MediaPipe 套件。

使用以下內容安裝及匯入依附元件:

$ python3 -m pip install mediapipe

使用 genai.bundler 程式庫來封裝模型:

import mediapipe as mp
from mediapipe.tasks.python.genai import bundler

config = bundler.BundleConfig(
    tflite_model=TFLITE_MODEL,
    tokenizer_model=TOKENIZER_MODEL,
    start_token=START_TOKEN,
    stop_tokens=STOP_TOKENS,
    output_filename=OUTPUT_FILENAME,
    enable_bytes_to_unicode_mapping=ENABLE_BYTES_TO_UNICODE_MAPPING,
)
bundler.create_bundle(config)
參數 說明 接受的值
tflite_model AI Edge 匯出的 TFLite 模型的路徑。 PATH
tokenizer_model SentencePiece 權杖化工具模型的路徑。 PATH
start_token 模型專屬起始權杖。啟動權杖必須存在於提供的權杖化工具模型中。 STRING
stop_tokens 模型專屬的停止權杖。停止權杖必須存在於提供的權杖化工具模型中。 清單 [STRING]
output_filename 輸出工作組合檔案的名稱。 PATH

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 權重。

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() 方法。