ウェブ用 LLM 推論ガイド

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

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

サンプルコード

LLM Inference API のサンプル アプリケーションでは、参考までに、このタスクの基本的な実装を JavaScript で行うことができます。このサンプルアプリを使用して、独自のテキスト生成アプリの作成を開始できます。

LLM Inference API の GitHub にあるサンプルアプリにアクセスできます。

セットアップ

このセクションでは、LLM Inference API を使用するように開発環境とコード プロジェクトを設定するための主な手順について説明します。プラットフォームのバージョン要件など、MediaPipe Tasks を使用するための開発環境の設定に関する一般的な情報については、ウェブの設定ガイドをご覧ください。

ブラウザの互換性

LLM Inference API には、WebGPU と互換性のあるウェブブラウザが必要です。互換性のあるブラウザの一覧については、GPU ブラウザの互換性をご覧ください。

JavaScript パッケージ

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>

モデル

MediaPipe LLM Inference API には、このタスクと互換性のあるトレーニング済みモデルが必要です。ウェブ アプリケーションの場合、モデルは GPU 互換である必要があります。

LLM Inference API で利用可能なトレーニング済みモデルの詳細については、タスクの概要のモデル セクションをご覧ください。

モデルのダウンロード

LLM Inference API を初期化する前に、サポートされているモデルのいずれかをダウンロードし、ファイルをプロジェクト ディレクトリに保存します。

  • Gemma: Gemini モデルの作成に使用されたのと同じ研究とテクノロジーから構築された、軽量で最先端のオープンモデルのファミリーの一つです。質問応答、要約、推論など、さまざまなテキスト生成タスクに適しています。Gemma 2B または Gemma 7B モデル バリアントをダウンロードします。
  • Phi-2: 27 億パラメータの Transformer モデル。質問応答、チャット、コード形式に最適です。
  • Falcon-RW-1B: RefinedWeb の 3,500 億トークンでトレーニングされた 10 億のパラメータがある因果デコーダのみのモデル。
  • StableLM-3B: 1 兆個の多様な英語データセットとコード データセットで事前トレーニングされた 30 億個のパラメータ デコーダのみの言語モデル。

Gemma 2B または Gemma 7B を使用することをおすすめします。Gemma 2B は Kaggle モデルで利用可能で、すでに LLM Inference API と互換性のある形式になっています。別の LLM を使用する場合は、MediaPipe に対応した形式にモデルを変換する必要があります。Gemma の詳細については、Gemma のサイトをご覧ください。使用可能な他のモデルの詳細については、タスクの概要のモデルのセクションをご覧ください。

モデルを MediaPipe 形式に変換する

ネイティブ モデル変換

外部 LLM(Phi-2、Falcon、StableLM)または Kaggle 以外の Gemma バージョンを使用している場合は、Google の変換スクリプトを使用して、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)

コンバータは 2 つの TFLite フラットバッファ ファイルを出力します。1 つはベースモデル用、もう 1 つは LoRA モデル用です。

パラメータ 説明 許容値
input_ckpt model.safetensors または pytorch.bin ファイルのパス。モデルの SafeTensors の形式が複数のファイルにシャーディングされる場合があるので注意してください(例: 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.json ファイルと tokenizer_config.json ファイルを格納するディレクトリのパス。Gemma の場合は、単一の tokenizer.model ファイルにカーソルを合わせます。 PATH
lora_ckpt LoRA アダプタの重みを格納する SafeTensorBoard の LoRA ckpt ファイルのパス。 PATH
lora_rank LoRA ckpt のランクを表す整数。lora の重みを変換するために必要です。指定されていない場合、コンバータは LoRA の重みがないと見なします。注: LoRA をサポートしているのは GPU バックエンドのみです。 Integer
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 モデル固有のストップ トークン。提供されたトークナイザ モデルにストップ トークンが存在する必要があります。 リスト [文字列]
output_filename 出力タスク バンドル ファイルの名前。 PATH

モデルをプロジェクト ディレクトリに追加する

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

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

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

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

タスクを作成する

LLM Inference 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 プロジェクト ディレクトリ内でモデルが保存されているパス。 PATH なし
maxTokens モデルが処理するトークン(入力トークン + 出力トークン)の最大数。 Integer 512
topK 生成の各ステップでモデルが考慮するトークンの数。予測を最も確率が高い上位 k 個のトークンに制限します。topK を設定する場合は、randomSeed の値も設定する必要があります。 Integer 40
temperature 生成時に導入されたランダム性の量。温度が高いほど、生成されるテキストの創造性が高まり、温度が低いほど、生成を予測しやすくなります。temperature を設定する場合は、randomSeed の値も設定する必要があります。 浮動小数点数 0.8
randomSeed テキスト生成時に使用されるランダムシード。 Integer 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 Inference API は、generateResponse() 関数を使用して推論をトリガーします。テキスト分類の場合、入力テキストに該当するカテゴリを返します。

次のコードは、タスクモデルで処理を実行する方法を示しています。

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

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

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

結果を処理して表示する

LLM Inference 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 Inference API の LoRA サポートは、GPU バックエンドの Gemma-2B モデルと Phi-2 モデルで機能します。LoRA の重みはアテンション レイヤにのみ適用されます。この初期実装は将来の開発のための試験運用版 API として機能し、今後のアップデートでより多くのモデルとさまざまな種類のレイヤをサポートする予定です。

LoRA モデルを準備する

HuggingFace の手順に沿って、サポートされているモデルタイプ(Gemma-2B または Phi-2)を使用して、独自のデータセットでファインチューニングされた LoRA モデルをトレーニングします。Gemma-2B モデルと Phi-2 モデルは、どちらも HuggingFace で Safetensors 形式で入手できます。LLM 推論 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"],
)

テスト用に、LLM Inference API に適合するファインチューニングされた LoRA モデルが一般公開され、HuggingFace から入手できます。たとえば、Gemma-2B の場合は monsterapi/gemma-2b-lora-maths-orca-200k、Phi-2 の場合は lole25/phi-2-sft-ultrachat-lora になります。

準備したデータセットでトレーニングしてモデルを保存すると、ファインチューニングされた LoRA モデルの重みを含む adapter_model.safetensors ファイルが得られます。セーフテンソル ファイルは、モデル変換で使用される LoRA チェックポイントです。

次のステップでは、MediaPipe Python パッケージを使用して、モデルの重みを TensorFlow Lite フラットバッファに変換する必要があります。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)

コンバータは 2 つの TFLite フラットバッファ ファイルを出力します。1 つはベースモデル用、もう 1 つは LoRA モデル用です。

LoRA モデルの推論

ウェブ、Android、iOS の LLM Inference API が更新され、LoRA モデル推論がサポートされるようになりました。ウェブは動的 LoRA をサポートしており、実行時にさまざまな LoRA モデルを切り替えることができます。Android と iOS は静的 LoRA をサポートしています。これは、タスクの存続期間中に同じ 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 モデル参照を渡して 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;
});