iOS 向け LLM 推論ガイド

<ph type="x-smartling-placeholder">で確認できます。

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

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

サンプルコード

MediaPipe Tasks のサンプルコードは 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 の設定ガイドをご覧ください。

<ph type="x-smartling-placeholder">

依存関係

LLM Inference API は MediaPipeTasksGenai ライブラリを使用します。このライブラリをインストールする必要があります。 構築しましたこのライブラリは 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 内のフォルダと、 プロジェクトです。

<ph type="x-smartling-placeholder"></ph> 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 推論 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 プロジェクト ディレクトリ内でモデルが保存されている場所のパス。 経路 なし
maxTokens モデルが処理するトークン(入力トークン + 出力トークン)の最大数。 Integer 512
topk 生成の各ステップでモデルが考慮するトークンの数。 予測を上位 k 個の最も確率の高いトークンに制限します。 Integer 40
temperature 生成時に導入されるランダム性の量。やや高い 温度を使用すると、生成される文章のクリエイティビティが高くなりますが、 温度を低くすると、生成がより予測しやすくなります。 浮動小数点数 0.8
randomSeed テキスト生成時に使用されるランダムシード。 Integer 0
loraPath デバイス上のローカルの LoRA モデルの絶対パス。注: GPU モデルにのみ対応しています。 経路 なし

データの準備

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 推論 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 は、Low-Rank Adaptation(LoRA)をサポートするように構成できる 大規模言語モデルの場合ですファインチューニングされた LoRA モデルを利用することで、開発者は 費用対効果の高いトレーニング プロセスを通じて LLM の動作をカスタマイズできます。

LLM Inference API の LoRA サポートは、Gemma-2B モデルと Phi-2 モデルで機能します。 アテンション レイヤにのみ適用される LoRA の重みを持つ GPU バックエンド。この 初期実装は将来の開発のための試験運用版 API として機能する 今後、さらに多くのモデルとさまざまな種類のレイヤをサポートする予定です。 あります。

LoRA モデルを準備する

HuggingFace の手順に沿って、サポートされているモデルタイプ(Gemma-2B または Phi-2)を使用して独自のデータセットでファインチューニングされた LoRA モデルをトレーニングします。Gemma-2B モデルと Phi-2 モデルはどちらも、セーフテンソル形式で HuggingFace で利用できます。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"],
)

テスト用に、HuggingFace で利用可能な LLM Inference API に適合するファインチューニング済みの LoRA モデルが一般公開されています。たとえば、Gemma-2B の場合は monsterapi/gemma-2b-lora-maths-orca-200k、Phi-2 の場合は lole25/phi-2-sft-ultrachat-lora になります。

準備したデータセットでトレーニングしてモデルを保存したら、ファインチューニングされた LoRA モデルの重みを含む adapter_model.safetensors ファイルを取得します。Safetensors ファイルは、モデル変換で使用される LoRA チェックポイントです。

次のステップとして、MediaPipe Python Package を使用してモデルの重みを TensorFlow Lite Flatbuffer に変換する必要があります。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 フラットバッファ ファイル(ベースモデル用)を出力します。 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() メソッドを使用します。