LiteRT CLI 101: エッジ AI ワークフローを効率化する

1. 🏁 概要と CLI の概要

LiteRT CLI 101 ハンズオン Codelab へようこそ。このガイドは、環境のセットアップから最適化されたエッジ インテリジェンスのデプロイまでを段階的に説明するように設計されています。

🌟 背景

エッジ AI では、複雑なニューラル モデルをスマートフォン、ウェアラブル、組み込みハードウェアに直接導入する必要があります。

  • LiteRT(以前の TensorFlow Lite / TFLite): 効率的な変換、ランタイム、最適化により、エッジ プラットフォームでの高性能 ML と GenAI のデプロイを実現する Google のオンデバイス フレームワーク。
  • LiteRT CLI は、Google AI Edge スタックをスタンドアロンのシェル コマンド(litert)に統合し、プラットフォーム(デスクトップ、モバイル、クラウド)のさまざまなハードウェア(CPU / GPU / NPU)で LiteRT(TFLite)モデルの変換、量子化、コンパイル、実行、ベンチマーク、可視化など、LiteRT 関連の開発ワークフローを効率化します。

2. 🔄 基本的なワークフロー: 変換、量子化、実行

このセクションでは、LiteRT CLI を使用して Edge AI モデリングのライフサイクル全体(PyTorch モデルのラッパー ➔ トレース変換 ➔ モデルの量子化 ➔ デスクトップ推論 ➔ パフォーマンス ベンチマーク)を実行します。

LiteRT CLI 101 ワークフロー

📝 ステージ 1: PyTorch モデルのラッパー スクリプトを準備する

現在のディレクトリに resnet18.py を作成します。動的トレースフックを公開し、グラフ ビルダーが形状をキャプチャできるようにします。

import torch
import torchvision

def get_model(batch_size: int = 1) -> torch.nn.Module:
  model = torchvision.models.resnet18(
      weights=torchvision.models.ResNet18_Weights.IMAGENET1K_V1
  )
  model.eval()
  return model

def get_args(batch_size: int = 1) -> tuple[torch.Tensor, ...]:
  return (torch.randn(batch_size, 3, 224, 224),)

🔄 ステージ 2: LiteRT Torch を使用して PyTorch モデルを LiteRT に変換する

LiteRT Torch コンバータを呼び出して、標準の Float32 .tflite ターゲット モデルをビルドします。

# Convert PyTorch source to LiteRT
litert convert resnet18.py --output resnet18

# Verify target was exported
ls -lh resnet18/resnet18.tflite

📉 ステージ 3: 重みを INT8 に量子化する

動的レシピカードと重みのみのレシピカードを適用して、サイズを約 4 分の 1 に縮小します。

# 1. Dynamic Range Quantization (Dynamic activations + static INT8 weights)
litert quantize resnet18/resnet18.tflite \
  --recipe dynamic_wi8_afp32 \
  --output resnet18/resnet18_int8_dynamic.tflite

# 2. Weight-Only Quantization (Float32 activations + static INT8 weights)
litert quantize resnet18/resnet18.tflite \
  --recipe weight_only_wi8_afp32 \
  --output resnet18/resnet18_int8_weight_only.tflite

🚀 ステージ 4: 推論をローカルで実行する

ダミーの入力パラメータを使用してテスト オペレーションを実行し、パフォーマンス ブロックを検証します。

# Run original Float32 model inference
litert run resnet18/resnet18.tflite --desktop --cpu

# Run optimized Dynamic INT8 model inference
litert run resnet18/resnet18_int8_dynamic.tflite --cpu --iterations 1

📊 ステージ 5: モデルのパフォーマンスをベンチマークする

平均レイテンシ、初期化コスト、CPU 実行スループット、動的アクティブ メモリ フットプリントなどの高精度の指標を測定します。

# Benchmark original Float32 model
litert benchmark resnet18/resnet18.tflite --desktop --cpu

# Benchmark optimized Dynamic range INT8 model
litert benchmark resnet18/resnet18_int8_dynamic.tflite --desktop --cpu

3. 🔌 ローカル環境の設定と検証

ワークステーション(macOS または Linux)に分離されたクリーンなサンドボックスを構築しましょう

🔌 オプション A: 超高速セットアップ(uv)

uv を使用すると、ライブラリが数秒で分離され、環境キャッシュの競合が解消されます。

# Create active workspace sandbox
uv venv --clear --python=3.13 --seed
source .venv/bin/activate

# Install litert-cli from pypi
uv pip install litert-cli-nightly

🐍 オプション B: 標準設定(pip)

uv が存在しない場合は、標準の Python 仮想環境構成を使用します。

# Create active workspace sandbox
python3 -m venv .venv
source .venv/bin/activate

# Install litert-cli from pypi
pip install --upgrade pip setuptools wheel
pip install litert-cli-nightly

🛠️ オプション C: 編集可能なローカル設定

リポジトリのソース ディレクトリのクローン内で直接開発またはテストを行う場合:

# Create active workspace sandbox
uv venv --clear --python=3.13 --seed
source .venv/bin/activate

# Install from local directory root
uv pip install -e .

🔍 設定の確認

パスが litert コマンドを正しくルーティングしていることを確認します。

litert --help

💡 中央のモデル参照カタログ(model-ref)

スクリプトと開発の堅牢性を維持するため、LiteRT CLI は一元化されたモデル カタログを実装しています。

モデル カタログのルーティング図

  • 形式: ダウンロードまたはインポートしたモデルに一意の名前(エイリアス)を割り当てます(mobilenet など)。
  • バリエーション: 最適化されたバリエーション(mobilenet:int8mobilenet:gpu など)を参照するには、ターゲット コロンを使用します。
  • シンプルさ: すべての CLI コマンドで、このパスなしの エイリアスを直接使用できます。物理ファイル ストレージは自動的に解決されます。

4. 📲 デバイスのデプロイとプロファイリング

高精度のローカル ベンチマークの実行、実際の USB ハードウェア ターゲットへのデプロイ、ハードウェア デリゲートの実装、Ahead-of-Time コンパイル、クラウド ベンチマークにより、最適化をさらに進めます。

ターゲットのデプロイとアクセラレーションのオプション

📊 ローカル プロファイリング指標

EfficientNet-B1 をダウンロードし、デスクトップ ホストでパフォーマンス統計情報をプロファイリングします。

# Download and register model alias in central catalog
litert download litert-community/efficientnet_b1 --file "*.tflite" --output efficientnet
litert import efficientnet/efficientnet_b1.tflite --model-ref efficientnet_b1

# Run high-precision benchmark on desktop CPU
litert benchmark efficientnet_b1 --desktop --cpu

ベンチマーク ログで主要なパフォーマンス ヘッダーを確認します。

  • Model initialization: 構造ネットワークの起動時間。
  • Warmup (avg): コンパイルのオーバーヘッドのタイミング。
  • Inference (avg): 生の数学的処理時間。
  • Overall footprint: 実行中に消費された RAM のピーク。

📲 ターゲット A: モバイル CPU(USB 接続)

USB デバッグが有効になっている Android デバイスを接続して、デプロイします。

# 1. Confirm device connection
adb devices

# 2. Push and execute model on mobile CPU
litert run efficientnet_b1 --android --cpu

CLI は、モデルを対象デバイスに自動的に push し、推論ループを実行して、出力をパイプで戻します。

🎮 ターゲット B: モバイル GPU

OpenCL または WebGPU を使用して、負荷の高いワークロードを GPU に動的にオフロードします。

# Benchmark model performance on mobile GPU
litert benchmark efficientnet_b1 --android --gpu

# Run inference with GPU acceleration and CPU fallback
litert run efficientnet_b1 --android --accelerator gpu,cpu

⚙️ ターゲット C: JIT Android NPU

最新のチップセットで実行パラメータを NPU に直接オフロード:

# Run with on-device JIT NPU acceleration
litert run efficientnet_b1 --android --accelerator npu,cpu
  • 警告: デバイス上のランタイム内で動的グラフをビルドすると、初期化の JIT ウォームアップの遅延が大幅に発生します。

🚀 ターゲット D: AOT コンパイル済み NPU

オフラインで事前コンパイルして、ランタイム JIT のオーバーヘッドを回避し、最大限の高速化を実現します。

# 1. Offline compile for Qualcomm SM8750 NPU (Linux host)
litert compile efficientnet/efficientnet_b1.tflite --target sm8750

# 2. Execute compiled AOT binary with zero JIT warmup latency
litert run efficientnet_b1_Qualcomm_SM8750.tflite --android --npu

☁️ クラウド プロファイリング(Google AI Edge Portal)

Google Cloud のデバイス ファームにあるリモート ハードウェア プロファイルにテストをプッシュします。

# Log in to your Google Cloud project
gcloud auth login

# Push benchmark metrics to Pixel 7 CPU
litert benchmark efficientnet_b1 --gcp --device "pixel 7" --cpu --gcp-project "your-project-id"

# Push benchmark metrics to Snapdragon GPU targets
litert benchmark efficientnet_b1 --gcp --devices "pixel 7, sm-s931u1" --gpu --gcp-project "your-project-id"

5. 🧠 高度なトピック: LLM と音声認識

大規模言語モデル(LLM)と自動音声認識(ASR)モデルを変換して実行し、高度なモデルを調べてみましょう。

💬 生成 AI(LLM)

エッジ LLM はメモリ制限があります。この問題を解決するために、重みのみの INT4/INT8 量子化を適用し、実行チャネルを Float32 のままにして重みを圧縮します。

# 1. Automated download & conversion from Hugging Face
litert convert Qwen/Qwen1.5-0.5B-Chat --output models/qwen

# 2. Quantize model weights to INT4
litert convert Qwen/Qwen1.5-0.5B-Chat \
  --quantize-recipe weight_only_wi4_afp32 \
  --output models/qwen_w4

# 3. Generation once
litert lm run models/qwen/model.litertlm --prompt "Introduce San Francisco."

# 4. Interactive chat
litert lm run models/qwen/model.litertlm

🎙️ 音声処理(ASR)

Whisper や Parakeet などの ASR モデルには、エンコーダ モジュールとデコーダ モジュールの両方があります。署名鍵を使用して、特定のモジュールのベンチマークを行うことができます。

# 1. Download prepackaged Whisper-Tiny
litert download litert-community/whisper-tiny --file "whisper_tiny_30s_f32.tflite" --output "models/whisper_tiny"

# 2. Profile audio encoding
litert benchmark models/whisper_tiny/whisper_tiny_30s_f32.tflite --android --gpu --signature-key "encode"

# 3. Profile text token decoding loop
litert benchmark models/whisper_tiny/whisper_tiny_30s_f32.tflite --android --cpu --signature-key "decode"

6. 🤖 エージェント コーディングで使用する

LiteRT CLI はエージェント フレンドリーであり、コーディング エージェントと直接統合できます。

次に例を示します。LiteRT CLI スキル SKILL.md をコーディング エージェント(Google Antigravity など)に追加し、次のようなプロンプトを試します。

7. 🚀 おめでとうございます。次のステップ

🎉 すばらしい!LiteRT CLI 101 Codelab が完了しました。

エッジ ML 開発をマスターするためのスキルを習得しました。

  • PyTorch モデルを LiteRT モデルに変換します。
  • モデルの重みを INT4/INT8 に量子化します。
  • モバイル CPU/GPU/NPU でモデルを実行します。
  • NPU 用にコンパイルします。
  • パソコン、モバイル、クラウドでベンチマークを実施します。
  • LLM モデルを変換して実行します。
  • エージェント コーディングで使用します。

🔗 リソース

  • LiteRT CLI: https://github.com/google-ai-edge/LiteRT-CLI
  • LiteRT: https://ai.google.dev/edge/litert
  • : https://github.com/google-ai-edge/LiteRT-CLI/tree/main/examples