Vitis AIを使用したUltralytics YOLO向けAMD Xilinxデプロイ#
AMD XilinxデバイスのネイティブなUltralyticsエクスポート対応は近日予定されています。それまでの間、このガイドではAMD Xilinxのハードウェアとソフトウェアの概要を説明し、ONNXエクスポートまたはPyTorchチェックポイントから始めて、AMDのVitis AIツールでUltralytics YOLO26を現時点でデプロイする方法を紹介します。
AMD Xilinxデバイスは、世界中の多くの産業用カメラ、自動車用ビジョンシステム、ロボット、ドローン、医療画像製品に採用されています。Armプロセッサーとプログラマブルロジックを組み合わせており、新しいデバイスでは専用のAI Engineも備えています。そのため、1つのチップで動画を取り込み、前処理し、物体検出を実行し、低く予測可能な推論レイテンシで結果に応じた処理を行えます。
このガイドでは、各AMD Xilinxデバイスファミリーの概要、デバイス上でのAIの実行方法、各アクセラレーターがサポートするUltralytics YOLOのオペレーター、Zynq UltraScale+、Kria、Versalハードウェアに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が前処理、後処理、アクセラレーターで実行できないレイヤーを処理します。ボード上のランタイムが両者を連携させます。
graph LR
A[Camera / video input]:::start --> B[Arm CPU<br>Linux, preprocessing,<br>post-processing]:::proc
B <--> C[AI accelerator<br>DPU in programmable logic<br>or NPU on AI Engines + PL]:::out
B --> D[Application<br>alerts, control, display]:::start
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef out fill:#9C27B0,color:#fffAMDは、独自のツールチェーンとコンパイル済みモデルファイルを使用する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フローの選び方#
ボード上のデバイスに応じてフローを選択してください:
graph TD
A[Start: which AMD device<br>is on your board?]:::start --> B{Device family?}:::decide
B -->|Zynq UltraScale+ MPSoC<br>or Kria K26| C[DPU flow<br>Vitis AI 3.5]:::proc
B -->|Versal AI Edge<br>VEK280| D[NPU snapshot flow<br>Vitis AI 6.3]:::proc
B -->|Versal AI Edge Gen 2<br>VEK385| E[NPU Quark flow<br>Vitis AI 6.3]:::proc
C --> F[Train YOLO with Hard-Swish<br>then compile to .xmodel]:::out
D --> G[Run your model on calibration<br>images to capture a snapshot]:::out
E --> H[Quantize ONNX with Quark<br>then compile to .rai]:::out
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef decide fill:#FF9800,color:#fff
classDef out fill:#9C27B0,color:#fffYOLOモデルの互換性とサポート対象オペレーター#
アクセラレーターが高速化できるのは、ハードウェアで実装されているオペレーターのみです。モデルに未対応のオペレーターが含まれている場合、通常、コンパイラーはネットワークの該当部分をArm CPUに割り当てます。アクセラレーターとCPU間の転送が発生するたびに、レイテンシーが増加します。一部のオペレーターは分割できません。Versal AI Edge Gen 2 NPUでは、AMDが挙げるNonZeroやNonMaxSuppressionなどのオペレーターにより、モデル全体がCPUで実行される場合があります。AMD XilinxハードウェアでYOLOモデルがどの程度の性能を発揮するかを左右する最も重要な要因は、オペレーターのサポート状況です。
graph LR
subgraph S1 [Stock YOLO26 on the DPU]
A1[Conv]:::out --> A2[SiLU<br>CPU]:::error --> A3[Conv]:::out --> A4[SiLU<br>CPU]:::error --> A5[...]:::proc
end
subgraph S2 [Hard-Swish YOLO26 on the DPU]
B1[Backbone<br>Conv + Hard-Swish<br>DPU]:::out --> B2[C2PSA attention<br>CPU]:::error --> B3[Neck<br>DPU]:::out --> B4[C3k2 attention<br>CPU]:::error --> B5[Detect head<br>DPU]:::out --> B6[Sigmoid and<br>post-processing<br>CPU]:::error
end
classDef proc fill:#2196F3,color:#fff
classDef out fill:#9C27B0,color:#fff
classDef error fill:#F44336,color:#fffこの表では、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はありません | 変更なしで実行できる見込みです。ボード上で検証してください |
| YOLO11 | Hard-Swishで学習します。C2PSAとDFLのSoftmaxがCPUで実行されます | 変更なしで実行できる見込みです。ボード上で検証してください |
| YOLOv8 | Hard-Swishで学習します。DFLのSoftmaxがCPUで実行されます | AMDのYOLOv8mチュートリアル(Vitis AI 6.3、VEK385、BF16テール付きINT8): コンパイラーレポートでは1,181個のオペレーター(99.915%)とGOPの99.994%がNPU上で実行され、モデルの変更は不要です |
AMD XilinxでYOLO26を今すぐデプロイする#
ネイティブエクスポートが利用可能になるまでは、次の4つの手順でデプロイします:
graph LR
A[1. Train or fine-tune<br>Ultralytics YOLO]:::start --> B{Target?}:::decide
B -->|Versal NPU| C[2. Export to ONNX<br>model.export]:::proc
B -->|Zynq or Kria DPU| D[2. Keep the trained<br>PyTorch checkpoint]:::proc
C --> E[3. Quantize and compile<br>Vitis AI 6.3 Docker]:::proc
D --> F[3. Quantize and compile<br>Vitis AI 3.5 Docker]:::proc
E --> G[4. Run on the board<br>VART-ML or ONNX Runtime]:::out
F --> H[4. Run on the board<br>VART]:::out
G -.->|accuracy check| A
H -.->|accuracy check| A
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef decide fill:#FF9800,color:#fff
classDef out fill:#9C27B0,color:#fffステップ1: モデルを学習またはファインチューニングする#
Trainモードを使って独自のデータで学習するか、Ultralytics Platformで学習してください。DPUをターゲットとする場合は、Hard-Swish YAMLから始めてください。後で量子化による精度への影響を測定できるよう、Valモードでベースラインを記録してください。
ステップ2: NPU向けにONNXへエクスポートする#
ONNXは、AMDのNPUフローで共通して入力形式として使用されます。DPUフローでは、学習済みのPyTorchチェックポイントをVitis AI 3.5 Dockerイメージ内で直接量子化するため、DPUユーザーはこの手順を省略できます。バッチサイズを1に固定し、AMDがサポートするopsetを指定してエクスポートしてください。AMDのVersal AI Edge Gen 2向けYOLOv8mチュートリアルではopset 17を使用しています。
from ultralytics import YOLO
# # ステップ1で学習したモデルを読み込みます
model = YOLO("runs/detect/train/weights/best.pt")
# # AMDコンパイラー向けに静的形状でONNXへエクスポートします
model.export(format="onnx", opset=17, imgsz=640) # # 'best.pt'と同じ場所に'best.onnx'を作成しますすべてのオプションについては、ONNX統合とエクスポート引数を参照してください。nmsを設定しない場合は、推論後にCPUでNMSを実行してください。YOLO26では、nms=Falseを指定すると、代わりにNMSフリーヘッドが選択されます。AMDがNonMaxSuppressionをモデル全体のCPU実行を引き起こす可能性のあるオペレーターとして挙げているため、nms=TrueでNMSを組み込まないでください。
AMDのDockerイメージには、Vitis AI Execution Providerを含む独自ビルドのONNX Runtimeが付属しています。Ultralyticsはエクスポート時にONNX Runtimeを確認し、標準パッケージを上書きインストールする場合があります。任意のマシンでエクスポートして.onnxファイルをコンテナーにコピーするか、AMDのDockerイメージ内でUltralyticsを実行する際にYOLO_AUTOINSTALL=falseを設定してください。
ステップ3: Vitis AIで量子化してコンパイルする#
以下のワークフローでは、x86-64 Linuxホスト上でAMDのDockerイメージを使用します。この手順ではボードは不要です。デバイスに対応するタブを選択してください:
- Versal AI Edge Gen 2向けのAMD Vitis AI 6.3 Dockerイメージを起動します。システム要件を参照してください。
- ONNXモデルをINT8に量子化するには、AMD Quarkを
VINT8の設定で使用します。AMDの最小構成では、Int32Bias=False、enable_npu_cnn=True、DedicatedQDQPair=True、QuantizeAllOpTypes=Trueも必要です。Quarkは、自分で作成したデータリーダーを介してキャリブレーションデータを読み込むため、データセット内の代表的な画像に対して、推論時と同じ前処理(エクスポートサイズに合わせたレターボックスリサイズ、RGBチャンネル順、0–1へのスケーリング、NCHWレイアウト)を適用してください。 - 後処理サブグラフは量子化から除外してください。AMDのYOLOv8mチュートリアルでは、量子化すると検出漏れが発生すると警告しています。このYOLOv8mの例では、コンパイラは後段をNPU上でBF16実行します。YOLO26のtop-k選択など、サポートされていない後段の演算子は引き続きCPUで実行されます。
- コンパイル前にボードのランタイムを選択してください。 標準コンパイルはONNX Runtimeで動作し、YOLO26のtop-k選択など、NPU非対応の演算子をCPU上で実行します。また、すべての演算子がNPU上で実行される場合に限り、VART-MLでも動作します。CPU演算子を含むモデルをVART-MLで実行するには、AMDのCPUパーティションパスを
vitisai_config.jsonに追加してください。これらの成果物はONNX Runtimeでは実行できません。 - コンパイルするには、
VitisAIExecutionProviderと、対象デバイスを指定するvitisai_config.jsonを使用してONNX Runtimeセッションを作成します。コンパイルすると、キャッシュディレクトリに.raiファイルが生成されます。モデルのコンパイルを参照してください。
量子化をスキップするには、FP32 ONNXモデルを直接コンパイルすると、コンパイラがBF16に変換します。コンパイルにはAMD AI Engineコンパイラのライセンスが必要です。AMDのライセンスページを参照してください。
ステップ4:ボード上で実行して検証する#
まずボードを準備します。コンパイル対象のアクセラレータ構成と、対応するVitis AIランタイムを含むハードウェア設計およびLinuxイメージを実行している必要があります。AMDのセットアップガイドで、Zynq UltraScale+およびKriaのDPUターゲット、Versal AI Edge(VEK280)、Versal AI Edge Gen 2(VEK385)を参照してください。
次に、ランタイムに必要な成果物をコピーします。
| ワークフロー | ボードにコピーする成果物 | ボードランタイム |
|---|---|---|
| DPU(Zynq UltraScale+、Kria) | コンパイル済み.xmodel | VART、CPUサブグラフ用のGraph Runner |
| NPU(Versal AI Edge、VEK280) | スナップショットディレクトリ | VART-ML |
| NPU(Versal AI Edge Gen 2)、ORT | コンパイルに使用したFP32または量子化済みONNXモデル、vitisai_config.json、コンパイル済みキャッシュディレクトリ | Vitis AI EPを使用するONNX Runtime |
| NPU(Versal AI Edge Gen 2)、VART-ML | .raiファイル(いずれかの演算子がCPU上で実行される場合はCPUパーティションパスを含む)と、VART-MLランナーの設定 | VART-ML |
NPUの各フローでは、エクスポートされたONNXグラフですでにボックスをデコードし、クラススコアにsigmoidを適用するため、ホスト側では出力を解釈するだけです。
nmsが未設定の場合:検出モデルは、xywh個のボックスとクラスごとのスコアを含む(1, 4 + nc, anchors)テンソルを出力します。アンカーごとに最も高いクラスを選択し、ボックスをコーナー座標に変換し、信頼度でフィルタリングしてNMSを実行します。Ultralyticsのnon_max_suppression関数は、これらすべての処理を実行します。nms=False(YOLO26):モデルは[x1, y1, x2, y2, score, class]行を含む(1, max_det, 6)テンソルを出力し、必要なのは信頼度のしきい値処理だけです。
どちらの場合も、レターボックス処理された入力から元の画像に合わせてボックスを再スケーリングします。デコード手順より前で分割されたグラフのみ、ホスト側でボックスのデコードが必要です。DPUでは、VARTバッファーに固定小数点のINT8値が格納されます。各テンソルの形状とfix_pointスケールを取得し、上記の処理を行う前に入力を量子化し、出力を逆量子化してください。Graph Runnerはグラフ全体の出力を返しますが、DPU専用ランナーはDPUサブグラフの中間出力を返すため、残りの計算はコード側で行う必要があります。上記のレイアウトはONNX(CPUビュー)のレイアウトです。VART-MLはデフォルトで、形状、データ型、メモリレイアウトが異なる場合があるハードウェアテンソルビューを使用します。そのため、ランナーの入出力テンソル型をCPUビューに設定するか、ハードウェア形式を独自に変換してください(AMDのVART-MLアーキテクチャ概要を参照)。
独自の検証セットと、パフォーマンス指標(mAPなど)を使用して、デバイス上の精度をステップ1のFP32ベースラインと比較します。AMDが公開しているVEK385上のYOLOv8mの結果は、INT8デプロイによる精度への影響を示しています。
| 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も報告されています。
商用AMD Xilinx製品にUltralytics YOLOを組み込んで出荷するには、AGPL-3.0ライセンスへの準拠、またはUltralytics Enterpriseライセンスの取得が必要です。
実際の用途#
AMD Xilinxデバイスは、ビジョンAIをリアルタイムかつ低消費電力でセンサーの近くで実行する必要がある場面で広く使われています。
- 産業・建設現場の安全:物体検出と物体カウントを使って、重機周辺の人や機械を検出し、作業区域を監視します。
- 自動車・オフハイウェイ向けビジョン:自動車規格に適合した部品上でカメラベースの認識処理を実行し、自動運転車や運転支援を実現します。
- スマートカメラとビデオ分析:映像の取得、エンコード、YOLO推論を1つのチップ上で組み合わせ、セキュリティシステムやビデオ分析に活用します。
- マシンビジョンと品質検査:FPGAベースの高速画像取得とYOLOのインスタンスセグメンテーションまたは分類を組み合わせ、製造ライン上で欠陥を検出します。
- ロボットとドローン:Kria KR260またはVersalモジュールを使用して、姿勢推定、方向付き物体検出、ナビゲーションを決定論的なレイテンシで実行します。
概要#
AMD Xilinxデバイスでは、2世代のアクセラレーターを使用してYOLOモデルを実行します。Zynq UltraScale+およびKria上のDPUは、固定されたVitis AI 3.5フローを使用し、.xmodelファイルを生成します。Hard-SwishなどのDPUネイティブ活性化関数が必要で、attentionはCPU上で実行されます。Versal AI EdgeおよびVersal AI Edge Gen 2上のNPUは、現行のVitis AIリリースを使用します。Gen 2 NPUはSiLUとattention演算子をサポートし、AMDのYOLOv8mの例をVEK385上でほぼすべてNPU上で実行します。一方、旧世代のVEK280 NPUでの演算子サポートは、Vitis AIのバージョンと精度に依存します。
AMD Xilinxデバイス向けのUltralyticsネイティブエクスポートは、近日対応予定です。それまでは、Ultralyticsで学習し、Versal NPUターゲット向けにONNXにエクスポートするか、DPUターゲット向けにPyTorchチェックポイントを保持して、上記の説明に従ってVitis AIでコンパイルしてください。その他のデプロイ先については、モデルデプロイオプションガイド、デプロイのベストプラクティス、およびHailo、Rockchip RKNN、Axeleraなどのアクセラレーター連携を参照してください。
よくある質問#
はい。AMDは2022年2月にXilinxの買収を完了し、現在、Xilinx製品はAMDのアダプティブSoCおよびFPGAとして販売されています。製品にはAMD Zynq、AMD Kria、AMD Versal、AMD Vitisがあります。エンジニアの間では今もXilinxという名称が広く使われており、製品番号には
XCの接頭辞が残っています。まだできません。AMD Xilinxデバイス向けのUltralyticsネイティブエクスポートは、近日対応予定です。現時点では、Versal NPUターゲット向けに
model.export(format="onnx")を使ってONNXにエクスポートするか、Zynq UltraScale+およびKria DPUターゲット向けにvai_q_pytorchで学習済みPyTorchチェックポイントを量子化してから、今すぐAMD XilinxにYOLO26をデプロイするの説明に従ってAMDのVitis AIツールでコンパイルしてください。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を使用してください。いいえ。量子化とコンパイルは、x86-64 Linuxホスト上のAMD Vitis AI Dockerイメージで実行できます。ボードが必要なのは、コンパイル済みモデルを実行し、デバイス上のレイテンシと精度を測定するときだけです。