LLM Inference API を使用すると、Google Cloud 上で完全に大規模言語モデル(LLM)を ウェブ アプリケーション用のブラウザを使用して、さまざまな操作を実行でき、 たとえば、テキストの生成、自然言語形式での情報の取得、 ドキュメントの要約などですこのタスクには、複数の Google Cloud サービス テキストからテキストへの大規模言語モデルにより、最新のオンデバイスで ウェブアプリに導入できます。
このタスクの実例は、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
サーバーにデプロイするには、次のようなコンテンツ配信ネットワーク(CDN)サービスを使用します。 jsDelivr を使用して、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 モデル。さまざまな用途に最適 テキスト生成タスク(質問応答、要約、生成 AI など)が 学習します。Gemma 2B または Gemma 7B モデル バリアントのいずれかをダウンロードします。
- Phi-2: 27 億のパラメータ 質問応答、チャット、コードに最適な Transformer モデル 使用できます。
- Falcon-RW-1B: 10 億 パラメータ因果的デコーダのみのモデルを、次の 3,500 億トークンでトレーニング RefinedWeb:
- StableLM-3B: 3 1 兆個のパラメータで事前トレーニングされた 10 億パラメータ デコーダのみの言語モデル 多様な英語とコードのデータセットのトークンを 提供します
Kaggle で入手できる Gemma 2B または Gemma 7B を使用することをおすすめします。 Models で、 LLM Inference API と互換性のある形式にします。以下をご使用の場合: モデルを変換する必要があります。 MediaPipe に適した形式。Gemma について詳しくは、 Gemma のサイト。このモジュールの その他の使用可能なモデルについては、タスクの概要のモデル セクションをご覧ください。
モデルを MediaPipe 形式に変換する
ネイティブ モデルの変換
外部の LLM(Phi-2、Falcon、StableLM)または Kaggle 以外の言語を使用している場合 作成したら、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 フラットバッファ ファイル(ベースモデル用)を出力します。 LoRA モデル用です
パラメータ | 説明 | 許容値 |
---|---|---|
input_ckpt |
model.safetensors ファイルまたは pytorch.bin ファイルへのパス。モデルのセーフテンソル形式が複数のファイルにシャーディングされている場合があります。たとえば、model-00001-of-00003.safetensors 、model-00001-of-00003.safetensors 。ファイル パターンを指定できます(例: model*.safetensors )。 |
経路 |
ckpt_format |
モデルのファイル形式。 | {"safetensors", "pytorch"} |
model_type |
変換される LLM。 | {"PHI_2", "FALCON_RW_1B", "STABLELM_4E1T_3B", "GEMMA_2B"} |
backend |
モデルの実行に使用されるプロセッサ(委任)。 | {"cpu", "gpu"} |
output_dir |
レイヤごとの重みファイルをホストする出力ディレクトリのパス。 | 経路 |
output_tflite_file |
出力ファイルのパス。例: model_cpu.bin"model_gpu.bin"ですこのファイルは LLM Inference API にのみ対応しており、一般的な「tflite」ファイルとしては使用できません。 | 経路 |
vocab_model_file |
tokenizer.json とファイルを格納するディレクトリのパス
tokenizer_config.json ファイル。Gemma の場合は、単一の tokenizer.model ファイルにカーソルを合わせます。 |
経路 |
lora_ckpt |
LoRA アダプタの重みを格納する Safetensors ファイルのパス。 | 経路 |
lora_rank |
LoRA チェックポイントのランクを表す整数。Lora の重みを変換するために必要です。指定しない場合、コンバータは LoRA の重みはないと見なします。注: LoRA をサポートしているのは GPU バックエンドのみです。 | Integer |
lora_output_tflite_file |
LoRA の重みの tflite ファイル名を出力します。 | 経路 |
AI Edge モデル変換
AI Edge を介して TFLite モデルにマッピングされた LLM を使用している場合は、Google の Task Bundle を作成するためのバンドル スクリプト。バンドルプロセスでは 追加のメタデータ(トークナイザ パラメータ)が必要です。 エンドツーエンドの推論を実行できます
モデルのバンドル プロセスには、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 モデルのパス。 | 経路 |
tokenizer_model |
SentencePiece トークナイザ モデルのパス。 | 経路 |
start_token |
モデル固有の開始トークン。開始トークンは トークナイザ モデルを使用できます。 | STRING |
stop_tokens |
モデル固有のストップ トークン。ストップ トークンは トークナイザ モデルを使用できます。 | リスト [STRING] |
output_filename |
出力タスク バンドル ファイルの名前。 | 経路 |
モデルをプロジェクト ディレクトリに追加する
モデルをプロジェクト ディレクトリに保存します。
<dev-project-root>/assets/gemma-2b-it-gpu-int4.bin
baseOptions
オブジェクト modelAssetPath
を使用してモデルのパスを指定する
parameter:
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 |
プロジェクト ディレクトリ内でモデルが保存されている場所のパス。 | 経路 | なし |
maxTokens |
モデルが処理するトークン(入力トークン + 出力トークン)の最大数。 | Integer | 512 |
topK |
生成の各ステップでモデルが考慮するトークンの数。 予測を上位 k 個の最も確率の高いトークンに制限します。 | Integer | 40 |
temperature |
生成時に導入されるランダム性の量。やや高い 温度を使用すると、生成される文章のクリエイティビティが高くなりますが、 温度を低くすると、生成がより予測しやすくなります。 | 浮動小数点数 | 0.8 |
randomSeed |
テキスト生成時に使用されるランダムシード。 | Integer | 0 |
loraRanks |
実行時に LoRA モデルで使用される LoRA ランク。注: GPU モデルにのみ対応しています。 | 整数配列 | なし |
データの準備
LLM Inference API はテキスト(string
)データを受け入れます。タスクはデータ入力を処理し、
これにはトークン化やテンソルの前処理が含まれます。
すべての前処理は generateResponse()
関数内で処理されます。Google
入力テキストの追加の前処理が不要になります。
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 推論 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 は、Low-Rank Adaptation(LoRA)をサポートするように構成できる 大規模言語モデルの場合ですファインチューニングされた LoRA モデルを利用することで、開発者は 費用対効果の高いトレーニング プロセスを通じて LLM の動作をカスタマイズできます。
LLM Inference API の LoRA サポートは、Gemma-2B モデルと Phi-2 モデルで機能します。 アテンション レイヤにのみ適用される LoRA の重みを持つ GPU バックエンド。この 初期実装は将来の開発のための試験運用版 API として機能する 今後、さらに多くのモデルとさまざまな種類のレイヤをサポートする予定です。 あります。
LoRA モデルを準備する
HuggingFace の手順に沿って、サポートされているモデルタイプ(Gemma-2B または Phi-2)を使用して独自のデータセットでファインチューニングされた LoRA モデルをトレーニングします。Gemma-2B モデルと Phi-2 モデルはどちらも、セーフテンソル形式で HuggingFace で利用できます。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"],
)
テスト用に、HuggingFace で利用可能な LLM Inference API に適合するファインチューニング済みの LoRA モデルが一般公開されています。たとえば、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 Package を使用してモデルの重みを 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)
コンバータは 2 つの TFLite フラットバッファ ファイル(ベースモデル用)を出力します。 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;
});