網頁版 LLM 推論指南

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

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

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

程式碼範例

LLM 推論 API 的範例應用程式會在 JavaScript 中提供此任務的基本實作方式,供您參考。您可以使用這個範例應用程式,開始建構自己的文字產生應用程式。

您可以前往 GitHub 存取 LLM Inference API 範例應用程式。

設定

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

瀏覽器相容性

LLM 推論 API 需要使用與 WebGPU 相容的網路瀏覽器。如需相容的瀏覽器完整清單,請參閱「GPU 瀏覽器相容性」。

JavaScript 套件

您可以透過 @mediapipe/tasks-genai 套件取得 LLM 推論 API 程式碼。您可以透過平台設定指南中的連結,尋找並下載這些程式庫。

安裝本機階段作業所需的套件:

npm install @mediapipe/tasks-genai

如要部署至伺服器,請使用 jsDelivr 等內容傳遞網路 (CDN) 服務,直接將程式碼加入 HTML 頁面:

<head>
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai/genai_bundle.cjs"
    crossorigin="anonymous"></script>
</head>

型號

MediaPipe LLM 推論 API 需要訓練的模型,且該模型必須與此工作相容。對於網頁應用程式,模型必須與 GPU 相容。

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

將模型新增至專案目錄

將模型儲存在專案目錄中:

<dev-project-root>/assets/gemma-2b-it-gpu-int4.bin

使用 baseOptions 物件 modelAssetPath 參數指定模型的路徑:

baseOptions: { modelAssetPath: `/assets/gemma-2b-it-gpu-int4.bin`}

建立工作

請使用其中一個 LLM 推論 API createFrom...() 函式,準備執行推論的任務。您可以使用 createFromModelPath() 函式,搭配訓練模型檔案的相對或絕對路徑。程式碼範例使用 createFromOptions() 函式。如要進一步瞭解可用的設定選項,請參閱「設定選項」。

以下程式碼示範如何建構及設定此工作:

const genai = await FilesetResolver.forGenAiTasks(
    // path/to/wasm/root
    "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
llmInference = await LlmInference.createFromOptions(genai, {
    baseOptions: {
        modelAssetPath: '/assets/gemma-2b-it-gpu-int4.bin'
    },
    maxTokens: 1000,
    topK: 40,
    temperature: 0.8,
    randomSeed: 101
});

設定選項

此工作包含下列網頁和 JavaScript 應用程式的設定選項:

選項名稱 說明 值範圍 預設值
modelPath 模型在專案目錄中的儲存路徑。 路徑 不適用
maxTokens 模型處理的符記數量上限 (輸入符記 + 輸出符記)。 整數 512
topK 模型在產生過程的每個步驟中會考慮的符記數量。將預測結果限制在機率最高的符記前 k 個。 整數 40
temperature 產生期間引入的隨機程度。溫度越高,產生的文字就越有創意;溫度越低,產生的文字就越容易預測。 浮點值 0.8
randomSeed 文字產生期間使用的隨機種子。 整數 0
loraRanks LoRA 模型在執行期間使用的 LoRA 等級。注意:這項功能僅適用於 GPU 型號。 整數陣列 不適用

準備資料

LLM Inference API 可接受文字 (string) 資料。這個工作會處理資料輸入的預先處理作業,包括斷詞和張量預先處理。

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

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

執行工作

LLM 推論 API 會使用 generateResponse() 函式觸發推論。對於文字分類,這表示傳回輸入文字的可能類別。

以下程式碼示範如何使用工作模型執行處理作業。

const response = await llmInference.generateResponse(inputPrompt);
document.getElementById('output').textContent = response;

如要串流回應,請使用下列指令:

llmInference.generateResponse(
  inputPrompt,
  (partialResult, done) => {
        document.getElementById('output').textContent += partialResult;
});

處理及顯示結果

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

Web 支援在執行階段動態調整 LoRA。也就是說,使用者會宣告在初始化期間要使用的 LoRA 排名,並可在執行階段交換不同的 LoRA 模型。

const genai = await FilesetResolver.forGenAiTasks(
    // path/to/wasm/root
    "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
const llmInference = await LlmInference.createFromOptions(genai, {
    // options for the base model
    ...
    // LoRA ranks to be used by the LoRA models during runtime
    loraRanks: [4, 8, 16]
});

在執行階段,基礎模型初始化後,載入要使用的 LoRA 模型。此外,在產生 LLM 回覆時,請傳遞 LoRA 模型參照,觸發 LoRA 模型。

// Load several LoRA models. The returned LoRA model reference is used to specify
// which LoRA model to be used for inference.
loraModelRank4 = await llmInference.loadLoraModel(loraModelRank4Url);
loraModelRank8 = await llmInference.loadLoraModel(loraModelRank8Url);

// Specify LoRA model to be used during inference
llmInference.generateResponse(
  inputPrompt,
  loraModelRank4,
  (partialResult, done) => {
        document.getElementById('output').textContent += partialResult;
});