iOS 向け LLM 推論ガイド

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

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

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

クイックスタート

LLM 推論 API を 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

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

モデルのダウンロード

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

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

タスクを初期化する

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

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 モデルが処理するトークンの最大数(入力トークン + 出力トークン)。 Integer 512
topk 生成の各ステップでモデルが考慮するトークンの数。予測を、最も高い確率を持つ上位 k 個のトークンに制限します。 Integer 40
temperature 生成時に導入されるランダム性の量。温度が高いほど、生成されるテキストの創造性が高くなりますが、温度が低いほど、生成が予測しやすくなります。 浮動小数点数 0.8
randomSeed テキスト生成時に使用される乱数シード。 Integer 0
loraPath デバイス上のローカル LoRA モデルの絶対パス。注: これは GPU モデルにのみ対応しています。 経路 なし

モデル変換

LLM Inference 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 モデル AI Edge 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 Inference 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() メソッドを使用します。