ウェブ用 LLM 推論ガイド

LLM Inference API を使用すると、ウェブ アプリケーション用に大規模言語モデル(LLM)を完全にオンデバイスで実行できます。これにより、テキストの生成、自然言語形式での情報の取得、ドキュメントの要約など、幅広いタスクを実行できます。このタスクには、複数のテキストツーテキストの大規模言語モデルが組み込まれているため、最新のオンデバイス生成 AI モデルをウェブアプリに適用できます。

LLM 推論 API をウェブ アプリケーションにすばやく追加するには、クイックスタートをご覧ください。LLM 推論 API を実行するウェブ アプリケーションの基本的な例については、サンプル アプリケーションをご覧ください。LLM Inference API の仕組みについて詳しくは、構成オプションモデル変換LoRA チューニングのセクションをご覧ください。

このタスクの動作は、MediaPipe Studio のデモで確認できます。このタスクの機能、モデル、構成オプションの詳細については、概要をご覧ください。

クイックスタート

LLM Inference API をウェブ アプリケーションに追加する手順は次のとおりです。LLM Inference API を使用するには、WebGPU と互換性のあるウェブブラウザが必要です。互換性のあるブラウザの一覧については、GPU ブラウザの互換性をご覧ください。

依存関係を追加する

LLM Inference API は @mediapipe/tasks-genai パッケージを使用します。

ローカル ステージングに必要なパッケージをインストールします。

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>

モデルのダウンロード

Kaggle モデルから Gemma-2 2B を 8 ビット量子化形式でダウンロードします。使用可能なモデルの詳細については、モデルのドキュメントをご覧ください。

モデルをプロジェクト ディレクトリに保存します。

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

baseOptions オブジェクトの modelAssetPath パラメータを使用して、モデルのパスを指定します。

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

タスクを初期化する

基本的な構成オプションを使用してタスクを初期化します。

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-int8.bin'
    },
    maxTokens: 1000,
    topK: 40,
    temperature: 0.8,
    randomSeed: 101
});

タスクを実行する

generateResponse() 関数を使用して推論をトリガーします。

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

レスポンスをストリーミングするには、次のコマンドを使用します。

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

サンプル アプリケーション

このサンプル アプリケーションは、LLM 推論 API を使用する、ウェブ向けの基本的なテキスト生成アプリの例です。このアプリは、独自のウェブアプリの開始点として使用できます。また、既存のアプリを変更する際にも参照できます。サンプルコードは GitHub でホストされています。

次のコマンドを使用して、Git リポジトリのクローンを作成します。

git clone https://github.com/google-ai-edge/mediapipe-samples

詳しくは、ウェブ向けの設定ガイドをご覧ください。

設定オプション

ウェブアプリを設定するには、次の構成オプションを使用します。

オプション名 説明 値の範囲 デフォルト値
modelPath プロジェクト ディレクトリ内のモデルの保存場所へのパス。 経路 なし
maxTokens モデルが処理するトークンの最大数(入力トークン + 出力トークン)。 Integer 512
topK 生成の各ステップでモデルが考慮するトークンの数。予測を、最も高い確率を持つ上位 k 個のトークンに制限します。 Integer 40
temperature 生成時に導入されるランダム性の量。温度が高いほど、生成されるテキストの創造性が高くなりますが、温度が低いほど、生成が予測しやすくなります。 浮動小数点数 0.8
randomSeed テキスト生成時に使用される乱数シード。 Integer 0
loraRanks ランタイム中に LoRA モデルで使用される LoRA ランク。注: これは GPU モデルにのみ対応しています。 整数配列 なし

モデル変換

LLM Inference API は、次のタイプのモデルに対応しています。一部のモデルではモデル変換が必要です。次の表を使用して、モデルに必要なステップ方法を特定します。

モデル コンバージョンの方法 対応プラットフォーム ファイル形式
Gemma-3 1B コンバージョンは不要 Android、ウェブ .task
Gemma 2B、Gemma 7B、Gemma-2 2B コンバージョンは不要 Android、iOS、ウェブ .bin
Phi-2、StableLM、Falcon MediaPipe 変換スクリプト Android、iOS、ウェブ .bin
すべての PyTorch LLM モデル AI Edge Torch 生成ライブラリ Android、iOS .task

他のモデルを変換する方法については、モデルの変換をご覧ください。

LoRA のカスタマイズ

LLM Inference API は、PEFT(パラメータ エフィシエント ファインチューニング)ライブラリを使用して LoRA(Low-Rank Adaptation)チューニングをサポートしています。LoRA チューニングは、費用対効果の高いトレーニング プロセスを通じて LLM の動作をカスタマイズし、モデル全体を再トレーニングするのではなく、新しいトレーニング データに基づいてトレーニング可能な重み付けの小さなセットを作成します。

LLM Inference API は、Gemma-2 2BGemma 2BPhi-2 モデルのアテンション レイヤへの LoRA 重みの追加をサポートしています。モデルを safetensors 形式でダウンロードします。

LoRA 重みを作成するには、ベースモデルを safetensors 形式にする必要があります。LoRA トレーニング後、モデルを FlatBuffers 形式に変換して MediaPipe で実行できます。

LoRA 重みを準備する

PEFT の LoRA メソッド ガイドを使用して、独自のデータセットでファインチューニングされた LoRA モデルをトレーニングします。

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"],
)

準備したデータセットでトレーニングしてモデルを保存すると、ファインチューニングされた LoRA モデルの重みは adapter_model.safetensors で使用できるようになります。safetensors ファイルは、モデル変換中に使用される LoRA チェックポイントです。

モデル変換

MediaPipe Python パッケージを使用して、モデルの重みを Flatbuffer 形式に変換します。ConversionConfig には、ベースモデル オプションと追加の LoRA オプションを指定します。

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_FILE,
)

converter.convert_checkpoint(config)

コンバータは、ベースモデル用と LoRA モデル用の 2 つの MediaPipe 互換ファイルを生成します。

LoRA モデルの推論

ウェブは実行時の動的 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 モデルをトリガーします。

// 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;
});