Ultralytics YOLO27: Запишись в список ожидания.

Экспорт AMD Xilinx для Ultralytics YOLO с Vitis AI#

При экспорте моделей Ultralytics YOLO26 с помощью format="xilinx" выполняется квантование с AMD Quark для NPU адаптивных SoC AMD Versal AI Edge Series Gen 2. После этого компилятор Vitis AI от AMD может создать модель .rai. Этот же экспорт проверяет точность INT8 на любом хосте до развертывания.

Поддерживаемые устройства AMD

Экспорт предназначен для поддерживаемого процесса Vitis AI NPU на устройствах Versal AI Edge Series Gen 2, таких как оценочный комплект VEK385. Для DPU Zynq UltraScale+ и Kria, а также NPU Versal AI Edge первого поколения (VEK280) используются другие процессы Vitis AI, описанные в разделе Развертывание на других целевых устройствах AMD Xilinx.

Устройства AMD Xilinx используются во многих промышленных камерах, системах технического зрения для автомобилей, роботах, дронах и медицинском оборудовании по всему миру. Они объединяют процессоры Arm с программируемой логикой, а в новых устройствах — и специализированные AI Engines. Благодаря этому один чип может захватывать видео, предварительно обрабатывать его, выполнять детекцию объектов и реагировать на результат с низкой и предсказуемой задержкой инференса.

В этом руководстве рассматриваются экспорт AMD Xilinx, компиляция и запуск модели на плате Versal, семейства устройств AMD Xilinx, работа ИИ на этих устройствах, а также операторы Ultralytics YOLO, поддерживаемые каждым ускорителем.

Что такое AMD Xilinx?#

В 1980-х годах Xilinx изобрела программируемую пользователем вентильную матрицу (FPGA) и стала ведущим поставщиком адаптивных SoC и FPGA. AMD завершила приобретение Xilinx в феврале 2022 года, и теперь эти линейки продуктов продаются под брендом AMD: AMD Zynq, AMD Kria, AMD Versal и AMD Vitis.

Xilinx или AMD?

Оба названия относятся к одним и тем же продуктам. 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 EPVitisAIExecutionProvider для ONNX Runtime, который компилирует и запускает модели ONNX на NPU AMD.
Резервный запуск на CPU / разбиение графаЕсли ускоритель не может выполнить оператор, компилятор обычно делит модель на подграфы ускорителя и CPU. Каждое такое разделение добавляет передачу данных, которая может существенно увеличить задержку. Некоторые операторы вместо этого принудительно переносят всю модель на CPU или приводят к ошибке компиляции.

Семейства устройств AMD Xilinx для периферийного AI#

Устройства AMD Xilinx для периферийного AI относятся к трем семействам. В Zynq и Kria используется DPU в программируемой логике, а в рассматриваемых здесь устройствах Versal AI Edge — NPU на базе AI Engines.

СемействоОписаниеПрикладной CPUAI-ускорительПримеры плат
Zynq UltraScale+ MPSoCArm CPU и логика FPGA на одном чипе; варианты от ZU1 до ZU19Двухъядерный или четырехъядерный Arm Cortex-A53DPU, встроенный в программируемую логикуZCU104, ZCU102, заказные платы
Системный модуль Kria K26Готовый к серийному производству модуль на базе Zynq UltraScale+ MPSoCЧетырехъядерный Arm Cortex-A53DPU, встроенный в программируемую логикуКомплект для разработки KV260 Vision AI, комплект для разработки робототехники KR260
Серия Versal AI EdgeАдаптивные SoC; модели AIE-ML, например VE2302 и VE2802, работают с NPUДвухъядерный Arm Cortex-A72NPU на базе AI Engines AIE-ML и PLVEK280
Серия Versal AI Edge Gen 2Адаптивная SoC нового поколения с AI Engines AIE-MLv2До восьми ядер Arm Cortex-A78AENPU на базе AI Engines AIE-MLv2 и PLVEK385

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 отвечает за предварительную обработку, постобработку и любые слои, которые ускоритель выполнить не может, а среда выполнения на плате координирует их работу.

AMD выпустила два поколения ускорителей, каждое со своим набором инструментов и форматом файла скомпилированной модели. В этом руководстве описаны Vitis AI 3.5 для DPU и Vitis AI 6.3 для NPU; для более поздних версий проверяй актуальную документацию AMD.

ПроцессОборудованиеНабор инструментовКвантовательСкомпилированный артефактСреда выполнения на платеСтатус
DPUZynq UltraScale+, KriaVitis AI 3.5 (Docker)vai_q_pytorch.xmodelVARTЗамороженные компилятор, зоопарк моделей и IP-блок DPU
NPU (Versal AI Edge)VEK280 и другие компоненты Versal AI EdgeVitis AI 6.3 (Docker)Встроено в процесс создания снимкаСнимокVART-MLАктивно
NPU (Versal AI Edge Gen 2)VEK385 и другие компоненты Gen 2Vitis AI 6.3 (Docker)AMD Quark.raiONNX Runtime Vitis AI EP или VART-MLАктивно
Процесс работы с DPU заморожен

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.

В ноутбуках Ryzen AI используется другой стек

Процессоры AMD Ryzen AI в ПК также оснащены NPU, но в них используется отдельный стек Ryzen AI Software, а не встроенные потоки Vitis AI, описанные в этом руководстве. Информацию о GPU AMD Instinct и Radeon см. в разделе Интеграция с GPU AMD.

Какой поток Vitis AI выбрать?#

Выбери поток в зависимости от устройства на своей плате:

Экспорт в AMD Xilinx: преобразование модели YOLO#

Поддерживаемые задачи#

Экспорт AMD Xilinx поддерживает все семь задач Ultralytics. Семантическая сегментация и оценка глубины доступны только в YOLO26 — единственном семействе с соответствующими головами модели.

Установка#

Экспорт AMD Xilinx выполняется в Linux (x86-64 или ARM64) с Python 3.11–3.13 — именно эти версии поддерживает AMD Quark. При первом экспорте также компилируются пользовательские операторы Quark, для чего нужен компилятор C++, например g++.

Установка
# Install the required package for YOLO
pip install ultralytics

При первом экспорте AMD Quark автоматически устанавливается из PyPI. Чтобы заранее установить зависимости для экспорта:

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 на любом хосте. Если ONNX Runtime предоставляет VitisAIExecutionProvider, как на плате Versal AI Edge Series Gen 2, Ultralytics выбирает его автоматически.

Экспорт
from ultralytics import YOLO

# Загрузи модель YOLO26
model = YOLO("yolo26n.pt")

# Экспорт в формат AMD Xilinx для VEK385 (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")

# Валидация точности INT8 на наборе данных COCO8
metrics = model.val(data="coco8.yaml")

Названия форматов vitis, vitisai и versal — это псевдонимы xilinx.

Аргументы экспорта#

АргументТипПо умолчаниюОписание
formatstr'xilinx'Целевой формат экспортированной модели, определяющий совместимость с NPU AMD Versal AI Edge Series Gen 2.
imgszint или tuple640Требуемый размер входного изображения модели: целое число для квадратных изображений или кортеж (height, width). Размер пакета экспортированной модели фиксирован и равен 1.
quantizeint или str8/автоТочность квантования. Требуется 8 (Vitis AI INT8); если параметр не указан, он включается автоматически.
datastrNoneYAML-файл набора данных для калибровки INT8; для классификации вместо него укажи каталог с набором данных или название встроенного набора данных. Если параметр не указан, Ultralytics использует набор данных для калибровки соответствующей задачи, например coco128.yaml для обнаружения объектов.
fractionfloat1.0Доля набора данных для калибровки, которую нужно использовать.
namestr've2-xc2ve3858'Устройство для компилятора Vitis AI: 've2-xc2ve3858' (оценочный комплект VEK385), 've2-xc2ve3804', 've2-xc2ve3558', 've2-xc2ve3504', 've2-xc2ve3358' или 've2-xc2ve3304'.
opsetintNoneВерсия ONNX opset для промежуточного графа. По умолчанию используется 17 — версия opset, которую AMD проверяет для YOLO на Vitis AI.
simplifyboolTrueУпрощает промежуточный граф ONNX с помощью onnxslim.
devicestrNoneУказывает устройство для экспорта: GPU (device=0) или CPU (device=cpu).

Установи nms=False, чтобы экспортировать голову YOLO26 без NMS. Встроенный NMS (nms=True) не поддерживается, поскольку AMD относит NonMaxSuppression к операторам, которые могут перенести всю модель на CPU.

Калибровка на собственных данных

Точность INT8 зависит от того, насколько калибровочные изображения отражают сцену развертывания. Передай data= YAML-файл набора данных, содержащий не менее 300 репрезентативных изображений с твоих камер; стандартные наборы данных для калибровки — это небольшие общедоступные выборки.

Подробнее о процессе экспорта смотри на странице документации 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/, содержащий модель NPU yolo26n.rai и отчеты AMD о компиляции, например final-vaiml-pass-summary.txt.

Как работает экспорт#

Экспорт соответствует описанному AMD процессу Vitis AI для Versal AI Edge Series Gen 2:

  1. Экспорт ONNX с opset 17 и статическим размером пакета 1.
  2. Квантование AMD Quark с конфигурацией VINT8 (симметричный INT8 со степенными масштабами) и параметрами, необходимыми AMD для компиляции на NPU: Int32Bias=False, enable_npu_cnn=True, DedicatedQDQPair=True и QuantizeAllOpTypes=True. Для калибровки используется стандартный загрузчик Ultralytics для калибровки INT8 с той же предобработкой, что и при инференсе: letterbox, RGB и диапазон 0–1.
  3. Смешанная точность: голова модели остается в формате с плавающей точкой, а компилятор Vitis AI запускает ее на NPU в BF16. Квантование головы в INT8 приводит к большей части потери точности; по той же причине в руководстве AMD по YOLOv8m постобработка не переводится в INT8.
  4. Конфигурация компилятора: vitisai_config.json выбирает целевое устройство VAIML и устройство из name.

Точность#

В таблице сравниваются экспортированная модель INT8 и модель ONNX FP32 на COCO val2017 (5 000 изображений) с размером 640; обе модели запускаются на хосте с помощью ONNX Runtime на CPU. Модели INT8 калибровались на стандартном наборе данных coco128.yaml; калибровка на собственных изображениях для развертывания обычно сокращает разрыв.

МодельmAP50-95 для FP32mAP50-95 для AMD Xilinx INT8
YOLO26n40.336.7
YOLO26s47.942.5
YOLO11n38.835.5

В этих тестах квантованная модель запускается с ONNX Runtime на CPU хоста — это базовый вариант, с которым AMD сравнивает результаты NPU в своей методике оценки точности. Опубликованные AMD результаты для YOLOv8m на VEK385 демонстрируют тот же подход со смешанной точностью на NPU:

Конфигурация YOLOv8mОборудованиеmAP50-95 (COCO)
ONNX в FP32CPU хоста49.95
BF16NPU VEK38550.29
VINT8, конечная часть в FP32CPU хоста48.75
VINT8, конечная часть в BF16NPU VEK38548.38

Источник: руководство AMD по YOLOv8m для Versal AI Edge Gen 2; в нём также указано среднее время инференса 10,69 мс по результатам 100 запусков VART при dp_size=1.

Компиляция и запуск на Versal AI Edge Gen 2#

Экспортированный каталог готов для компилятора AMD Vitis AI, который создает модель .rai для запуска на NPU.

  1. Подготовь хост и плату. Выполняй компиляцию на хосте Linux x86-64 с помощью Docker-образа AMD Vitis AI 6.3 для Versal AI Edge Gen 2 и лицензии на компилятор AMD AI Engine (смотри страницу лицензирования AMD). Подготовь VEK385 по руководству AMD по настройке платы.

  2. Скомпилируй модель. В контейнере создай сессию ONNX Runtime с Vitis AI Execution Provider — именно так это делается в руководстве AMD по компиляции. В экспортированный каталог будет записан кэш yolo26n/ с yolo26n.rai:

    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 размещает на NPU VEK385 99,9% операторов и вычислений в одном разделе.

  3. Запусти модель на плате. Скопируй экспортированный каталог на VEK385. ONNX Runtime с Vitis AI Execution Provider загружает скомпилированную модель yolo26n.rai и запускает ее на NPU; YOLO("yolo26n_xilinx_model") автоматически выбирает этот провайдер, если он доступен.

Для компиляции нужен только ONNX Runtime от AMD, поэтому экспортируй модель на любом компьютере с Linux и скопируй каталог в контейнер, а не устанавливай туда Ultralytics: установка может изменить закрепленные версии пакетов контейнера. Если Ultralytics установлена рядом со сборкой AMD onnxruntime-vitisai, как на плате, она сохраняет эту сборку, а не заменяет ее стандартной onnxruntime.

ONNX Runtime и VART-ML

Экспорт настраивает стандартную компиляцию для ONNX Runtime, которая выполняет на самом CPU Arm несовместимые с NPU операторы, например выбор top-k в YOLO26 с nms=False. Среда выполнения AMD VART-ML запускает модель, только если все операторы выполняются на NPU, если не добавить проходы разбиения CPU от AMD в vitisai_config.json; такие артефакты нельзя запускать через ONNX Runtime.

Совместимость моделей YOLO и поддерживаемые операторы#

Ускоритель выполняет быстрее только те операторы, которые реализованы в его аппаратной части. Если модель содержит неподдерживаемый оператор, компилятор обычно передаёт эту часть сети Arm CPU, а каждый переход между ускорителем и CPU увеличивает задержку. Некоторые операторы невозможно разделить: на NPU Versal AI Edge Gen 2 AMD указывает такие операторы, как NonZero и NonMaxSuppression, которые могут заставить выполнять всю модель на CPU. Поддержка операторов — важнейший фактор производительности модели YOLO на оборудовании AMD Xilinx.

В таблице показано, где выполняется каждый оператор модели YOLO26. Стандартный экспорт YOLO26n в ONNX содержит 87 активаций SiLU, каждая из которых экспортируется как Sigmoid и Mul, а также 4 оператора MatMul и 2 оператора Softmax из двух блоков внимания: блока C2PSA в конце базовой сети (слой 10) и блока C3k2 с механизмом внимания, формирующего выход P5 (слой 22).

ОператорГде встречается в YOLODPU (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: без DFL и с необязательным выходом без NMS

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 и выполни дообучение на своём наборе данных:

Дообучение модели YOLO26 с Hard-Swish
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. Есть три варианта:

  1. Оставить блоки на CPU. В скомпилированной модели .xmodel будут подграфы CPU, поэтому запускай её с помощью Graph Runner от AMD. Он совместно выполняет подграфы DPU и CPU, если для каждого оператора есть реализация для CPU; в противном случае нужно самостоятельно реализовать и зарегистрировать недостающие операторы. При разрешении 20×20 вычисления внимания невелики, но каждый дополнительный переход между DPU и CPU увеличивает задержку, поэтому измерь её на своей плате.

  2. Использовать 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.

  3. Использовать модель без механизма внимания, например 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 отсутствуетНативный экспорт format="xilinx"; голова модели выполняется в BF16
YOLO11Обучай с Hard-Swish; C2PSA и softmax DFL выполняются на CPUНативный экспорт format="xilinx"; голова модели выполняется в BF16
YOLOv8Обучай с Hard-Swish; softmax DFL выполняется на CPUНативный экспорт format="xilinx". Руководство AMD по YOLOv8m (Vitis AI 6.3, VEK385, INT8 с хвостом BF16): отчет компилятора показывает 1 181 оператор (99,915%) и 99,994% GOP на NPU; модель не изменялась.

Развертывание на других целевых устройствах AMD Xilinx#

Для DPU Zynq UltraScale+ и Kria, а также NPU Versal AI Edge первого поколения используются процессы Vitis AI, которые не создает format="xilinx". Обучи модель с Ultralytics, а затем создай артефакт для целевого устройства с помощью инструментов AMD в их Docker-образах для Linux x86-64. Выбери вкладку своего устройства:

  1. Запусти Docker-образ AMD Vitis AI 6.3 для Versal AI Edge.

  2. Активируй среду NPU для IP-блока NPU на плате, выполнив settings.sh. Передай имя IP-блока NPU своей платы в качестве аргумента или укажи LIST, чтобы посмотреть доступные IP-блоки.

  3. Сними снимок: запусти обычный скрипт инференса на репрезентативных изображениях, задав переменную среды 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 изображениям, поэтому для моделей обнаружения задай большее репрезентативное число. Снимок привязан к варианту IP-блока NPU на плате. Конечные части постобработки YOLO выполняются на AI Engines только в режимах BF16 или MIXED. Документация AMD содержит противоречивые сведения о Softmax: на странице с примерами сказано, что Softmax не ускоряется и конечная часть YOLOv8 с Softmax выполняется на CPU, тогда как в примечаниях к выпуску Vitis AI 6.1 сообщается о полном ускорении YOLOv8 при смешанной точности. Проверь файл wrp_network_iriz.onnx внутри снимка, чтобы выяснить, какие части модели, включая механизмы внимания YOLO11 и YOLO26, выполняются на NPU. См. руководство по использованию собственной модели.

Подготовь плату с аппаратной конфигурацией и образом Linux, включающими конфигурацию ускорителя, для которой ты выполнял компиляцию, а также соответствующую среду выполнения Vitis AI. Смотри руководства AMD по настройке целевых устройств Zynq UltraScale+ и Kria DPU и Versal AI Edge (VEK280), а затем скопируй необходимые среде выполнения артефакты:

ПроцессАртефакты для копирования на платуСреда выполнения на плате
DPU (Zynq UltraScale+, Kria)Скомпилированный .xmodelVART; Graph Runner для подграфов на CPU
NPU (Versal AI Edge, VEK280)Каталог снимкаVART-ML

В DPU буферы VART содержат значения INT8 с фиксированной точкой: запроси форму каждого тензора и масштаб fix_point, квантуй входные данные и деквантуй выходные перед постобработкой. Graph Runner возвращает выходные данные всего графа, а DPU-only runner — выходные данные промежуточных подграфов DPU, вычисления которых должен завершить твой код. VART-ML на VEK280 по умолчанию использует аппаратные представления тензоров, форма, тип данных и раскладка памяти которых могут отличаться от ONNX; настрой типы входных и выходных тензоров runner как CPU-представления или самостоятельно преобразуй аппаратный формат (смотри обзор архитектуры VART-ML от AMD).

Лицензирование коммерческих продуктов

Для поставки Ultralytics YOLO в составе коммерческого продукта AMD Xilinx необходимо соблюдать условия лицензии AGPL-3.0 или получить корпоративную лицензию Ultralytics.

Применение в реальных условиях#

Устройства AMD Xilinx часто используют там, где компьютерное зрение с ИИ должно работать в реальном времени, потреблять мало энергии и находиться рядом с датчиком:

Итоги#

Экспорт с помощью format="xilinx" квантует модели Ultralytics YOLO с AMD Quark для NPU Versal AI Edge Series Gen 2, оставляет голову модели в BF16 и записывает конфигурацию компилятора Vitis AI рядом с моделью. Проверь точность INT8 на любом хосте, скомпилируй модель .rai в Docker-образе AMD Vitis AI и запусти ее на плате с ONNX Runtime и Vitis AI Execution Provider.

Для старых устройств AMD Xilinx используются другие процессы. В DPU Zynq UltraScale+ и Kria применяется зафиксированный набор инструментов Vitis AI 3.5 и файлы .xmodel; требуются нативные для DPU функции активации, например Hard-Swish, а attention выполняется на CPU. Для NPU Versal AI Edge первого поколения применяется процесс snapshot; поддержка операторов зависит от версии и точности Vitis AI.

Для других целевых устройств развертывания смотри руководство по вариантам развертывания моделей, рекомендации по развертыванию и интеграции ускорителей, например Hailo, Rockchip RKNN и Axelera.

Часто задаваемые вопросы#

  • Да. AMD завершила приобретение Xilinx в феврале 2022 года, и теперь продукты Xilinx продаются как адаптивные системы на кристалле и FPGA от AMD: AMD Zynq, AMD Kria, AMD Versal и AMD Vitis. Инженеры по-прежнему широко используют название Xilinx, а номера компонентов сохраняют префикс XC.

  • Да. model.export(format="xilinx") квантует модель с помощью AMD Quark для NPU Versal AI Edge Series Gen 2 и создает каталог с квантованной моделью ONNX и конфигурацией компилятора Vitis AI. Скомпилируй ее в .rai с помощью инструментов AMD Vitis AI, как показано в разделе Компиляция и запуск на Versal AI Edge Gen 2. Для Zynq UltraScale+, Kria и VEK280 используются процессы из раздела Развертывание на других целевых устройствах 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.

  • Нет. Экспорт выполняется на любом хосте Linux с Python 3.11–3.13, учетная запись AMD не нужна, а экспортированная модель работает на CPU, позволяя проверять точность на любом хосте. Для компиляции модели .rai требуются Docker-образ AMD Vitis AI и лицензия на компилятор AI Engine, а для запуска на NPU нужна плата Versal AI Edge Series Gen 2.

  • Ultralytics использует Vitis AI Execution Provider, только если он доступен в ONNX Runtime, как в сборке AMD onnxruntime-vitisai на плате Versal или в Docker-образе AMD. В остальных случаях квантованная модель запускается на CPU со стандартным ONNX Runtime — так измеряется точность INT8 до развертывания.

  • Можно запускать задачи любого типа, если операторы для них компилируются под твой ускоритель. Неподдерживаемые операторы обычно выполняются на CPU, но некоторые могут перевести всю модель на CPU или привести к ошибке компиляции. Обнаружение объектов — самая распространённая задача и та, которую используют в примерах самой AMD. Для сегментации, оценки позы и других задач проверь отчёт компилятора о разбиении, чтобы убедиться, что ресурсоёмкие слои выполняются на ускорителе.

Участники

Комментарии