iOS 向け LLM 推論ガイド

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

LLM 推論 API を iOS アプリケーションにすばやく追加するには、クイックスタートに沿って操作します。LLM 推論 API を実行する iOS アプリケーションの基本的な例については、サンプル アプリケーションをご覧ください。LLM Inference API の仕組みについて詳しくは、構成オプションモデル変換LoRA チューニングの各セクションをご覧ください。

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

クイックスタート

次の手順に沿って、LLM Inference API を iOS アプリケーションに追加します。LLM 推論 API は MediaPipeTasksGenai ライブラリを使用します。このライブラリは CocoaPods を使用してインストールする必要があります。このライブラリは Swift アプリと Objective-C アプリの両方に対応しており、言語固有の追加設定は必要ありません。

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

依存関係を追加する

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

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

アプリに単体テスト ターゲットが含まれている場合は、Podfile の設定に関する追加情報について、iOS の設定ガイドを参照してください。

モデルのダウンロード

Kaggle Models から 8 ビット量子化形式で Gemma-2 2B をダウンロードします。使用可能なモデルの詳細については、モデルのドキュメントをご覧ください。

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

Task を初期化する

基本的な構成オプションを使用してタスクを初期化します。

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)

タスクを実行する

generateResponse(inputText:) メソッドを使用してテキスト レスポンスを生成します。これにより、1 つの生成されたレスポンスが生成されます。

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 推論 API を使用した iOS 向けの基本的なテキスト生成アプリの例です。このアプリは、独自の iOS アプリの出発点として使用することも、既存のアプリを変更する際に参照することもできます。サンプルコードは GitHub でホストされています。

次のコマンドを使用して、git リポジトリのクローンを作成します。

git clone https://github.com/google-ai-edge/mediapipe-samples

サンプルコードのローカル バージョンを作成したら、プロジェクトを iOS Studio にインポートしてアプリを実行できます。詳しくは、iOS の設定ガイドをご覧ください。

構成オプション

次の構成オプションを使用して、iOS アプリを設定します。

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

モデル変換

LLM 推論 API は次のタイプのモデルと互換性があります。一部のモデルではモデル変換が必要です。この表を使用して、モデルに必要なステップ メソッドを特定します。

モデル 変換方法 対応プラットフォーム ファイル形式
Gemma-3 1B 変換は不要 Android、ウェブ .task
Gemma 2B、Gemma 7B、Gemma-2 2B 変換は不要 Android、iOS、ウェブ .bin
Phi-2、StableLM、Falcon MediaPipe 変換スクリプト Android、iOS、ウェブ .bin
すべての PyTorch LLM モデル LiteRT Torch 生成ライブラリ Android、iOS .task

他のモデルを変換する方法については、モデルの変換セクションをご覧ください。

LoRA のカスタマイズ

LLM Inference API は、PEFT(パラメータ エフィシエント ファインチューニング)ライブラリを使用して LoRA(Low-Rank Adaptation)チューニングをサポートしています。LoRA チューニングは、費用対効果の高いトレーニング プロセスを通じて LLM の動作をカスタマイズします。モデル全体を再トレーニングするのではなく、新しいトレーニング データに基づいてトレーニング可能な重みの小さなセットを作成します。

LLM Inference API は、Gemma-2 2BGemma 2BPhi-2 モデルのアテンション レイヤに LoRA 重みを追加することをサポートしています。モデルを safetensors 形式でダウンロードします。

LoRA 重みを作成するには、ベースモデルが safetensors 形式である必要があります。LoRA トレーニングの後、モデルを FlatBuffers 形式に変換して MediaPipe で実行できます。

LoRA 重みを準備する

PEFT の LoRA メソッドガイドを使用して、独自のデータセットでファインチューニングされた LoRA モデルをトレーニングします。

LLM 推論 API はアテンション レイヤでの LoRA のみをサポートしているため、LoraConfig でアテンション レイヤのみを指定します。

# For Gemma
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"],
)

準備したデータセットでトレーニングを行い、モデルを保存すると、ファインチューニングされた LoRA モデルの重みが adapter_model.safetensors で使用できるようになります。safetensors ファイルは、モデル変換中に使用される LoRA チェックポイントです。

モデル変換

MediaPipe Python パッケージを使用して、モデルの重みを Flatbuffer 形式に変換します。ConversionConfig には、ベースモデル オプションと追加の LoRA オプションを指定します。

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_FILE,
)

converter.convert_checkpoint(config)

コンバータは、ベースモデル用と LoRA モデル用の 2 つの Flatbuffer ファイルを生成します。

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() メソッドを使用します。