Ultralytics YOLO モデル向け Ambarella CVflow エクスポート#
Ultralytics YOLO モデルを Ambarella SoC にデプロイするには、Ambarella のコンパイルツールを使用してモデルをコンパイルする必要があります。また、CVflow アーキテクチャ向けに最適化されたモデルは、推論時のパフォーマンスが向上します。Ultralytics のこのフォークは、Ambarella の SpongeTorch 圧縮ツールキットをトレーニング、検証、エクスポートのパイプラインに直接統合し、開発者が Ambarella ハードウェアに効率よくデプロイできる最適化モデルを生成できるようにします。
このガイドでは、現在の物体検出のデプロイワークフローを、圧縮を考慮したトレーニングからデバイス上での推論まで解説します(パイプライン全体についてはワークフローの概要を参照してください)。
AmbaPB チェックポイント形式は、CVflow の計算プリミティブをサポートし、SDK ツールで生成されたアーティファクトをパッケージ化する、Ambarella 固有の ONNX IR 仕様の拡張です。これはデプロイ前にコンパイル済みモデルの精度を検証するために使用するホスト側のアーティファクトです。ターゲットデバイス用に別途生成される Cavalry バイナリが、ボード上で実行されます。
このワークフローは、PyPI では入手できない Ambarella 独自の SDK コンポーネントに依存します。必要な SDK パッケージを入手するには、Ambarella Developer Zoneに登録し、Cooper™ Developer Platform からアクセスを申請してください。
この統合は Ambarella が保守しています。フォーク、SpongeTorch、SDK に関する問題は、Ambarella サポートに報告してください。
Ambarella とは何ですか?#
Ambarellaはカリフォルニア州サンタクララに本社を置く、エッジ AI SoC を設計する半導体企業です。同社のプロセッサは、画像信号処理、ビデオエンコード、オンチップ AI 演算を組み合わせており、セキュリティ、自動車、ロボティクス、産業、コンシューマー向けデバイスに使用されています。
CVflow とは何ですか?#
CVflow は Ambarella のビジョン処理アーキテクチャです。CPU や GPU とは独立した専用のビジョンエンジンを使用して、コンピュータービジョンやニューラルネットワークのワークロードを実行します。PyTorchなどのフレームワークでトレーニングしたモデルは、エンジン上で実行する前に Ambarella SDK を使用して CVflow のネイティブ形式にコンパイルします。
現在の CVflow SoC ファミリーと主な用途:
| SoC ファミリー | 主な用途 |
|---|---|
| CV72 / CV75 | 4K AI セキュリティカメラ、スマートカメラ、産業用ビジョン |
| CV5 / CV52 | ドローン、アクションカメラ、ロボティクス、マルチカメラシステム |
| N1-655 | オンプレミスの生成 AI およびマルチストリーム動画分析アプライアンス |
Ambarella に YOLO をデプロイする理由#
- ワット当たりのパフォーマンス: CVflow SoC は常時稼働するエッジ AI 向けに設計されており、カメラに適した電力予算内でリアルタイムの物体検出を実行します。
- 圧縮を考慮したトレーニング: SpongeTorch はトレーニング中にプルーニングを適用し、モデルの精度を維持しながらスパース化と効率化を進め、CVflow へのデプロイを支援します。
- カメラパイプラインの統合: Ambarella SoC は画像信号プロセッサ(ISP)、超高精細ビデオエンコード、CVflow を組み合わせ、低消費電力でさまざまなカメラシステムを実現します。そのため、Ambarella SoC 1つで AI カメラのパイプライン全体を処理できます。
ワークフローの概要#
パイプラインは次の6つの段階で構成されます。
- 圧縮を考慮したトレーニング — SpongeKit 設定(
amba_config)を使用してトレーニングし、SpongeTorch がトレーニング中に段階的に非構造化プルーニングを適用します。トレーニング後量子化(PTQ)の精度が許容できない場合、SpongeTorch は量子化を考慮したトレーニング(QAT)もサポートしていますが、この方法はまだ Ultralytics 統合に組み込まれておらず、今後のリリースで対応予定です。 - ONNX エクスポート — 同じ
amba_configを使用して圧縮済みチェックポイントをエクスポートし、ONNX グラフ内の圧縮構造を保持します。 - コンパイル — SDK コンパイルツールを使用して ONNX モデルを AmbaPB チェックポイントにコンパイルします。この処理では CVflow エンジン向けに PTQ が適用されます。
- ホストでの検証 — AmbaPB バックエンド経由で、コンパイル済みの
*.ambapb.ckpt.onnxモデルを Ultralytics のpredict/valに通し、デプロイ前に精度を検証します。 - Cavalry への変換 — SDK ツールを使用して、検証済みの AmbaPB チェックポイントを Cavalry バイナリに変換します。
- デバイスでの実行 — Ambarella の SDK ランタイムライブラリを使用して、デバイス上で Cavalry バイナリを実行します。
SpongeTorch によるトレーニングとエクスポートのワークフローは任意であり、通常の ONNX エクスポートに置き換えることもできます(SpongeTorch を使用しないエクスポートを参照)。
前提条件#
インストール#
Ultralytics のこのフォークをインストールし、コンパイルツールと cvflowbackend ライブラリを含む Ambarella CVflow SDK をセットアップして、SDK に同梱されている spongetorch wheel をインストールします。
# Install this Ultralytics fork from source
git clone https://github.com/Ambarella-Inc/ultralytics
cd ultralytics
git checkout amba_v8.4.46
pip install -e .
# Access and set up the Ambarella SDK compilation tools
# After the environment is ready, install the spongetorch library
pip install /path/to/spongetorch-*.whlAutoBackend は、SDK コンパイルツールの tv2 コマンド(tv2 -libpath cvflowbackend)を通じて cvflowbackend を検出します。そのため、コンパイル済みモデルで推論や検証を実行する前に、SDK コンパイルツールをインストールし、PATH に追加しておく必要があります。
SpongeKit 設定ファイル#
SpongeTorch は SpongeKit 設定ファイル(protobuf テキスト形式、.prototxt)に基づいて動作します。このファイルでは、スパース性の目標値や圧縮スケジュールなど、プルーニングの処理を定義します。設定例と対応するスキーマのドキュメントは、Ambarella SDK のリリースから入手してください。トレーニング、検証、デプロイの一貫性を保つため、検証時にモデルを再準備する必要がある場合はトレーニング設定を使用し、圧縮済みチェックポイントのエクスポートには常に同じ設定を使用してください。
Amba 引数#
train、val、export の各モードで SpongeTorch 統合を制御する引数は2つです。
| 引数 | 種類 | デフォルト | 説明 |
|---|---|---|---|
amba_config | str | None | spongetorch.prepare() に渡す SpongeKit 設定ファイルのパスです。圧縮を考慮したトレーニングと SpongeTorch 対応エクスポートを有効にします。 |
amba_chipset | str | None | spongetorch.set_target_chipset() に渡すターゲットチップセット名です(例: CV72)。 |
このフォークでは、汎用のエクスポート引数も追加されています。
| 引数 | 種類 | デフォルト | 説明 |
|---|---|---|---|
export_file | str | None | カスタムのエクスポート出力パスまたは名前です(例: '/tmp/model.onnx' または 'model.onnx')。 |
圧縮を考慮したトレーニング#
SpongeTorch の圧縮を有効にして、モデルをトレーニング(またはファインチューニング)します。
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(
data="coco8.yaml",
epochs=100,
amba_config="config.prototxt",
amba_chipset="CV72",
)amba_config を設定すると、セットアップ時にトレーナーがモデルとオプティマイザーを spongetorch.prepare() でラップします。圧縮はステップスケジュールに沿って段階的に適用されるため、ネットワークは精度を維持しながらスパース化するよう学習します。トレーニング済みチェックポイントには SpongeTorch のスパース状態(_orig/_mask テンソル)が保存され、後続のエクスポート処理で必要になります。再現性を確保するため、設定ファイルは amba_config.prototxt として実行ディレクトリにコピーされます。
SpongeTorch の圧縮スケジュールが end_step に達するまで、best.pt と last.pt は意図的に保存されません。圧縮が中途半端なチェックポイントは使用できないためです。設定ファイル内のスケジュールを完了できるよう、epochs を十分な長さに設定してください。チェックポイントの保存が始まると、ログに表示されます。スケジュール完了前にトレーニングが終了した場合、警告とともに最終エポックが保存されますが、そのチェックポイントはデプロイしないでください。
最良の精度を得るには、まず通常の方法でモデルをトレーニングする(または事前学習済みチェックポイントから開始する)ことをお勧めします。その後、トレーニング済みの重みに対して amba_config を使用し、短時間の圧縮ファインチューニングを行います。
圧縮済みチェックポイントの検証#
コンパイル前に、同じ設定を使用して精度を検証します。
yolo val model=runs/detect/train/weights/best.pt data=coco8.yaml \
amba_config=config.prototxt amba_chipset=CV72必要に応じてバリデーターが spongetorch.prepare() を再適用し、圧縮構造を維持するため Conv+BN 融合を無効にします。圧縮していないベースラインと mAP を比較し、精度の低下が大きすぎる場合は、SpongeKit 設定を調整して再トレーニングしてください。
ONNXにエクスポート#
トレーニングで使用したものと同じ amba_config を使用して、圧縮済みチェックポイントをエクスポートします。
from ultralytics import YOLO
model = YOLO("runs/detect/train/weights/best.pt")
model.export(
format="onnx",
amba_config="config.prototxt",
amba_chipset="CV72",
)エクスポーターはモデルを再構築し、設定に基づいて spongetorch.prepare() を再適用してから、スパースチェックポイントの重みを準備済みの構造に読み込みます。その後、Conv+BN 融合を無効にした状態で ONNX にトレースし、SDK コンパイルツールが想定する形式と完全に一致するグラフを生成します。
モデルメタデータの保持#
ONNX エクスポートでは、モデルのタスク、クラス名、ストライド、入力サイズが ONNX ファイルに埋め込まれます。一方、AmbaPB バックエンドは、コンパイル済みモデルの隣にある metadata.yaml サイドカーファイルからこの情報を読み込みます。SDK コンパイルツールがこのサイドカーファイルを作成しない場合は、コンパイル前に ONNX モデルから抽出してください。
import onnx
from ultralytics.utils import YAML
model = onnx.load("model.onnx")
YAML.save("metadata.yaml", {item.key: item.value for item in model.metadata_props})metadata.yaml は、コンパイル済みの *.ambapb.ckpt.onnx または *.ambapb.fastckpt.onnx ファイルと同じディレクトリに置いてください。
- チェックポイントにはSpongeTorchの圧縮状態が含まれている必要があります。
amba_configを設定して圧縮されていないチェックポイントをエクスポートしようとすると、次のエラーが発生します。"チェックポイントにSpongeTorchのプルーニング状態がありません... エクスポートする前に、ambaのトレーニングで作成した圧縮済みチェックポイントを使用してください。" - 設定はトレーニング時に使用した設定と一致している必要があります。異なる設定を使用すると、チェックポイントの重みが正しく読み込まれないことがあります。
SDK Toolsでコンパイルする#
SDKのコンパイルガイドに従い、SDKコンパイルツールを使用して、エクスポートしたONNXモデルを対象チップセット向けにコンパイルします。ツールはグラフをCVflow AIエンジンにマッピングし、PTQ、スケジューリング、メモリープランニングを適用して、ホスト検証用のAmbaPBチェックポイントを生成します。
PTQは、キャリブレーション画像(SDKのコンパイルガイドに記載の方法で準備)を使用してINT8量子化を適用します。コンパイルツールは精度と実行時レイテンシのバランスを調整します。INT8にマッピングする演算を増やすとレイテンシは低下しますが、精度が下がる可能性があります。一方、FP16の演算を多く維持すると、レイテンシが高くなる代わりに精度を保てます。レイテンシの予算に必要なINT8レベルではPTQで目標精度に達しない場合、SpongeTorchを使用したQATが想定される解決策です。より積極的なINT8量子化に耐えられるようモデルをトレーニングし、低レイテンシの動作点で精度を回復させます。この統合ではQATはまだ利用できず、今後のリリースで提供する予定です。
Ultralyticsがコンパイル済みモデルを認識するには、ファイル名の末尾が.ambapb.ckpt.onnxまたは.ambapb.fastckpt.onnxである必要があります。
コンパイル済みモデルで推論を実行する#
コンパイル済みAmbaPBモデルは、Ultralytics APIから直接読み込めます。AutoBackendは.ambapbのサフィックスを検出し、推論をcvflowbackend経由で実行します。これにより、AIエンジン上での実行時と同じ方法でモデルを実行できます。
from ultralytics import YOLO
model = YOLO("model.ambapb.ckpt.onnx")
# Inference
results = model("https://ultralytics.com/images/bus.jpg")
# Validation
metrics = model.val(data="coco8.yaml")これは、コンパイラーによる量子化の影響をすべて含めた、ハードウェアにデプロイする前の最終的な精度チェックです。metadata.yamlファイルがコンパイル済みモデルと同じ場所にある場合、バックエンドはそこからクラス名、ストライド、タスク情報を読み込みます。バックエンドはデフォルトでCVflow推論モードacinfを使用します。デバッグ用に入出力の詳細をログに記録するには、環境変数ULTRALYTICS_AMBAPB_DEBUG=1を設定してください。
Cavalryバイナリに変換する#
AmbaPBチェックポイントのホスト検証に合格したら、SDKのコンパイルガイドに従い、SDKコンパイルツールを使用して対象デバイス向けのCavalryバイナリに変換します。Cavalryバイナリは、ボード上でSDKランタイムライブラリが実行する形式です。
ボードにデプロイする#
Ambarella SDKランタイムを使用して、CavalryバイナリをAmbarellaデバイスに読み込みます。前処理と後処理は、検出モデルのコンパイル時の設定と一致させる必要があります。入力は0–255の範囲のレターボックス処理済みRGB画像とし、出力には標準的なYOLO検出デコードを適用します。ランタイムAPIについては、SDKのデプロイメントドキュメントを参照してください。
SpongeTorchを使用せずにエクスポートする#
トレーニング時のプルーニングにSpongeTorchを使用しない場合も、標準のUltralyticsパイプラインでSDKツールがコンパイルできるモデルを生成できます。
yolo export model=yolo26n.pt format=onnx生成されたONNXをSDKコンパイルツールでコンパイルします。ツールがポストトレーニング量子化を実行します。この方法では、トレーニング時にspongetorchへの依存がなく、ワークフローが簡潔になる代わりに、実行時パフォーマンスと量子化後の精度が多少低下します。
実際の用途#
Ambarella CVflow SoC上のUltralytics YOLOモデルは、エッジで常時稼働するビジョン機能を実現します。
- AIセキュリティカメラ:3 W未満の電力予算で、4K IPカメラ上の人物と車両をリアルタイムに検出します。
- ドローンとロボティクス:CV5クラスのチップ上で、ナビゲーション、点検、配送に向けたオンボード物体検出と追跡を実行します。
- 産業・小売分析:エッジアプライアンス上で、複数ストリームの人数カウント、PPE検出、棚の監視を行います。
概要#
このガイドでは、Ambarella CVflow SoCにUltralytics YOLOモデルをデプロイする現在のワークフローを説明しました。SpongeTorchによる圧縮を考慮したトレーニング(amba_config/amba_chipset)、圧縮済みチェックポイントのONNXエクスポート、SDKツールによるAmbaPBチェックポイントへのオフラインコンパイル、Ultralyticsによるホスト検証、Ambarella SDKを使用したオンデバイスデプロイ用Cavalryバイナリへの変換が含まれます。
その他のエッジAIターゲットについては、Hailo、Rockchip RKNN、Sony IMX500、Qualcomm QNN、DEEPX、Axeleraの関連ガイドをご覧ください。エクスポート形式の全一覧は、エクスポートモードのドキュメントとインテグレーションページをご覧ください。
よくある質問#
いいえ。
format="ambarella"ターゲットはありません。ONNXにエクスポートし(必要に応じてamba_configでSpongeTorch圧縮を適用)、Ambarella SDKコンパイルツールを使用してONNXモデルをオフラインでAmbaPBにコンパイルしてください。SDKコンパイルツールでサポートされているCVflowベースのSoCであれば、いずれも対象にできます。AIカメラ向けのCV72/CV75ファミリーや、ドローンおよびロボティクス向けのCV5/CV52などが含まれます。
amba_chipset引数はSpongeTorchの最適化ターゲットを設定します。コンパイル時には、対応するターゲットを別途選択してください。使用可能なチップセット文字列と対応状況は、インストールされているSDKのリリースによって異なります。SpongeTorchは、AmbarellaのSpongeKitモデル圧縮ライブラリのPyTorch版(Caffe版とTensorFlow版もあります)で、トレーニング時の非構造化プルーニング向けにUltralyticsのAmbarellaフォークに統合されています(量子化を考慮したトレーニングは今後のリリースで提供予定です)。使用は任意です。通常のUltralytics ONNXエクスポートもSDKコンパイルツールでコンパイルできます。量子化はツールが実行しますが、実行時パフォーマンスと量子化後の精度は多少低下します。
これらはプロプライエタリであり、PyPIでは配布されていません。Ambarella Developer Zoneに登録してSDKへのアクセスを申請してください。SDKにはコンパイルツール(
cvflowbackendを含む)が含まれており、別途配布されるspongetorchホイールも同梱されています。Ambarellaフォークをインストールした状態で
yolo val model=model.ambapb.ckpt.onnx data=your_data.yamlを実行してください。AmbaPBバックエンドは、CVflow AIエンジン上での実行時と同じ方法でコンパイル済みモデルを実行するため、報告されるmAPにはコンパイラーによる量子化の影響がすべて含まれます。