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 の使用をご覧ください。
依存関係を追加する
次のコードを使用して、Podfile に MediaPipeTasksGenai 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 2B、Gemma 2B、Phi-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() メソッドを使用します。