Развертывание AMD Xilinx для Ultralytics YOLO с помощью Vitis AI#
Поддержка нативного экспорта Ultralytics для устройств AMD Xilinx появится в ближайшее время. А пока в этом руководстве описаны аппаратные и программные решения AMD Xilinx и показано, как уже сейчас развернуть Ultralytics YOLO26 с помощью инструментов AMD Vitis AI, используя экспорт ONNX или контрольную точку PyTorch.
Устройства AMD Xilinx используются во многих промышленных камерах, системах технического зрения для автомобилей, роботах, дронах и медицинском оборудовании по всему миру. Они объединяют процессоры Arm с программируемой логикой, а в новых устройствах — и специализированные AI Engines. Благодаря этому один чип может захватывать видео, предварительно обрабатывать его, выполнять детекцию объектов и реагировать на результат с низкой и предсказуемой задержкой инференса.
В этом руководстве рассказывается о семействах устройств AMD Xilinx, работе AI на этих устройствах, операторах Ultralytics YOLO, поддерживаемых каждым ускорителем, и пошаговом процессе развертывания моделей YOLO на оборудовании Zynq UltraScale+, Kria и Versal.
Что такое AMD Xilinx?#
В 1980-х годах Xilinx изобрела программируемую пользователем вентильную матрицу (FPGA) и стала ведущим поставщиком адаптивных SoC и FPGA. AMD завершила приобретение Xilinx в феврале 2022 года, и теперь эти линейки продуктов продаются под брендом 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) | Логическая матрица FPGA внутри SoC AMD Xilinx. В устройствах Zynq и Kria AI-ускоритель реализован в PL. |
| Система обработки (PS) | Аппаратные ядра CPU Arm, контроллеры памяти и периферийные устройства SoC. На PS работают Linux, приложение и любые слои модели, которые не может выполнить ускоритель. |
| Адаптивная SoC / MPSoC | Система на кристалле, объединяющая систему обработки с программируемой логикой, а во многих устройствах Versal — и с AI Engines. MPSoC означает многопроцессорную систему на кристалле. |
| AI Engine (AIE, AIE-ML, AIE-MLv2) | Массивы специализированных векторных процессоров во многих устройствах Versal, включая рассматриваемую здесь серию Versal AI Edge. Они предназначены для машинного обучения и обработки сигналов. |
| DPU | Блок обработки глубокого обучения: INT8-ускоритель нейронных сетей AMD, поставляемый в виде IP-блока и встраиваемый в PL (например, DPUCZDX8G в Zynq UltraScale+ и Kria). Размеры от B512 до B4096 указывают пиковое число операций за такт. |
| NPU / IP-блок NPU | Нейронный процессор: ускоритель инференса текущего поколения от AMD, который в последних версиях Vitis AI заменяет DPU. AMD описывает IP-блок NPU как программный ускоритель, объединяющий AI Engines с программируемой логикой, поэтому для него также необходим соответствующий проект оборудования. См. словарную статью о NPU. |
| Vitis AI | Набор инструментов AMD для развертывания нейронных сетей на устройствах AMD Xilinx. Он включает квантование, компиляцию, среды выполнения, примеры и среды Docker. |
| AMD Quark | Текущая библиотека AMD для квантования моделей, используемая в процессе для Versal AI Edge Gen 2, чтобы преобразовать модель ONNX FP32 в модель INT8. |
| Квантование, PTQ и QAT | Преобразование весов и активаций FP32 в INT8. При посттренировочном квантовании (PTQ) используются калибровочные изображения. Квантование с учетом обучения (QAT) дообучает модель, чтобы восстановить точность. |
| Калибровочные изображения | Небольшой репрезентативный набор изображений, пропускаемых через модель при PTQ, чтобы выбрать масштаб INT8 для каждого тензора. |
| BF16 и смешанная точность | BFloat16 — это 16-битный формат чисел с плавающей запятой, сохраняющий диапазон FP32. При смешанной точности большая часть сети работает в INT8, а чувствительные слои — в BF16. |
| XIR | Промежуточное представление Xilinx: формат графа, который создает компилятор DPU и считывает среда выполнения. |
.xmodel | Сериализованный граф XIR. Квантователь записывает квантованный .xmodel, а компилятор DPU преобразует его в скомпилированный .xmodel с инструкциями DPU, квантованными весами и подграфами CPU. Для скомпилированной модели требуется соответствующая конфигурация DPU. |
arch.json / отпечаток DPU | Файл с описанием конкретной конфигурации DPU. Он нужен компилятору DPU; скомпилированный .xmodel для одного отпечатка не будет работать с другим. |
| Снимок | Каталог скомпилированной модели, созданный в процессе работы NPU на Versal AI Edge (VEK280). Он привязан к конкретному варианту IP-блока NPU. |
.rai | Файл скомпилированной модели, созданный в процессе работы NPU на Versal AI Edge Gen 2. |
| VART / VART-ML | Библиотеки среды выполнения Vitis AI, которые загружают скомпилированные модели и запускают их на плате; доступны API для C++ и Python. |
| Провайдер выполнения ONNX Runtime Vitis AI EP | VitisAIExecutionProvider для ONNX Runtime, который компилирует и запускает модели ONNX на NPU AMD. |
| Резервный запуск на CPU / разбиение графа | Если ускоритель не может выполнить оператор, компилятор обычно делит модель на подграфы ускорителя и CPU. Каждое такое разделение добавляет передачу данных, которая может существенно увеличить задержку. Некоторые операторы вместо этого принудительно переносят всю модель на CPU или приводят к ошибке компиляции. |
Семейства устройств AMD Xilinx для периферийного AI#
Устройства AMD Xilinx для периферийного AI относятся к трем семействам. В Zynq и Kria используется DPU в программируемой логике, а в рассматриваемых здесь устройствах Versal AI Edge — NPU на базе AI Engines.
| Семейство | Описание | Прикладной CPU | AI-ускоритель | Примеры плат |
|---|---|---|---|---|
| Zynq UltraScale+ MPSoC | Arm CPU и логика FPGA на одном чипе; варианты от ZU1 до ZU19 | Двухъядерный или четырехъядерный Arm Cortex-A53 | DPU, встроенный в программируемую логику | ZCU104, ZCU102, заказные платы |
| Системный модуль Kria K26 | Готовый к серийному производству модуль на базе Zynq UltraScale+ MPSoC | Четырехъядерный Arm Cortex-A53 | DPU, встроенный в программируемую логику | Комплект для разработки KV260 Vision AI, комплект для разработки робототехники KR260 |
| Серия Versal AI Edge | Адаптивные SoC; модели AIE-ML, например VE2302 и VE2802, работают с NPU | Двухъядерный Arm Cortex-A72 | NPU на базе AI Engines AIE-ML и PL | VEK280 |
| Серия Versal AI Edge Gen 2 | Адаптивная SoC нового поколения с AI Engines AIE-MLv2 | До восьми ядер Arm Cortex-A78AE | NPU на базе AI Engines AIE-MLv2 и PL | VEK385 |
Zynq UltraScale+ MPSoC#
Каждый чип Zynq UltraScale+ объединяет систему обработки Arm с FPGA-логикой. Система обработки включает двухъядерные (CG) или четырехъядерные (EG и EV) ядра Cortex-A53 и ядра реального времени Cortex-R5F. Устройства EV дополнены аппаратным видеокодеком H.264/H.265. Чтобы запускать нейронные сети, разработчики встраивают DPU в логику рядом с конвейерами обработки изображения и видео. В небольших устройствах DPU конкурирует за ресурсы с остальными компонентами проекта.
Системные модули Kria#
Модуль Kria K26 объединяет Zynq UltraScale+ MPSoC, память и систему питания в готовом к серийному производству модуле, поэтому тебе не придется самостоятельно проектировать процессор, память и подсистему питания. Модуль устанавливается на несущую плату — плату из стартового комплекта или собственную разработку. Он используется в комплекте для разработки KV260 Vision AI для интеллектуальных камер и комплекте для разработки робототехники KR260 для робототехники. Поскольку K26 построен на базе Zynq UltraScale+, для него используется тот же процесс работы с DPU. В линейку Kria входят и другие модули, поэтому перед выбором процесса проверь, какой процессор установлен в твоем модуле.
Адаптивные SoC Versal#
Versal — семейство адаптивных SoC от AMD. Серии AI Edge и AI Core дополнены специализированными AI Engines, расположенными рядом с ядрами Arm и программируемой логикой; в некоторых других сериях Versal AI Engines нет. IP-блок NPU от AMD одновременно работает с AI Engines и программируемой логикой, а Vitis AI предназначен для компонентов AIE-ML серии AI Edge, например VE2302 и VE2802. Серия Versal AI Edge (оценочный комплект VEK280) и серия Versal AI Edge Gen 2 (оценочный комплект VEK385) — это текущие платформы AMD для периферийного AI, на которых сосредоточены последние версии Vitis AI.
Как работает AI на устройствах AMD Xilinx: DPU и NPU#
Большинство решений AMD Xilinx для AI работают по одной схеме. Ускоритель выполняет поддерживаемые слои, CPU Arm отвечает за предварительную обработку, постобработку и любые слои, которые ускоритель выполнить не может, а среда выполнения на плате координирует их работу.
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 выпустила два поколения ускорителей, каждое со своим набором инструментов и форматом файла скомпилированной модели. В этом руководстве описаны Vitis AI 3.5 для DPU и Vitis AI 6.3 для NPU; для более поздних версий проверяй актуальную документацию AMD.
| Процесс | Оборудование | Набор инструментов | Квантователь | Скомпилированный артефакт | Среда выполнения на плате | Статус |
|---|---|---|---|---|---|---|
| DPU | Zynq UltraScale+, Kria | Vitis AI 3.5 (Docker) | vai_q_pytorch | .xmodel | VART | Замороженные компилятор, зоопарк моделей и IP-блок DPU |
| 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 и зоопарка моделей. В более поздних выпусках репозитория Xilinx/Vitis-AI компилятор, зоопарк моделей и IP-ядро DPU для Zynq UltraScale+ остаются без изменений, а среда выполнения и совместимость с более новыми версиями инструментов AMD обновляются (см. примечания к выпуску Vitis AI 5.0); в актуальной документации AMD по Vitis AI NPU описывается как замена устаревшей архитектуры DPU. Продукты Zynq UltraScale+ и Kria можно и дальше выпускать с DPU, но поддержка операторов для неё расширяться не будет, поэтому для новых архитектур моделей потребуются адаптации, описанные в разделе Совместимость моделей YOLO.
Процессоры AMD Ryzen AI в ПК также оснащены NPU, но в них используется отдельный стек Ryzen AI Software, а не встроенные потоки Vitis AI, описанные в этом руководстве. Информацию о GPU AMD Instinct и Radeon см. в разделе Интеграция с GPU AMD.
Какой поток 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:#fffСовместимость моделей YOLO и поддерживаемые операторы#
Ускоритель выполняет быстрее только те операторы, которые реализованы в его аппаратной части. Если модель содержит неподдерживаемый оператор, компилятор обычно передаёт эту часть сети Arm CPU, а каждый переход между ускорителем и CPU увеличивает задержку. Некоторые операторы невозможно разделить: на NPU Versal AI Edge Gen 2 AMD указывает такие операторы, как NonZero и NonMaxSuppression, которые могут заставить выполнять всю модель на CPU. Поддержка операторов — важнейший фактор производительности модели YOLO на оборудовании AMD Xilinx.
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, а также 4 оператора MatMul и 2 оператора Softmax из двух блоков внимания: блока C2PSA в конце базовой сети (слой 10) и блока C3k2 с механизмом внимания, формирующего выход P5 (слой 22).
| Оператор | Где встречается в 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 (обычно в составе постобработки) | ✅ |
| MatMul между двумя активациями | Блоки внимания (C2PSA; C3k2 в YOLO26) | ❌ Выполняется на CPU | ✅ |
| Softmax | Блоки внимания; DFL в YOLOv8 и YOLO11 | ❌ Выполняется на CPU | ✅ |
| Reshape, Transpose | Блоки внимания | ⚠️ Объединяется, если возможно; иначе выполняется на CPU | ✅ |
| Split, Slice | Блоки C3k2 и C2f | ⚠️ Преобразуется в срезы; проверь отчёт компилятора | ✅ |
| Resize (увеличение ближайшим соседом) | Увеличение разрешения в шейке | ✅ | ✅ |
| MaxPool, Concat, Add | Блок SPPF и объединение признаков | ✅ | ✅ |
| TopK, GatherElements | Голова YOLO26 без NMS (nms=False) | ❌ Выполняется на CPU | ⚠️ Раздел CPU на хосте Arm |
| NonMaxSuppression | Только при экспорте с nms=True | ❌ Выполняется на CPU | ❌ Может заставить выполнять модель на CPU |
Источники: списки поддерживаемых операторов AMD UG1414, поддержка операторов PyTorch, а также списки поддерживаемых, выполняемых на CPU и неподдерживаемых операторов для Versal AI Edge Gen 2. Поддержка также зависит от конфигурации DPU и структуры графа, поэтому всегда проверяй отчёт компилятора о разделении модели.
YOLO26 не использует Distribution Focal Loss (DFL), поэтому, в отличие от YOLO11 и YOLOv8, для декодирования выходов координат рамок не нужен softmax. В YOLO26 также добавлен второй блок внимания по сравнению с YOLO11, поэтому перед выбором модели сравни отчёты компилятора и результаты тестирования непосредственно на целевом устройстве. Если nms не задан, экспорт сохраняет голову one-to-many, и для неё, как и для других моделей YOLO, требуется NMS на CPU. Чтобы вместо этого использовать голову YOLO26 one-to-one без NMS, выполни экспорт с nms=False: она заменяет NMS лёгким отбором top-k, который выполняется на CPU.
Подготовь YOLO26 к работе на DPU с Hard-Swish#
DPU объединяет со свёртками только ReLU, ReLU6, LeakyReLU, Hard-Swish и Hard-Sigmoid. Hard-Swish — аппаратно-эффективное приближение SiLU, поэтому это естественная замена. В YAML-файлах моделей Ultralytics можно задать ключ activation, чтобы изменить активацию по умолчанию для блоков Conv (руководство по настройке YAML модели).
Скопируй yolo26.yaml в yolo26-hswish.yaml и добавь одну строку в раздел параметров:
# 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
# Собери YOLO26n с активациями Hard-Swish; «n» в названии обозначает размер nano
model = YOLO("yolo26n-hswish.yaml").load("yolo26n.pt") # перенеси предобученные веса
# Дообучи модель, чтобы сеть адаптировалась к Hard-Swish
model.train(data="coco8.yaml", epochs=100, imgsz=640)У активаций нет весов, поэтому переносятся все предобученные веса. В экспортированном графе ONNX будет 87 операторов HardSwish и ни одного SiLU. Замени coco8.yaml на собственный набор данных и перед развёртыванием сравни точность с моделью SiLU в режиме Val.
- Замена на этапе квантования: задай
"convert_silu_to_hswish": trueв JSON-конфигурации квантователя PyTorch из Vitis AI 3.5, чтобы заменить SiLU во время квантования. Это избавляет от цикла обучения, но обычно снижает точность сильнее; частично восстановить её можно с помощью быстрого дообучения AMD или QAT. См. руководство по настройке vai_q_pytorch. - LeakyReLU: DPU реализует LeakyReLU с фиксированным отрицательным наклоном 26/256 (около 0.1). Если используешь LeakyReLU, обучай модель с
activation: nn.LeakyReLU(0.1015625), чтобы наклоны при обучении и развёртывании совпадали.
Обработка блоков внимания на DPU#
YOLO26 применяет механизм внимания в двух местах с самым низким разрешением (сетка 20×20 при входном размере 640): в блоке C2PSA на слое 10 и блоке C3k2 с механизмом внимания на слое 22. В YOLO11 есть один блок C2PSA. На DPU операторы MatMul и Softmax выполняются на CPU, разделяя модель на чередующиеся подграфы DPU и CPU. Есть три варианта:
-
Оставить блоки на CPU. В скомпилированной модели
.xmodelбудут подграфы CPU, поэтому запускай её с помощью Graph Runner от AMD. Он совместно выполняет подграфы DPU и CPU, если для каждого оператора есть реализация для CPU; в противном случае нужно самостоятельно реализовать и зарегистрировать недостающие операторы. При разрешении 20×20 вычисления внимания невелики, но каждый дополнительный переход между DPU и CPU увеличивает задержку, поэтому измерь её на своей плате. -
Использовать YAML без механизма внимания. В YAML-файле с Hard-Swish замени слой 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. Веса механизма внимания больше не подойдут (переносятся 624 из 666 весов YOLO26n), поэтому выполни больше итераций дообучения и сравни точность в режиме Val.
-
Использовать модель без механизма внимания, например YOLOv8, которую AMD использовала в собственных примерах для DPU.
На Versal AI Edge Gen 2 операторы внимания указаны как поддерживаемые NPU, поэтому обычно вносить эти изменения не нужно. Проверь размещение операторов в отчёте компилятора: AMD отмечает, что даже поддерживаемые операторы могут выполняться на CPU из-за ограничений конфигурации или памяти.
Краткий обзор совместимости моделей#
| Модель | DPU (Zynq UltraScale+, Kria) | NPU (Versal AI Edge Gen 2) |
|---|---|---|
| YOLO26 | Обучай с Hard-Swish; два блока внимания становятся подграфами CPU; DFL отсутствует | Ожидается работа без изменений; проверь на своей плате |
| YOLO11 | Обучай с Hard-Swish; C2PSA и softmax DFL выполняются на CPU | Ожидается работа без изменений; проверь на своей плате |
| YOLOv8 | Обучай с Hard-Swish; softmax DFL выполняется на CPU | Руководство AMD по YOLOv8m (Vitis AI 6.3, VEK385, INT8 с завершающим слоем BF16): согласно отчёту компилятора, на NPU выполняются 1 181 оператор (99,915%) и 99,994% GOP; изменений модели не требуется |
Разверни YOLO26 на AMD Xilinx уже сегодня#
Пока нативный экспорт недоступен, развёртывание состоит из четырёх шагов:
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. Для целей DPU начни с YAML-файла Hard-Swish. Зафиксируй исходный результат с помощью режима Val, чтобы позднее измерить влияние квантования на точность.
Шаг 2. Экспортируй модель в ONNX для целей NPU#
ONNX — стандартный входной формат для потоков NPU от AMD. Поток DPU напрямую квантует обученный чекпойнт PyTorch в Docker-образе Vitis AI 3.5, поэтому пользователи DPU могут пропустить этот шаг. Выполни экспорт с фиксированным размером пакета 1 и версией opset, поддерживаемой AMD; в руководстве AMD по YOLOv8m для Versal AI Edge Gen 2 используется opset 17.
from ultralytics import YOLO
# Загрузи модель, обученную на шаге 1
model = YOLO("runs/detect/train/weights/best.pt")
# Экспортируй в ONNX со статической формой для компилятора AMD
model.export(format="onnx", opset=17, imgsz=640) # создаёт файл 'best.onnx' рядом с 'best.pt'Все параметры см. в разделах интеграция ONNX и аргументы экспорта. Если nms не задан, выполняй NMS на CPU после инференса; для YOLO26 параметр nms=False выбирает вместо этого голову без NMS. Не встраивай NMS с помощью nms=True: AMD указывает NonMaxSuppression среди операторов, которые могут заставить выполнять всю модель на CPU.
В Docker-образах AMD поставляется собственная сборка ONNX Runtime с Vitis AI Execution Provider. Во время экспорта Ultralytics проверяет наличие ONNX Runtime и может заменить установленный пакет стандартным. Выполни экспорт на любой машине и скопируй файл .onnx в контейнер или задай YOLO_AUTOINSTALL=false, если запускаешь Ultralytics в Docker-образе AMD.
Шаг 3. Квантование и компиляция с помощью Vitis AI#
В описанных ниже процессах используются Docker-образы AMD на хосте Linux x86-64. На этом шаге плата не нужна. Выбери вкладку для своего устройства:
- Запусти Docker-образ AMD Vitis AI 6.3 для Versal AI Edge Gen 2. См. системные требования.
- Квантуй модель ONNX до INT8 с помощью AMD Quark, используя конфигурацию
VINT8. В минимальной конфигурации AMD также требуютсяInt32Bias=False,enable_npu_cnn=True,DedicatedQDQPair=TrueиQuantizeAllOpTypes=True. Quark получает данные для калибровки через написанный тобой считыватель данных, поэтому используй ту же предобработку, что и при инференсе: изменение размера с letterbox до размера экспорта, порядок каналов RGB, масштабирование в диапазон 0–1 и формат NCHW; используй репрезентативные изображения из своего набора данных. - Исключи подграф постобработки из квантования. В руководстве AMD по YOLOv8m предупреждают, что его квантование приводит к пропуску обнаруженных объектов. В этом примере с YOLOv8m компилятор затем выполняет конечную часть модели на NPU в BF16; неподдерживаемые операторы этой части, например выбор top-k в YOLO26, по-прежнему выполняются на CPU.
- Выбери среду выполнения для платы до компиляции. Стандартная компиляция работает с ONNX Runtime, который выполняет несовместимые с NPU операторы, например выбор top-k в YOLO26, непосредственно на CPU, а также с VART-ML, только если каждый оператор выполняется на NPU. Чтобы запустить модель с операторами на CPU через VART-ML, добавь проходы разбиения на CPU от AMD в
vitisai_config.json. Эти артефакты нельзя запускать через ONNX Runtime. - Скомпилируй модель, создав сессию ONNX Runtime с
VitisAIExecutionProviderиvitisai_config.json, в котором указано целевое устройство. При компиляции в каталоге кэша создаётся файл.rai. См. компиляцию модели.
Чтобы пропустить квантование, скомпилируй модель ONNX в FP32 напрямую — компилятор преобразует её в BF16. Для компиляции требуется лицензия на компилятор AMD AI Engine; см. страницу лицензирования AMD.
Шаг 4. Запуск и проверка на плате#
Сначала подготовь плату. На ней должны быть установлены аппаратная конфигурация и образ Linux, содержащие конфигурацию ускорителя, для которой ты выполнял компиляцию, а также соответствующая среда выполнения Vitis AI. См. руководства AMD по настройке целевых устройств Zynq UltraScale+ и Kria с DPU, Versal AI Edge (VEK280) и Versal AI Edge Gen 2 (VEK385).
Затем скопируй на плату артефакты, необходимые среде выполнения:
| Процесс | Артефакты для копирования на плату | Среда выполнения на плате |
|---|---|---|
| DPU (Zynq UltraScale+, Kria) | Скомпилированный .xmodel | VART; Graph Runner для подграфов на CPU |
| NPU (Versal AI Edge, VEK280) | Каталог снимка | VART-ML |
| NPU (Versal AI Edge Gen 2), ORT | Модель ONNX в FP32 или квантованная модель ONNX, использованная для компиляции, vitisai_config.json и каталог скомпилированного кэша | ONNX Runtime с Vitis AI EP |
| NPU (Versal AI Edge Gen 2), VART-ML | Файл .rai (с проходами разбиения на CPU, если какой-либо оператор выполняется на CPU) и конфигурация запуска VART-ML | VART-ML |
В потоках обработки для NPU в экспортированном графе ONNX уже декодируются рамки и применяется сигмоида к оценкам классов, поэтому на хосте нужно только интерпретировать выходные данные:
nmsне задана: модели обнаружения выдают тензор(1, 4 + nc, anchors)сxywhрамками и оценками для каждого класса. Выбери лучший класс для каждого якоря, преобразуй рамки в координаты углов, отфильтруй их по порогу уверенности и выполни NMS; функция Ultralyticsnon_max_suppressionвыполняет все эти действия.nms=False(YOLO26): модель выдаёт тензор(1, max_det, 6)с[x1, y1, x2, y2, score, class]строками, для обработки которого нужен только порог уверенности.
В обоих случаях измени масштаб рамок с входного изображения, дополненного полями, на исходное изображение. Декодировать рамки на хосте нужно только для графов, обрезанных до этапа декодирования. На DPU буферы VART содержат значения INT8 с фиксированной точкой: запроси форму каждого тензора и масштаб fix_point, квантуй входные данные и деквантуй выходные, прежде чем выполнять описанные выше действия. Graph Runner возвращает выходы всего графа, тогда как средство запуска только для DPU возвращает промежуточные выходы подграфов DPU, дальнейшую обработку которых должен выполнить твой код. Указанные выше форматы соответствуют ONNX (представлению CPU): VART-ML по умолчанию использует аппаратные представления тензоров, формы, типы данных и расположение которых в памяти могут отличаться. Поэтому настрой типы входных и выходных тензоров средства запуска как представления CPU либо самостоятельно преобразуй аппаратный формат (см. обзор архитектуры VART-ML от AMD).
Сравни точность на устройстве с базовым результатом FP32 из шага 1 на собственном наборе для валидации и по тем же метрикам производительности, например mAP. Опубликованные AMD результаты для YOLOv8m на VEK385 показывают, насколько снижается точность при развёртывании в INT8:
| Конфигурация YOLOv8m | Оборудование | mAP50-95 (COCO) |
|---|---|---|
| ONNX в FP32 | CPU хоста | 49.95 |
| BF16 | NPU VEK385 | 50.29 |
| VINT8, конечная часть в FP32 | CPU хоста | 48.75 |
| VINT8, конечная часть в BF16 | NPU VEK385 | 48.38 |
Источник: руководство AMD по YOLOv8m для Versal AI Edge Gen 2; в нём также указано среднее время инференса 10,69 мс по результатам 100 запусков VART при dp_size=1.
Для поставки Ultralytics YOLO в составе коммерческого продукта AMD Xilinx необходимо соблюдать условия лицензии AGPL-3.0 или получить корпоративную лицензию Ultralytics.
Применение в реальных условиях#
Устройства AMD Xilinx часто используют там, где компьютерное зрение с ИИ должно работать в реальном времени, потреблять мало энергии и находиться рядом с датчиком:
- Безопасность на промышленных и строительных объектах: обнаруживай людей и машины рядом с тяжёлым оборудованием и контролируй рабочие зоны с помощью обнаружения объектов и подсчёта объектов.
- Автомобильное зрение и техника для бездорожья: запускай компьютерное зрение на основе камер на сертифицированных компонентах автомобильного класса для автономных транспортных средств и систем помощи водителю.
- Умные камеры и видеоаналитика: объединяй захват и кодирование видео с инференсом YOLO на одном чипе для систем безопасности и видеоаналитики.
- Машинное зрение и контроль качества: сочетай высокоскоростной захват изображений на FPGA с сегментацией экземпляров или классификацией YOLO для обнаружения дефектов на конвейере.
- Робототехника и дроны: используй модули Kria KR260 или Versal для оценки позы, обнаружения объектов с ориентацией и навигации с детерминированной задержкой.
Итоги#
Устройства AMD Xilinx запускают модели YOLO с помощью двух поколений ускорителей. DPU в Zynq UltraScale+ и Kria использует зафиксированный процесс Vitis AI 3.5 и создаёт файлы .xmodel. Для него нужны функции активации, поддерживаемые DPU, например Hard-Swish; механизмы внимания он обрабатывает на CPU. NPU в Versal AI Edge и Versal AI Edge Gen 2 работает с актуальными выпусками Vitis AI. NPU Gen 2 поддерживает SiLU и операторы внимания, а пример AMD с YOLOv8m почти полностью выполняется на NPU VEK385. Поддержка операторов на более раннем NPU VEK280 зависит от версии Vitis AI и точности.
Скоро появится встроенный экспорт Ultralytics для устройств AMD Xilinx. Пока обучай модель с Ultralytics, экспортируй её в ONNX для целевых устройств Versal с NPU или сохрани контрольную точку PyTorch для целевых устройств с DPU, а затем скомпилируй её с помощью Vitis AI, как описано выше. О других целевых устройствах см. руководство по вариантам развёртывания моделей, рекомендации по развёртыванию и сведения об интеграциях с ускорителями, например Hailo, Rockchip RKNN и Axelera.
Часто задаваемые вопросы#
Да. AMD завершила приобретение Xilinx в феврале 2022 года, и теперь продукты Xilinx продаются как адаптивные системы на кристалле и FPGA от AMD: AMD Zynq, AMD Kria, AMD Versal и AMD Vitis. Инженеры по-прежнему широко используют название Xilinx, а номера компонентов сохраняют префикс
XC.Пока нет. Скоро появится встроенный экспорт Ultralytics для устройств AMD Xilinx. Сейчас экспортируй модель в ONNX с помощью
model.export(format="onnx")для целевых устройств Versal с NPU или квантуй обученную контрольную точку PyTorch с помощьюvai_q_pytorchдля целевых устройств Zynq UltraScale+ и Kria с DPU, а затем выполни компиляцию с помощью инструментов AMD Vitis AI, как показано в руководстве «Разверни YOLO26 на AMD Xilinx уже сегодня».DPU (блок обработки глубокого обучения) — это более ранний ускоритель AMD для INT8. Он встроен в программируемую логику устройств Zynq UltraScale+ и Kria, компилируется с помощью Vitis AI 3.5 и создаёт файлы
.xmodel. В актуальных выпусках Vitis AI его заменяет NPU. В устройствах Versal AI Edge он объединяет специализированные AI Engines с программируемой логикой, поддерживает INT8, BF16 и смешанную точность, а также больше операторов, включая SiLU и, в Versal AI Edge Gen 2, механизмы внимания..xmodel— это сериализованный граф XIR, используемый в цепочке инструментов AMD DPU. Средство квантования создаёт квантованный файл.xmodel, а компиляторvai_c_xirпреобразует его в скомпилированный файл.xmodel, содержащий поток инструкций DPU, квантованные веса INT8 и подграфы, которые должны выполняться на CPU. Скомпилированный файл предназначен для конкретной конфигурации DPU, заданной отпечаткомarch.json, и запускается на плате с помощью Vitis AI Runtime (VART) или Graph Runner, если в файле есть подграфы для CPU.Нет. DPU ускоряет только функции активации ReLU, ReLU6, LeakyReLU, Hard-Swish и Hard-Sigmoid; Sigmoid, Softmax и MatMul между двумя функциями активации выполняются на CPU. Обучай YOLO с
activation: nn.Hardswish()в YAML-файле модели, чтобы свёртки выполнялись на DPU, а о вариантах обработки механизмов внимания см. «Обработка блоков внимания на DPU». NPU Versal AI Edge Gen 2 изначально поддерживают SiLU, Softmax и MatMul.В KV260 используется Zynq UltraScale+ MPSoC с DPU, поэтому следуй инструкции для DPU. Обучи модель YOLO26 с Hard-Swish, квантуй её с помощью
vai_q_pytorchв Docker-образе Vitis AI 3.5, скомпилируй с помощьюvai_c_xir, указавarch.jsonдля KV260, и запусти полученный.xmodelна плате с помощью VART или Graph Runner, если файл содержит подграфы для CPU.Нет. Квантование и компиляция выполняются в Docker-образах AMD Vitis AI на хосте Linux с архитектурой x86-64. Плата нужна только для запуска скомпилированной модели и измерения задержки и точности на устройстве.
Можно запускать задачи любого типа, если операторы для них компилируются под твой ускоритель. Неподдерживаемые операторы обычно выполняются на CPU, но некоторые могут перевести всю модель на CPU или привести к ошибке компиляции. Обнаружение объектов — самая распространённая задача и та, которую используют в примерах самой AMD. Для сегментации, оценки позы и других задач проверь отчёт компилятора о разбиении, чтобы убедиться, что ресурсоёмкие слои выполняются на ускорителе.