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