LLM Inference API を使用すると、大規模言語モデル(LLM)を完全にデバイス上で実行できます。 Android アプリ向けに開発されており、さまざまなタスク、 たとえば、テキストの生成、自然言語形式での情報の取得、 ドキュメントの要約などを行いますこのタスクには、複数の Google Cloud サービス テキストからテキストへの大規模言語モデルにより、最新のオンデバイスで 生成 AI モデルを Android アプリに組み込むことができます。
このタスクは Gemma 2B は、 同じ研究に基づいて構築された軽量で最先端のオープンモデルのファミリー テクノロジーです。Gemini また、次の外部モデルもサポートしています。 Phi-2 Falcon-RW-1B、 StableLM-3B、 および AI Edge を通じてエクスポートされた すべてのモデルが含まれます
機能、モデル、構成オプションの詳細については、 概要をご覧ください。
サンプルコード
このガイドでは、Android 向けの基本的なテキスト生成アプリの例を紹介します。マイページ 独自の Android アプリの出発点としてアプリを使用したり、 変更する際の注意点があります。サンプルコードは GitHub。
コードをダウンロードする
次の手順では、サンプルのローカルコピーを作成する方法を示します。 git コマンドライン ツールを使用してコードを実行します。
サンプルコードをダウンロードするには:
- 次のコマンドを使用して Git リポジトリのクローンを作成します。
git clone https://github.com/google-ai-edge/mediapipe-samples
- 必要に応じて、スパース チェックアウトを使用するように Git インスタンスを構成し、
LLM Inference API サンプルアプリのファイルのみを表示:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/llm_inference/android
サンプルコードのローカル バージョンを作成したら、プロジェクトをインポートできます。 アプリを実行します。手順については、セットアップ ガイド: Android。
セットアップ
このセクションでは、開発環境をセットアップする主な手順と LLM Inference API を使用するコード プロジェクトを作成していました。一般的な情報については、 MediaPipe タスクを使用するための開発環境の設定 プラットフォーム バージョンの要件については、 Android。
依存関係
LLM Inference API は com.google.mediapipe:tasks-genai
ライブラリを使用します。こちらの
を Android アプリの build.gradle
ファイルに追加します。
dependencies {
implementation 'com.google.mediapipe:tasks-genai:0.10.14'
}
モデル
MediaPipe LLM Inference API には、トレーニング済みの text-to-text 言語モデルが 対応しています。モデルをダウンロードしたら、必要な モデルを Android デバイスに push できます。モデルを使用している場合 Gemma 以外の場合は、Gemma と互換性のある形式にモデルを変換する必要があります。 MediaPipe。
LLM Inference API で利用可能なトレーニング済みモデルの詳細については、タスクをご覧ください。 モデル セクションの概要
モデルのダウンロード
LLM Inference API を初期化する前に、サポートされているモデルのいずれかをダウンロードして、 プロジェクト ディレクトリ内にファイルを保存します。
- Gemma 2B: これは、ゼロから構築された軽量で最先端のオープンモデルのファミリーの一部で、 研究とテクノロジーが生まれたのと同じ Gemini モデル。さまざまな用途に最適 テキスト生成タスク(質問応答、要約、生成 AI など)が 学習します。
- Phi-2: 27 億のパラメータ 質問応答、チャット、コードに最適な Transformer モデル 使用できます。
- Falcon-RW-1B: 10 億 パラメータ因果的デコーダのみのモデルを、次の 3,500 億トークンでトレーニング RefinedWeb:
- StableLM-3B: 3 1 兆個のパラメータで事前トレーニングされた 10 億パラメータ デコーダのみの言語モデル 多様な英語とコードのデータセットのトークンを 提供します
別の方法として、Google Cloud でマッピングおよびエクスポートされたモデルを AI Edge Troch。
Kaggle で入手できる Gemma 2B を使用することをおすすめします。 モデルがあり、 LLM Inference API と互換性のある形式にします。以下をご使用の場合: モデルを変換する必要があります。 MediaPipe に適した形式。Gemma 2B について詳しくは、Gemma 2B の サイトをご覧ください。他のモジュールの詳細については、 タスクの概要のモデル セクションをご覧ください。
モデルを 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 |
出力タスク バンドル ファイルの名前。 | 経路 |
モデルをデバイスに push する
output_path フォルダの内容を Android に push する ダウンロードします
$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push output_path /data/local/tmp/llm/model_version.bin
タスクを作成する
MediaPipe LLM Inference API は、createFromOptions()
関数を使用して以下を設定します。
タスクを実行します。createFromOptions()
関数は構成の値を受け入れます。
。構成オプションの詳細については、構成
オプションをご覧ください。
次のコードは、基本構成オプションを使用してタスクを初期化します。
// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
.setModelPATH('/data/local/.../')
.setMaxTokens(1000)
.setTopK(40)
.setTemperature(0.8)
.setRandomSeed(101)
.build()
// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)
構成オプション
Android アプリを設定するには、次の構成オプションを使用します。
オプション名 | 説明 | 値の範囲 | デフォルト値 |
---|---|---|---|
modelPath |
プロジェクト ディレクトリ内でモデルが保存されている場所のパス。 | 経路 | なし |
maxTokens |
モデルが処理するトークン(入力トークン + 出力トークン)の最大数。 | Integer | 512 |
topK |
生成の各ステップでモデルが考慮するトークンの数。 予測を上位 k 個の最も確率の高いトークンに制限します。 | Integer | 40 |
temperature |
生成時に導入されるランダム性の量。やや高い 温度を使用すると、生成される文章のクリエイティビティが高くなりますが、 温度を低くすると、生成がより予測しやすくなります。 | 浮動小数点数 | 0.8 |
randomSeed |
テキスト生成時に使用されるランダムシード。 | Integer | 0 |
loraPath |
デバイス上のローカルの LoRA モデルの絶対パス。注: GPU モデルにのみ対応しています。 | 経路 | なし |
resultListener |
結果を非同期で受け取るように結果リスナーを設定します。 非同期生成メソッドを使用する場合にのみ適用されます。 | なし | なし |
errorListener |
オプションのエラーリスナーを設定します。 | なし | なし |
データの準備
LLM Inference API は、次の入力を受け入れます。
- prompt(文字列): 質問またはプロンプト。
val inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."
タスクを実行する
generateResponse()
メソッドを使用して入力に対するテキスト レスポンスを生成する
テキスト(inputPrompt
)。これにより、単一の
レスポンスが返されます。
val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")
レスポンスをストリーミングするには、generateResponseAsync()
メソッドを使用します。
val options = LlmInference.LlmInferenceOptions.builder()
...
.setResultListener { partialResult, done ->
logger.atInfo().log("partial result: $partialResult")
}
.build()
llmInference.generateResponseAsync(inputPrompt)
結果の処理と表示
LLM Inference API は、生成されたテキストを含む LlmInferenceResult
を返します。
レスポンス テキスト。
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 重みを使用します。
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()
メソッドを使用します。