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を組み合わせ、低消費電力でさまざまなカメラシステムを実現します。そのため、1つのAmbarella SoCで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-text形式、.prototxt)によって動作します。サンプル設定と対応するスキーマのドキュメントは、Ambarella SDKのリリースから入手してください。トレーニング、検証、デプロイの一貫性を保つため、検証でモデルの再準備が必要な場合はトレーニング設定を使用し、圧縮済みチェックポイントのエクスポート時にも必ず同じ設定を使用してください。
Amba引数#
2つの引数で、train、val、exportの各モードにおけるSpongeTorch統合を制御します:
| 引数 | 型 | デフォルト | 説明 |
|---|---|---|---|
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})コンパイル済みの*.ambapb.ckpt.onnxまたは*.ambapb.fastckpt.onnxファイルと同じディレクトリに、metadata.yamlを配置してください。
- チェックポイントにはSpongeTorchの圧縮状態が含まれている必要があります。圧縮されていないチェックポイントに
amba_configを設定してエクスポートしようとすると、次のエラーが発生します:"Checkpoint has no SpongeTorch pruning state... Use a compressed checkpoint from amba training before export." - 設定はトレーニング時に使用したものと一致している必要があります。異なる設定を使用すると、チェックポイントの重みを正しく読み込めない場合があります。
SDKツールによるコンパイル#
SDKコンパイルツールを使用し、SDKのコンパイルガイドに従って、エクスポートしたONNXモデルをターゲットチップセット向けにコンパイルします。ツールはPTQ、スケジューリング、メモリ計画を適用してグラフをCVflow AIエンジンにマッピングし、ホスト検証用の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ランタイムを使用して、AmbarellaデバイスにCavalryバイナリを読み込みます。前処理と後処理は、検出モデルのコンパイル時の設定に合わせる必要があります。具体的には、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を含む)が含まれ、別途配布されるspongetorchwheelもSDKとともに提供されます。Ambarellaフォークをインストールした状態で
yolo val model=model.ambapb.ckpt.onnx data=your_data.yamlを実行してください。AmbaPBバックエンドは、CVflow AIエンジンでの実行時と同じようにコンパイル済みモデルを実行するため、報告されるmAPにはコンパイラーによる量子化の影響がすべて含まれます。