Vitis AIを使用したUltralytics YOLO向けAMD Xilinxエクスポート#
format="xilinx"を使用してUltralytics YOLO26モデルをエクスポートすると、AMD Quarkで量子化し、AMD Versal AI Edge Series Gen 2アダプティブSoCのNPU向けに変換します。その後、AMDのVitis AIコンパイラーで.raiモデルをビルドできる状態になります。同じエクスポートで、デプロイ前に任意のホスト上でINT8精度を検証できます。
このエクスポートは、VEK385評価キットなどのVersal AI Edge Series Gen 2デバイス向けに、現在も保守されているVitis AI NPUワークフローを対象としています。Zynq UltraScale+およびKria DPU、第1世代Versal AI Edge NPU(VEK280)では別のVitis AIワークフローを使用します。詳しくはその他のAMD Xilinxターゲットへのデプロイを参照してください。
AMD Xilinxデバイスは、世界中の多くの産業用カメラ、自動車用ビジョンシステム、ロボット、ドローン、医療画像製品に採用されています。Armプロセッサーとプログラマブルロジックを組み合わせており、新しいデバイスでは専用のAI Engineも備えています。そのため、1つのチップで動画を取り込み、前処理し、物体検出を実行し、低く予測可能な推論レイテンシで結果に応じた処理を行えます。
このガイドでは、AMD Xilinxへのエクスポート、Versalボードでのコンパイルと実行、各AMD Xilinxデバイスファミリーの概要、デバイス上でのAI処理、および各アクセラレーターがサポートするUltralytics YOLOオペレーターについて説明します。
AMD Xilinxとは何ですか?#
Xilinxは1980年代にフィールドプログラマブルゲートアレイ(FPGA)の分野を切り開き、アダプティブSoCとFPGAの主要サプライヤーとなりました。AMDは2022年2月にXilinxの買収を完了しました。現在、製品ラインはAMDブランドのAMD Zynq、AMD Kria、AMD Versal、AMD Vitisとして販売されています。
どちらの名称も同じ製品を指します。AMDはこれらを「アダプティブSoCとFPGA」として販売していますが、エンジニアの間では今も「Xilinx」という呼び名が広く使われています。製品番号にはXCのプレフィックスが引き続き使用されています(例:xczu7ev)。また、旧Vitis AIリポジトリとDockerイメージは、GitHubおよびDocker Hub上で引き続きXilinxという名称で公開されています。このガイドでは、どちらの名称でも見つけられるように「AMD Xilinx」を使用します。
主要な用語と概念#
AMD Xilinxのデプロイでは、独自の用語が使用されます。以下の表で、このガイドに登場するすべての用語を説明します。
| 用語 | 意味 |
|---|---|
| FPGA | フィールドプログラマブルゲートアレイ:設計(ビットストリームと呼ばれます)を読み込むことで、製造後にデジタルロジックを構成できるチップです。動画パイプラインやニューラルネットワークアクセラレーターなどのカスタムハードウェアを実装できます。 |
| プログラマブルロジック(PL) | AMD Xilinx SoC内のFPGAファブリックです。ZynqおよびKriaデバイスでは、AIアクセラレーターはPL内に構築されます。 |
| プロセッシングシステム(PS) | SoCに搭載されたハードマクロのArm CPUコア、メモリーコントローラー、周辺機器です。Linux、アプリケーション、アクセラレーターで実行できないモデルレイヤーを実行します。 |
| アダプティブSoC/MPSoC | プロセッシングシステムとプログラマブルロジックを組み合わせたシステムオンチップで、多くのVersalデバイスではAI Engineも搭載されています。MPSoCはマルチプロセッサーシステムオンチップを意味します。 |
| AI Engine(AIE、AIE-ML、AIE-MLv2) | 機械学習と信号処理向けに設計された、Versal AI Edgeシリーズを含む多くのVersalデバイスに搭載されているハードマクロのベクトルプロセッサーアレイです。 |
| DPU | ディープラーニング処理ユニット:AMDのINT8ニューラルネットワークアクセラレーターです。IPとして提供され、PLに組み込まれます(例:Zynq UltraScale+およびKria上のDPUCZDX8G)。B512からB4096などのサイズは、クロックサイクルあたりのピーク演算数を示します。 |
| NPU/NPU IP | ニューラル処理ユニット:AMDの現行世代の推論アクセラレーターで、最近のVitis AIリリースではDPUに置き換わっています。AMDはNPU IPを、AI Engineとプログラマブルロジックを組み合わせたソフトアクセラレーターとして説明しており、対応するハードウェア設計も必要です。NPU用語集の項目を参照してください。 |
| Vitis AI | AMD XilinxデバイスにニューラルネットワークをデプロイするためのAMDのツールチェーンです。量子化、コンパイル、ランタイム、サンプル、Docker環境が含まれます。 |
| AMD Quark | Versal AI Edge Gen 2のワークフローでFP32 ONNXモデルをINT8モデルに変換するために使用される、AMDの現行のモデル量子化ライブラリーです。 |
| 量子化、PTQ、QAT | FP32の重みとアクティベーションをINT8に変換することです。ポストトレーニング量子化(PTQ)ではキャリブレーション画像を使用します。量子化を考慮したトレーニング(QAT)では、精度を回復させるためにモデルをファインチューニングします。 |
| キャリブレーション画像 | PTQ中にモデルに入力し、各テンソルのINT8スケールを決定するための、小規模で代表性のある画像セットです。 |
| BF16と混合精度 | BFloat16は、FP32と同じ範囲を保つ16ビット浮動小数点形式です。混合精度では、ネットワークの大部分をINT8で実行し、精度に敏感なレイヤーをBF16で実行します。 |
| XIR | Xilinx中間表現:DPUコンパイラーが生成し、ランタイムが読み込むグラフ形式です。 |
.xmodel | シリアライズされたXIRグラフです。量子化ツールは量子化済みの.xmodelを書き出し、DPUコンパイラーはこれをDPU命令、量子化済み重み、CPUサブグラフを含むコンパイル済みの.xmodelに変換します。コンパイル済みモデルには、対応するDPU構成が必要です。 |
arch.json/DPUフィンガープリント | 特定のDPU構成を記述するファイルです。DPUコンパイラーに必要であり、あるフィンガープリント向けにコンパイルされた.xmodelは、別のフィンガープリントでは実行できません。 |
| スナップショット | Versal AI Edge(VEK280)NPUワークフローで生成されるコンパイル済みモデルのディレクトリーです。1つのNPU IPバリアントに紐づいています。 |
.rai | Versal AI Edge Gen 2 NPUワークフローで生成されるコンパイル済みモデルファイルです。 |
| VART/VART-ML | コンパイル済みモデルを読み込み、ボード上で実行するVitis AI Runtimeライブラリーです。C++およびPython APIを提供します。 |
| ONNX Runtime Vitis AI EP | ONNX Runtime向けのVitisAIExecutionProviderで、AMD NPU上でONNXモデルをコンパイルして実行します。 |
| CPUフォールバック/グラフ分割 | アクセラレーターがオペレーターを実行できない場合、コンパイラーは通常、モデルをアクセラレーター用サブグラフとCPU用サブグラフに分割します。分割のたびにデータ転送が発生し、レイテンシの大部分を占める場合があります。一部のオペレーターは、モデル全体をCPUで実行することになったり、コンパイルに失敗したりする原因になります。 |
エッジAI向けAMD Xilinxデバイスファミリー#
エッジAI向けAMD Xilinxデバイスは、3つのファミリーに分かれます。ZynqとKriaはプログラマブルロジック内のDPUを使用し、このガイドで取り上げるVersal AI EdgeデバイスはAI Engine上のNPUを使用します。
| ファミリー | 概要 | アプリケーションCPU | AIアクセラレーター | ボードの例 |
|---|---|---|---|---|
| Zynq UltraScale+ MPSoC | ZU1からZU19までのサイズがある、1チップ上のArm CPUとFPGAロジック | デュアルコアまたはクアッドコアのArm Cortex-A53 | プログラマブルロジックに組み込まれたDPU | ZCU104、ZCU102、カスタムボード |
| Kria K26システムオンモジュール | Zynq UltraScale+ MPSoCをベースにした、量産対応モジュール | クアッドコアArm Cortex-A53 | プログラマブルロジックに組み込まれたDPU | KV260 Vision AI Starter Kit、KR260 Robotics Starter Kit |
| Versal AI Edge Series | アダプティブSoC。VE2302やVE2802などのAIE-ML搭載製品はNPUを実行します | デュアルコアArm Cortex-A72 | AIE-ML AI EngineとPL上のNPU | VEK280 |
| Versal AI Edge Series Gen 2 | AIE-MLv2 AI Engineを搭載した次世代アダプティブSoC | 最大8基のArm Cortex-A78AE | AIE-MLv2 AI EngineとPL上のNPU | VEK385 |
Zynq UltraScale+ MPSoC#
各Zynq UltraScale+チップは、デュアルコア(CG)またはクアッドコア(EGおよびEV)のCortex-A53コアとリアルタイムCortex-R5Fコアを備えるArmプロセッシングシステムを、FPGAロジックと組み合わせています。EVデバイスには、ハードマクロのH.264/H.265ビデオコーデックが追加されています。ニューラルネットワークを実行するには、カメラや動画パイプラインの隣にDPUをロジックとして組み込みます。小型デバイスでは、DPUが設計内の他の機能とリソースを取り合います。
Kriaシステムオンモジュール#
Kria K26モジュールは、Zynq UltraScale+ MPSoC、メモリー、電源を量産対応モジュールにまとめているため、プロセッサー、メモリー、電源サブシステムを自分で設計する必要がありません。このモジュールは、スターターキットボードまたは独自設計のキャリアカードに接続します。スマートカメラ向けのKV260 Vision AI Starter Kitや、ロボティクス向けのKR260 Robotics Starter Kitに搭載されています。K26はZynq UltraScale+をベースとしているため、同じDPUワークフローを使用します。Kriaの製品ラインには他のモジュールも含まれるため、ワークフローを選ぶ前に、使用するモジュールのプロセッサーを確認してください。
VersalアダプティブSoC#
VersalはAMDのアダプティブSoCファミリーです。AI EdgeシリーズとAI Coreシリーズは、Armコアとプログラマブルロジックに加えてハードマクロのAI Engineを搭載していますが、他のVersalシリーズにはAI Engineが搭載されていません。AMDのNPU IPはAI Engineとプログラマブルロジックを組み合わせて動作します。Vitis AIは、VE2302やVE2802など、AI EdgeシリーズのAIE-ML搭載製品を対象としています。Versal AI Edge Series(VEK280評価キット)とVersal AI Edge Series Gen 2(VEK385評価キット)は、AMDが現在エッジAI向けに提供しているターゲットであり、現行のVitis AIリリースの対象です。
AMD XilinxデバイスでのAI実行方法:DPUとNPUの比較#
AMD XilinxのAIデプロイの多くは、同じパターンに従います。アクセラレーターが対応するレイヤーを実行し、Arm CPUが前処理、後処理、アクセラレーターで実行できないレイヤーを処理します。ボード上のランタイムが両者を連携させます。
AMDは、独自のツールチェーンとコンパイル済みモデルファイルを使用する2世代のアクセラレーターを出荷しています。このガイドでは、DPU向けにVitis AI 3.5、NPU向けにVitis AI 6.3を取り上げます。それ以降のリリースについては、AMDの最新ドキュメントを確認してください。
| ワークフロー | ハードウェア | ツールチェーン | 量子化ツール | コンパイル済み成果物 | ボードランタイム | ステータス |
|---|---|---|---|---|---|---|
| DPU | Zynq UltraScale+、Kria | Vitis AI 3.5(Docker) | vai_q_pytorch | .xmodel | VART | 凍結されたコンパイラー、モデル動物園、DPU IP |
| NPU(Versal AI Edge) | VEK280およびその他のVersal AI Edge製品 | Vitis AI 6.3(Docker) | スナップショットフローに組み込み済み | スナップショット | VART-ML | アクティブ |
| NPU(Versal AI Edge Gen 2) | VEK385およびその他のGen 2製品 | Vitis AI 6.3(Docker) | AMD Quark | .rai | ONNX Runtime Vitis AI EPまたはVART-ML | アクティブ |
Vitis AI 3.5は、DPUコンパイラーとモデル zoo が更新された最後のリリースです。それ以降のXilinx/Vitis-AIリポジトリのリリースでは、ランタイムと新しいAMDツールバージョンとの互換性が更新される一方、コンパイラー、モデル zoo、Zynq UltraScale+ DPU IPは変更されていません(Vitis AI 5.0リリースノートを参照してください)。また、AMDの現行のVitis AIドキュメントでは、非推奨のDPUアーキテクチャの後継としてNPUが説明されています。既存のZynq UltraScale+およびKria製品では引き続きDPUを使用できますが、対応オペレーターは増えないため、新しいモデルアーキテクチャにはYOLOモデルの互換性で説明する調整が必要です。
PC向けAMD Ryzen AIプロセッサーにもNPUが搭載されていますが、このガイドで説明する組み込み向けVitis AIフローではなく、独立したRyzen AI Softwareスタックを使用します。AMD InstinctおよびRadeon GPUについては、AMD GPUの統合を参照してください。
必要なVitis AIフローの選び方#
ボード上のデバイスに応じてフローを選択してください:
AMD Xilinxへのエクスポート:YOLOモデルの変換#
対応タスク#
AMD Xilinxエクスポートは、Ultralyticsの7つすべてのタスクに対応しています。セマンティックセグメンテーションと深度推定は、これらのヘッドを搭載する唯一のファミリーであるYOLO26でのみ利用できます。
インストール#
AMD XilinxエクスポートはLinux(x86-64またはARM64)とPython 3.11~3.13で動作します。これらはAMD Quarkがサポートするバージョンです。初回のエクスポートではQuarkのカスタムオペレーターもコンパイルされるため、g++などのC++コンパイラーが必要です。
# Install the required package for YOLO
pip install ultralytics初回のエクスポート時に、PyPIからAMD Quarkが自動的にインストールされます。エクスポートの依存関係を事前にインストールするには、次のコマンドを実行してください。
pip install "ultralytics[export-xilinx]"リポジトリを編集可能な状態でインストールする場合は、"ultralytics[export-xilinx]"を-e ".[export-base,export-xilinx]"に置き換えてください。Python 3.12環境とCIで使用されるスモークエクスポートを再現するには、リポジトリのルートから既存の環境ビルダーを実行します:
ULTRALYTICS_ISOLATED_VENVS="$PWD/.venvs" python .github/scripts/create-export-env.py --env isolated-xilinx使用方法#
AMD Xilinx形式は、エクスポート、予測、検証モードに対応しています。AMDのVitis AI Execution Providerがない場合、予測と検証では量子化モデルをONNX RuntimeでCPU上で実行し、任意のホストでINT8精度を測定します。Versal AI Edge Series Gen 2ボードなど、ONNX RuntimeからVitisAIExecutionProviderが利用できる場合、Ultralyticsはこれを自動的に選択します。
from ultralytics import YOLO
# YOLO26モデルを読み込みます
model = YOLO("yolo26n.pt")
# # VEK385向けにAMD Xilinx形式へエクスポート(quantize=8は自動的に適用されます)
model.export(format="xilinx") # creates 'yolo26n_xilinx_model/'from ultralytics import YOLO
# # エクスポートしたAMD Xilinxモデルを読み込みます
model = YOLO("yolo26n_xilinx_model")
# 推論を実行
results = model("https://ultralytics.com/images/bus.jpg")from ultralytics import YOLO
# # エクスポートしたAMD Xilinxモデルを読み込みます
model = YOLO("yolo26n_xilinx_model")
# # COCO8データセットでINT8精度を検証します
metrics = model.val(data="coco8.yaml")vitis、vitisai、versal形式名は、xilinxの別名です。
エクスポート引数#
| 引数 | 種類 | デフォルト | 説明 |
|---|---|---|---|
format | str | 'xilinx' | エクスポートモデルのターゲット形式を指定します。AMD Versal AI Edge Series Gen 2 NPUとの互換性を定義します。 |
imgsz | intまたはtuple | 640 | モデル入力の画像サイズを指定します。正方形画像の場合は整数、または(height, width)タプルで指定します。エクスポートモデルのバッチサイズは1に固定されます。 |
quantize | intまたはstr | 8/自動 | 量子化精度を指定します。8(Vitis AI INT8)が必須で、指定されていない場合は自動的に有効になります。 |
data | str | None | INT8キャリブレーションに使用するデータセットYAMLを指定します。分類の場合は、代わりにデータセットディレクトリまたは組み込みデータセット名を指定します。省略すると、Ultralyticsはタスクのキャリブレーションデータセットを使用します。検出の場合は、たとえばcoco128.yamlが使用されます。 |
fraction | float | 1.0 | 使用するキャリブレーションデータセットの割合です。 |
name | str | 've2-xc2ve3858' | Vitis AIコンパイラーのデバイスを指定します。've2-xc2ve3858'(VEK385評価キット)、've2-xc2ve3804'、've2-xc2ve3558'、've2-xc2ve3504'、've2-xc2ve3358'、または've2-xc2ve3304'を指定できます。 |
opset | int | None | 中間グラフのONNX opsetを指定します。デフォルトは17です。AMDがVitis AI上のYOLOで検証しているopsetです。 |
simplify | bool | True | onnxslimを使用して、中間ONNXグラフを簡素化します。 |
device | str | None | エクスポートに使用するデバイスを指定します。GPU(device=0)またはCPU(device=cpu)です。 |
nms=Falseを設定すると、YOLO26のNMSフリーヘッドをエクスポートします。AMDがNonMaxSuppressionをモデル全体のCPU実行を引き起こす可能性のあるオペレーターとして挙げているため、組み込みNMS(nms=True)には対応していません。
INT8精度は、キャリブレーション画像がデプロイ先のシーンをどの程度適切に表しているかによって変わります。独自のカメラで撮影した代表的な画像を300枚以上含むデータセットYAMLをdata=に渡してください。デフォルトのキャリブレーションデータセットは小規模な公開サンプルです。
エクスポートプロセスの詳細については、Ultralyticsのエクスポートに関するドキュメントページをご覧ください。
出力構造#
エクスポートが正常に完了すると、次の構成のモデルディレクトリが作成されます:
yolo26n_xilinx_model/
├── yolo26n.onnx # AMD Quark VINT8 model with the Ultralytics metadata
└── vitisai_config.json # Vitis AI compiler configuration for the target device以下で説明するようにモデルをコンパイルすると、同じディレクトリにyolo26n/コンパイラーキャッシュが追加されます。キャッシュにはyolo26n.rai NPUモデルと、final-vaiml-pass-summary.txtなどのAMDコンパイルレポートが含まれます。
エクスポートの仕組み#
このエクスポートは、AMDが文書化しているVersal AI Edge Series Gen 2向けVitis AIワークフローに従います。
- ONNXエクスポートでは、opset 17と静的バッチサイズ1を使用します。
- AMD Quarkによる量子化では、
VINT8構成(2のべき乗スケールを使用する対称INT8)と、NPUコンパイルにAMDが要求するInt32Bias=False、enable_npu_cnn=True、DedicatedQDQPair=True、QuantizeAllOpTypes=Trueのオプションを使用します。キャリブレーションでは、推論と同じレターボックス処理、RGB、0~1の前処理を行う、標準のUltralytics INT8キャリブレーションローダーを使用します。 - 混合精度:モデルヘッドは浮動小数点のまま維持され、Vitis AIコンパイラーはNPU上でBF16として実行します。ヘッドをINT8に量子化すると精度の大部分が失われます。同じ理由から、AMDのYOLOv8mチュートリアルでは後処理部分をINT8の対象外にしています。
- コンパイラー構成:
vitisai_config.jsonでVAIMLターゲットを選択し、nameからデバイスを指定します。
精度#
この表では、COCO val2017(5,000枚、画像サイズ640)で、エクスポートしたINT8モデルとFP32 ONNXモデルを比較しています。どちらもホストCPU上でONNX Runtimeを使用して実行しています。INT8モデルはデフォルトのcoco128.yamlデータセットでキャリブレーションされています。通常、デプロイ先の独自画像でキャリブレーションすると差が縮まります。
ここに示すホストでの結果は、量子化モデルをONNX RuntimeでCPU上で実行したものです。AMDの精度測定方法では、これをNPU結果の比較基準としています。AMDが公開しているVEK385でのYOLOv8mの結果でも、NPU上で同じ混合精度方式が使用されています。
| YOLOv8mの構成 | ハードウェア | mAP50-95(COCO) |
|---|---|---|
| FP32 ONNX | ホストCPU | 49.95 |
| BF16 | VEK385 NPU | 50.29 |
| VINT8量子化、FP32後段 | ホストCPU | 48.75 |
| BF16後段のVINT8 | VEK385 NPU | 48.38 |
出典:AMDのVersal AI Edge Gen 2向けYOLOv8mチュートリアル。dp_size=1でVARTを100回実行した場合の平均推論時間10.69 msも報告されています。
Versal AI Edge Gen 2でのコンパイルと実行#
エクスポートしたディレクトリは、AMDのVitis AIコンパイラーで処理できる状態です。コンパイラーはNPU上で動作する.raiモデルをビルドします。
-
ホストとボードを準備します。 AMDのVersal AI Edge Gen 2向けVitis AI 6.3 DockerイメージとAMD AI Engineコンパイラーライセンスを使用し、x86-64 Linuxホストでコンパイルします(AMDのライセンスページを参照してください)。AMDのボードセットアップガイドに従ってVEK385をセットアップしてください。
-
コンパイルします。 コンテナー内で、AMDのコンパイルガイドと同じ方法で、Vitis AI Execution Providerを使用するONNX Runtimeセッションを作成します。エクスポートディレクトリに
yolo26n.raiを含むyolo26n/キャッシュが書き込まれます。import onnxruntime as ort d = "yolo26n_xilinx_model" options = {"config_file": f"{d}/vitisai_config.json", "cache_dir": d, "cache_key": "yolo26n", "target": "VAIML"} ort.InferenceSession(f"{d}/yolo26n.onnx", providers=["VitisAIExecutionProvider"], provider_options=[options])yolo26n_xilinx_model/yolo26n/final-vaiml-pass-summary.txtを確認すると、モデルのどの程度がNPU上で実行されるかが分かります。YOLO26nを640で使用する場合、AMD Vitis AI 6.3コンパイラーはVEK385 NPU上の単一パーティションに、オペレーターの99.9%と計算量の99.9%を配置します。 -
ボード上で実行します。 エクスポートディレクトリをVEK385にコピーします。Vitis AI Execution Providerを使用するONNX Runtimeがコンパイル済み
yolo26n.raiを読み込み、NPU上で実行します。YOLO("yolo26n_xilinx_model")は、このプロバイダーが利用可能な場合に自動的に選択します。
コンパイルに必要なのはAMDのONNX Runtimeだけです。そのため、任意のLinuxマシンでエクスポートし、Ultralyticsをインストールしてコンテナー内の固定バージョンのパッケージを変更する代わりに、ディレクトリをコンテナーにコピーできます。ボード上のように、UltralyticsとAMDのonnxruntime-vitisaiビルドが共存する環境では、標準のonnxruntimeに置き換えず、そのビルドを維持します。
このエクスポートではONNX Runtime向けの標準コンパイルを構成します。YOLO26のnms=Falseによるtop-k選択など、NPUに対応していないオペレーターはArm CPU自体で実行されます。AMDのVART-MLランタイムは、すべてのオペレーターがNPU上にある場合にのみモデルを実行します。ただし、AMDのCPUパーティションパスをvitisai_config.jsonに追加できます。これらの成果物はONNX Runtimeでは実行できません。
YOLOモデルの互換性とサポート対象オペレーター#
アクセラレーターが高速化できるのは、ハードウェアで実装されているオペレーターのみです。モデルに未対応のオペレーターが含まれている場合、通常、コンパイラーはネットワークの該当部分をArm CPUに割り当てます。アクセラレーターとCPU間の転送が発生するたびに、レイテンシーが増加します。一部のオペレーターは分割できません。Versal AI Edge Gen 2 NPUでは、AMDが挙げるNonZeroやNonMaxSuppressionなどのオペレーターにより、モデル全体がCPUで実行される場合があります。AMD XilinxハードウェアでYOLOモデルがどの程度の性能を発揮するかを左右する最も重要な要因は、オペレーターのサポート状況です。
この表では、YOLO26モデル内の各オペレーターがどこで実行されるかを示します。標準のYOLO26n ONNXエクスポートには87個のSiLU活性化関数が含まれ、それぞれがSigmoidとMulとしてエクスポートされます。また、2つのアテンションブロック(バックボーン末尾のC2PSAブロック(レイヤー10)と、P5出力を生成するアテンション対応のC3k2ブロック(レイヤー22))に由来するMatMulオペレーターが4個、Softmaxオペレーターが2個含まれます。
| オペレーター | YOLOでの使用箇所 | DPU(Zynq UltraScale+、Kria) | NPU(Versal AI Edge Gen 2) |
|---|---|---|---|
| 畳み込み + バッチ正規化 | 各Convブロック | ✅ | ✅ |
| SiLU活性化関数 | 各Convブロック(デフォルトの活性化関数) | ❌ CPUで実行されます。Hard-Swishに置き換えてください | ✅ |
| Hard-Swish、ReLU、ReLU6、LeakyReLU | モデルYAMLで設定するオプションの活性化関数 | ✅ 畳み込みに融合されます | ✅ |
| Sigmoid | 検出ヘッドのクラススコア | ❌ CPUで実行されます(通常は後処理の一部です) | ✅ |
| 2つの活性化値間のMatMul | アテンションブロック(C2PSA、YOLO26のC3k2) | ❌ CPUで実行されます | ✅ |
| Softmax | アテンションブロック、YOLOv8およびYOLO11のDFL | ❌ CPUで実行されます | ✅ |
| Reshape、Transpose | アテンションブロック | ⚠️ 可能な場合は融合され、それ以外はCPUで実行されます | ✅ |
| Split、Slice | C3k2およびC2fブロック | ⚠️ スライスに変換されます。コンパイラーレポートを確認してください | ✅ |
| Resize(最近傍アップサンプリング) | ネックのアップサンプリング | ✅ | ✅ |
| MaxPool、Concat、Add | SPPFブロックおよび特徴量融合 | ✅ | ✅ |
| TopK、GatherElements | YOLO26のNMSフリーヘッド(nms=False) | ❌ CPUで実行されます | ⚠️ Armホスト上でCPUに分割されます |
| NonMaxSuppression | nms=Trueを指定してエクスポートした場合のみ | ❌ CPUで実行されます | ❌ モデル全体がCPUで実行される可能性があります |
出典: AMDのUG1414サポート対象オペレーター、PyTorchオペレーターのサポート状況、およびVersal AI Edge Gen 2のサポート対象、CPU分割、未対応オペレーターの一覧。サポート状況はDPUの構成やグラフのパターンにも左右されるため、必ずコンパイラーの分割レポートを確認してください。
YOLO26ではDistribution Focal Loss(DFL)が削除されているため、YOLO11やYOLOv8とは異なり、ボックス出力のデコードにSoftmaxは不要です。また、YOLO11と比べてアテンションブロックが1つ追加されているため、モデルを選択する前に、対象デバイス向けのコンパイラーレポートと実機ベンチマークを比較してください。nmsを設定せずにエクスポートすると、one-to-manyヘッドが維持され、他のYOLOモデルと同様にCPUでNMSを実行する必要があります。代わりにnms=Falseを指定してYOLO26のNMSフリーone-to-oneヘッドを使用すると、NMSがCPUで実行される軽量なtop-k選択に置き換わります。
Hard-SwishでYOLO26をDPU対応にする#
DPUが畳み込みに融合できるのは、ReLU、ReLU6、LeakyReLU、Hard-Swish、Hard-Sigmoidのみです。Hard-SwishはSiLUをハードウェア向けに近似したもので、置き換えに適しています。UltralyticsのモデルYAMLファイルでは、activationキーを指定してConvブロックのデフォルトの活性化関数を変更できます(モデルYAML設定ガイド)。
yolo26.yamlをyolo26-hswish.yamlにコピーし、パラメーターの下に1行追加してください:
# Parameters
nc: 80 # number of classes
activation: nn.Hardswish() # default Conv activation, DPU-native
end2end: True # whether to use end-to-end mode次にモデルを構築し、事前学習済みYOLO26の重みを転送して、データセットでファインチューニングしてください:
from ultralytics import YOLO
# # Hard-Swish活性化関数を使用してYOLO26nを構築します。名前の「n」はnanoスケールを指定します
model = YOLO("yolo26n-hswish.yaml").load("yolo26n.pt") # # 事前学習済みの重みを転送します
# # ネットワークがHard-Swishに適応するようファインチューニングします
model.train(data="coco8.yaml", epochs=100, imgsz=640)活性化関数には重みがないため、事前学習済みの重みはすべて転送されます。エクスポート後のONNXグラフには、HardSwishオペレーターが87個含まれ、SiLUは含まれません。coco8.yamlを独自のデータセットに置き換え、デプロイ前にValモードでSiLUモデルとの精度を比較してください。
- 量子化時に置き換える: Vitis AI 3.5 PyTorch量子化ツールのJSON設定で
"convert_silu_to_hswish": trueを指定し、量子化中にSiLUを置き換えます。学習を1回省略できますが、通常は精度が大きく低下します。この低下はAMDの高速ファインチューニングまたはQATで部分的に回復できます。vai_q_pytorch設定ガイドを参照してください。 - LeakyReLU: DPUは負の傾きが26/256(約0.1)に固定されたLeakyReLUを実装します。LeakyReLUを使用する場合は、学習時とデプロイ時の傾きを一致させるため、
activation: nn.LeakyReLU(0.1015625)を指定して学習してください。
DPUでのアテンションブロックの処理#
YOLO26は、最低解像度(入力サイズ640の場合は20×20のグリッド)において、アテンションをレイヤー10のC2PSAブロックと、レイヤー22のアテンション対応C3k2ブロックの2か所に適用します。YOLO11にはC2PSAブロックが1つあります。DPUでは、MatMul演算子とSoftmax演算子がCPUで実行されるため、モデルはDPUとCPUのサブグラフが交互に並ぶ形に分割されます。選択肢は3つあります:
-
CPUブロックを許容する。 コンパイル後の
.xmodelにはCPUサブグラフが含まれるため、すべてのオペレーターにCPU実装がある場合は、AMDのGraph Runnerを使用してDPUとCPUのサブグラフをまとめて実行してください。実装がないオペレーターがある場合は、実装して登録する必要があります。20×20ではアテンション計算は小規模ですが、DPUとCPU間の転送が増えるたびにレイテンシーが増加するため、ボード上で測定してください。 -
アテンションなしのYAMLを使用する。 Hard-SwishのYAMLで、C2PSAレイヤーを
nn.Identityに置き換えて、ConcatとDetectが使用するレイヤーインデックスを維持し、レイヤー22のアテンションを無効にしてください:backbone: # ... layers 0-9 unchanged - [-1, 1, nn.Identity, []] # 10 C2PSA removed; keeps later layer indices valid head: # ... layers 11-21 unchanged - [-1, 1, C3k2, [1024, True, 0.5, False]] # 22 (P5/32-large), attention disabled - [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)エクスポート後のONNXグラフにはMatMulオペレーターもSoftmaxオペレーターも含まれません。アテンションの重みは適用されなくなるため(YOLO26nの重み666個のうち624個が転送されます)、長めにファインチューニングし、Valモードで精度を比較してください。
-
AMD自身のDPUサンプルで使用されているYOLOv8など、アテンションなしのモデルを使用する。
Versal AI Edge Gen 2では、アテンションオペレーターはNPUのサポート対象として記載されているため、通常はこうした変更は不要です。AMDによると、設定やメモリーの制約により、サポート対象オペレーターであってもCPUにフォールバックすることがあるため、コンパイラーレポートで実行場所を確認してください。
モデル互換性の概要#
| モデル | DPU(Zynq UltraScale+、Kria) | NPU(Versal AI Edge Gen 2) |
|---|---|---|
| YOLO26 | Hard-Swishで学習します。アテンションブロック2つがCPUサブグラフになります。DFLはありません | ネイティブのformat="xilinx"エクスポート。ヘッドはBF16で実行されます。 |
| YOLO11 | Hard-Swishで学習します。C2PSAとDFLのSoftmaxがCPUで実行されます | ネイティブのformat="xilinx"エクスポート。ヘッドはBF16で実行されます。 |
| YOLOv8 | Hard-Swishで学習します。DFLのSoftmaxがCPUで実行されます | ネイティブのformat="xilinx"エクスポート。AMDのYOLOv8mチュートリアル(Vitis AI 6.3、VEK385、末尾をBF16とするINT8)では、コンパイラーレポートに1,181個(99.915%)のオペレーターとGOPの99.994%がNPU上に配置されたことが示されています。モデルの変更はありません。 |
その他のAMD Xilinxターゲットへのデプロイ#
Zynq UltraScale+およびKria DPU、第1世代Versal AI Edge NPUでは、format="xilinx"では生成できないVitis AIワークフローを使用します。Ultralyticsでトレーニングした後、AMDのx86-64 Linux Dockerイメージ内のツールでターゲット用の成果物をビルドしてください。使用するデバイスのタブを選択してください。
-
Versal AI Edge用のAMD Vitis AI 6.3 Dockerイメージを起動します。
-
ボード上のNPU IP用に、
settings.shをソースしてNPU環境を有効化します。ボードのNPU IP名を引数として渡すか、LISTを指定すると、利用可能なIPが表示されます。 -
VAISW_SNAPSHOT_DIRECTORY環境変数を設定し、代表的な画像を使って通常の推論スクリプトを実行し、スナップショットを取得します。コードの変更は不要です。# Activate the NPU environment inside the Vitis AI Docker container source $VITIS_AI_REPO/npu_ip/settings.sh # Capture a mixed INT8/BF16 snapshot, calibrating on 100 images from your inference script VAISW_SNAPSHOT_DIRECTORY=snapshot.yolo26n VAISW_FE_PRECISION=MIXED VAISW_QUANTIZATION_NBIMAGES=100 python3 my_inference.py
VAISW_FE_PRECISIONはINT8(デフォルト)、BF16またはMIXEDを受け付けます。また、VAISW_QUANTIZATION_NBIMAGESのデフォルトは4枚の画像なので、検出モデルでは代表的な画像をより多く指定してください。スナップショットはボード上のNPU IPバリアントに紐付けられます。YOLOの後処理部分は、BF16またはMIXED精度の場合にのみAI Engine上で実行されます。AMDのドキュメントではSoftmaxに関する説明が異なります。サンプルページではSoftmaxは高速化されず、YOLOv8のSoftmax後段はCPUに割り当てられると説明していますが、Vitis AI 6.1のリリースノートでは、混合精度でYOLOv8全体を高速化できると報告されています。スナップショット内のwrp_network_iriz.onnxファイルを調べ、YOLO11やYOLO26のattentionを含むモデルの各部分がNPUで実行されることを確認してください。独自モデルの持ち込みを参照してください。
コンパイル対象のアクセラレーター構成と対応するVitis AIランタイムを含むハードウェア設計およびLinuxイメージで、ボードを準備してください。Zynq UltraScale+およびKria DPUターゲットとVersal AI Edge(VEK280)のAMDセットアップガイドを参照してから、ランタイムに必要な成果物をコピーしてください。
| ワークフロー | ボードにコピーする成果物 | ボードランタイム |
|---|---|---|
| DPU(Zynq UltraScale+、Kria) | コンパイル済み.xmodel | VART、CPUサブグラフ用のGraph Runner |
| NPU(Versal AI Edge、VEK280) | スナップショットディレクトリ | VART-ML |
DPUではVARTバッファーに固定小数点INT8値が格納されます。各テンソルの形状とfix_pointスケールを確認し、後処理の前に入力を量子化し、出力を逆量子化してください。Graph Runnerはグラフ全体の出力を返しますが、DPU専用のRunnerは中間DPUサブグラフの出力を返すため、残りの計算はコードで行う必要があります。VEK280上のVART-MLは、デフォルトでハードウェアテンソルビューを使用します。形状、データ型、メモリレイアウトはONNXのレイアウトと異なる場合があります。Runnerの入力および出力テンソル型をCPUビューとして設定するか、ハードウェア形式を独自に変換してください(AMDのVART-MLアーキテクチャ概要を参照してください)。
商用AMD Xilinx製品にUltralytics YOLOを組み込んで出荷するには、AGPL-3.0ライセンスへの準拠、またはUltralytics Enterpriseライセンスの取得が必要です。
実際の用途#
AMD Xilinxデバイスは、ビジョンAIをリアルタイムかつ低消費電力でセンサーの近くで実行する必要がある場面で広く使われています。
- 産業・建設現場の安全:物体検出と物体カウントを使って、重機周辺の人や機械を検出し、作業区域を監視します。
- 自動車・オフハイウェイ向けビジョン:自動車規格に適合した部品上でカメラベースの認識処理を実行し、自動運転車や運転支援を実現します。
- スマートカメラとビデオ分析:映像の取得、エンコード、YOLO推論を1つのチップ上で組み合わせ、セキュリティシステムやビデオ分析に活用します。
- マシンビジョンと品質検査:FPGAベースの高速画像取得とYOLOのインスタンスセグメンテーションまたは分類を組み合わせ、製造ライン上で欠陥を検出します。
- ロボットとドローン:Kria KR260またはVersalモジュールを使用して、姿勢推定、方向付き物体検出、ナビゲーションを決定論的なレイテンシで実行します。
概要#
format="xilinx"でエクスポートすると、AMD QuarkでUltralytics YOLOモデルをVersal AI Edge Series Gen 2 NPU向けに量子化し、ヘッドをBF16のまま維持して、Vitis AIコンパイラー構成をモデルと同じ場所に書き込みます。任意のホストでINT8精度を検証し、AMDのVitis AI Dockerイメージ内で.raiモデルをコンパイルしてから、ONNX RuntimeとVitis AI Execution Providerを使用してボード上で実行してください。
旧型のAMD Xilinxデバイスでは別のワークフローを使用します。Zynq UltraScale+およびKriaのDPUは、凍結されたVitis AI 3.5ツールチェーンと.xmodelファイルを使用し、Hard-SwishなどのDPUネイティブな活性化関数が必要で、AttentionをCPU上で実行します。第1世代Versal AI Edge NPUはスナップショットワークフローを使用します。オペレーターの対応状況はVitis AIのバージョンと精度によって異なります。
その他のデプロイターゲットについては、モデルデプロイオプションガイド、デプロイのベストプラクティス、およびHailo、Rockchip RKNN、Axeleraなどのアクセラレーター統合を参照してください。
よくある質問#
はい。AMDは2022年2月にXilinxの買収を完了し、現在、Xilinx製品はAMDのアダプティブSoCおよびFPGAとして販売されています。製品にはAMD Zynq、AMD Kria、AMD Versal、AMD Vitisがあります。エンジニアの間では今もXilinxという名称が広く使われており、製品番号には
XCの接頭辞が残っています。はい。
model.export(format="xilinx")はAMD QuarkでモデルをVersal AI Edge Series Gen 2 NPU向けに量子化し、量子化済みONNXモデルとVitis AIコンパイラー構成を含むディレクトリを書き込みます。Versal AI Edge Gen 2でのコンパイルと実行に記載されているように、AMDのVitis AIツールで.raiにコンパイルしてください。Zynq UltraScale+、Kria、VEK280ターゲットでは、その他のAMD Xilinxターゲットへのデプロイに記載されているワークフローを使用します。DPU(ディープラーニング処理ユニット)は、AMDの旧世代INT8アクセラレーターです。Zynq UltraScale+およびKriaデバイスのプログラマブルロジックに組み込まれ、Vitis AI 3.5でコンパイルされ、
.xmodelファイルを生成します。現行のVitis AIリリースでは、DPUの後継としてNPUが採用されています。Versal AI Edgeデバイス上のNPUは、強化されたAI Engineとプログラマブルロジックを組み合わせ、INT8、BF16、混合精度をサポートします。また、より多くの演算子に対応し、SiLUやVersal AI Edge Gen 2でのattentionもサポートします。.xmodelは、AMD DPUツールチェーンで使用されるシリアライズ済みXIRグラフです。量子化ツールは量子化済みの.xmodelを書き出し、vai_c_xirコンパイラはこれを、DPU命令ストリーム、量子化されたINT8重み、CPU上で実行する必要があるサブグラフを含むコンパイル済み.xmodelに変換します。コンパイル済みファイルは、arch.jsonフィンガープリントで示される特定のDPU構成を対象とし、Vitis AI Runtime(VART)経由でボード上で実行されます。CPUサブグラフを含む場合は、Graph Runner経由でも実行できます。いいえ。DPUが高速化する活性化関数はReLU、ReLU6、LeakyReLU、Hard-Swish、Hard-Sigmoidのみです。Sigmoid、Softmax、2つの活性化関数の間にあるMatMulはCPU上で実行されます。畳み込みをDPU上に維持するには、モデルYAMLで
activation: nn.Hardswish()を使用してYOLOを学習してください。attentionの選択肢については、DPUでのAttentionブロックの処理を参照してください。Versal AI Edge Gen 2 NPUは、SiLU、Softmax、MatMulをネイティブにサポートしています。KV260はDPUを搭載したZynq UltraScale+ MPSoCを使用するため、DPUのフローに従ってください。Hard-Swishを使うYOLO26モデルを学習し、Vitis AI 3.5 Dockerイメージ内で
vai_q_pytorchを使って量子化します。KV260のarch.jsonを使用してvai_c_xirでコンパイルし、生成された.xmodelをボード上でVART経由で実行します。CPUサブグラフを含む場合はGraph Runnerを使用してください。いいえ。エクスポートはPython 3.11~3.13を使用する任意のLinuxホストで実行でき、AMDアカウントも必要ありません。エクスポートしたモデルは、任意のホストのCPU上で精度を確認できます。
.raiモデルのコンパイルにはAMDのVitis AI DockerイメージとAI Engineコンパイラーライセンスが必要です。NPU上での実行にはVersal AI Edge Series Gen 2ボードが必要です。Ultralyticsは、ONNX RuntimeからVitis AI Execution Providerを利用できる場合にのみ使用します。たとえば、VersalボードやAMD Dockerイメージ上のAMDの
onnxruntime-vitisaiビルドが該当します。それ以外の環境では、標準のONNX Runtimeを使用して量子化モデルをCPU上で実行します。これはデプロイ前にINT8精度を測定する方法です。