iOS 向け LLM 推論ガイド

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

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

サンプルコード

MediaPipe Tasks のサンプルコードは、iOS 用の LLM Inference API アプリの基本的な実装です。アプリは、独自の iOS アプリの出発点として使用できます。また、既存のアプリを変更するときに参照することもできます。LLM Inference API のサンプルコードは 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/ios/
    

サンプルコードのローカル バージョンを作成したら、MediaPipe タスク ライブラリをインストールし、Xcode を使用してプロジェクトを開いてアプリを実行できます。手順については、iOS の設定ガイドをご覧ください。

セットアップ

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

依存関係

LLM Inference API は MediaPipeTasksGenai ライブラリを使用します。このライブラリは、CocoaPods を使用してインストールする必要があります。このライブラリは、Swift アプリと Objective-C アプリの両方と互換性があり、言語固有の追加設定は必要ありません。

macOS に CocoaPods をインストールする手順については、CocoaPods のインストール ガイドをご覧ください。アプリに必要な Pod で Podfile を作成する方法については、CocoaPods の使用をご覧ください。

次のコードを使用して、PodfileMediaPipeTasksGenai Pod を追加します。

target 'MyLlmInferenceApp' do
  use_frameworks!
  pod 'MediaPipeTasksGenAI'
  pod 'MediaPipeTasksGenAIC'
end

アプリに単体テストのターゲットが含まれている場合は、iOS のセットアップ ガイドPodfile のセットアップの詳細をご確認ください。

モデル

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

モデルのダウンロード

Xcode を使用してモデルをダウンロードし、プロジェクト ディレクトリに追加します。Xcode プロジェクトにファイルを追加する方法については、Xcode プロジェクト内のファイルとフォルダの管理をご覧ください。

Gemma 2B をダウンロード

iOS アプリをビルドする場合は、次のいずれかのバリアントを使用します。

  • gemma-2b-it-cpu-int4: CPU 互換の Gemma 4 ビットモデル。
  • gemma-2b-it-gpu-int4: GPU 互換の Gemma 4 ビットモデル。
  • iOS のメモリ要件に準拠する AI Edge Torch マッピング モデル。

他のモデルの詳細については、タスクの概要のモデル セクションをご覧ください。

タスクを作成する

LLM Inference API タスクを作成するには、いずれかのイニシャライザを呼び出します。LlmInference(options:) イニシャライザは、構成オプションの値を設定します。

カスタマイズした構成オプションで LLM Inference API を初期化する必要がない場合は、LlmInference(modelPath:) イニシャライザを使用して、デフォルトのオプションで LLM Inference API を作成できます。構成オプションの詳細については、構成の概要をご覧ください。

次のコードは、このタスクをビルドして構成する方法を示しています。

import MediaPipeTasksGenai

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "bin")

let options = LlmInferenceOptions()
options.baseOptions.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101

let LlmInference = try LlmInference(options: options)

構成オプション

このタスクには、iOS アプリ用に次の構成オプションがあります。

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

データの準備

LLM Inference API はテキストデータを処理します。このタスクは、トークン化やテンソルの前処理などのデータ入力の前処理を処理します。

すべての前処理は generateResponse(inputText:) 関数内で処理されます。入力テキストを事前に追加で前処理しておく必要はありません。

let inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."

タスクを実行する

LLM Inference API を実行するには、generateResponse(inputText:) メソッドを使用します。LLM Inference API は、入力テキストに考えられるカテゴリを返します。

let result = try LlmInference.generateResponse(inputText: inputPrompt)

レスポンスをストリーミングするには、generateResponseAsync(inputText:) メソッドを使用します。

let resultStream =  LlmInference.generateResponseAsync(inputText: inputPrompt)

do {
  for try await partialResult in resultStream {
    print("\(partialResult)")
  }
  print("Done")
}
catch {
  print("Response error: '\(error)")
}

結果を処理して表示する

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 は、大規模言語モデルの低ランク適応(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 の重みを使用します。

iOS では、初期化時に静的な LoRA がサポートされます。LoRA モデルを読み込むには、LoRA モデルのパスとベース LLM を指定します。

import MediaPipeTasksGenai

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "bin")
let loraPath= Bundle.main.path(forResource: "lora_model",
                                      ofType: "bin")
let options = LlmInferenceOptions()
options.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101
options.loraPath = loraPath

let LlmInference = try LlmInference(options: options)

LoRA を使用して LLM 推論を実行するには、ベースモデルと同じ generateResponse() または generateResponseAsync() メソッドを使用します。