Android 向け LLM 推論ガイド

<ph type="x-smartling-placeholder">で確認できます。

LLM Inference API を使用すると、大規模言語モデル(LLM)を完全にデバイス上で実行できます。 Android アプリ向けに開発されており、さまざまなタスク、 たとえば、テキストの生成、自然言語形式での情報の取得、 ドキュメントの要約などを行いますこのタスクには、複数の Google Cloud サービス テキストからテキストへの大規模言語モデルにより、最新のオンデバイスで 生成 AI モデルを Android アプリに組み込むことができます。

このタスクは Gemma 2B は、 同じ研究に基づいて構築された軽量で最先端のオープンモデルのファミリー テクノロジーです。Gemini また、次の外部モデルもサポートしています。 Phi-2 Falcon-RW-1BStableLM-3B、 および AI Edge を通じてエクスポートされた すべてのモデルが含まれます

機能、モデル、構成オプションの詳細については、 概要をご覧ください。

サンプルコード

このガイドでは、Android 向けの基本的なテキスト生成アプリの例を紹介します。マイページ 独自の Android アプリの出発点としてアプリを使用したり、 変更する際の注意点があります。サンプルコードは GitHub

コードをダウンロードする

次の手順では、サンプルのローカルコピーを作成する方法を示します。 git コマンドライン ツールを使用してコードを実行します。

サンプルコードをダウンロードするには:

  1. 次のコマンドを使用して Git リポジトリのクローンを作成します。
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. 必要に応じて、スパース チェックアウトを使用するように 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.safetensorsmodel-00001-of-00003.safetensors。ファイル パターンを指定できます(例: model*.safetensors)。 経路
ckpt_format モデルのファイル形式。 {"safetensors", "pytorch"}
model_type 変換される LLM。 {&quot;PHI_2&quot;, &quot;FALCON_RW_1B&quot;, &quot;STABLELM_4E1T_3B&quot;, &quot;GEMMA_2B&quot;}
backend モデルの実行に使用されるプロセッサ(委任)。 {&quot;cpu&quot;, &quot;gpu&quot;}
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() メソッドを使用します。