Ultralytics YOLO27:

Развертывание AMD Xilinx для Ultralytics YOLO с помощью Vitis AI#

Нативный экспорт Ultralytics появится в ближайшее время

Поддержка нативного экспорта 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.

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

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:#fff

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 выбрать?#

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

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).

ОператорГде встречается в 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 отсутствуетОжидается работа без изменений; проверь на своей плате
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.

Сохрани сборку ONNX Runtime от AMD

В 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. На этом шаге плата не нужна. Выбери вкладку для своего устройства:

  1. Запусти Docker-образ AMD Vitis AI 6.3 для Versal AI Edge Gen 2. См. системные требования.
  2. Квантуй модель ONNX до INT8 с помощью AMD Quark, используя конфигурацию VINT8. В минимальной конфигурации AMD также требуются Int32Bias=False, enable_npu_cnn=True, DedicatedQDQPair=True и QuantizeAllOpTypes=True. Quark получает данные для калибровки через написанный тобой считыватель данных, поэтому используй ту же предобработку, что и при инференсе: изменение размера с letterbox до размера экспорта, порядок каналов RGB, масштабирование в диапазон 0–1 и формат NCHW; используй репрезентативные изображения из своего набора данных.
  3. Исключи подграф постобработки из квантования. В руководстве AMD по YOLOv8m предупреждают, что его квантование приводит к пропуску обнаруженных объектов. В этом примере с YOLOv8m компилятор затем выполняет конечную часть модели на NPU в BF16; неподдерживаемые операторы этой части, например выбор top-k в YOLO26, по-прежнему выполняются на CPU.
  4. Выбери среду выполнения для платы до компиляции. Стандартная компиляция работает с ONNX Runtime, который выполняет несовместимые с NPU операторы, например выбор top-k в YOLO26, непосредственно на CPU, а также с VART-ML, только если каждый оператор выполняется на NPU. Чтобы запустить модель с операторами на CPU через VART-ML, добавь проходы разбиения на CPU от AMD в vitisai_config.json. Эти артефакты нельзя запускать через ONNX Runtime.
  5. Скомпилируй модель, создав сессию 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)Скомпилированный .xmodelVART; 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-MLVART-ML

В потоках обработки для NPU в экспортированном графе ONNX уже декодируются рамки и применяется сигмоида к оценкам классов, поэтому на хосте нужно только интерпретировать выходные данные:

  • nms не задана: модели обнаружения выдают тензор (1, 4 + nc, anchors) с xywh рамками и оценками для каждого класса. Выбери лучший класс для каждого якоря, преобразуй рамки в координаты углов, отфильтруй их по порогу уверенности и выполни NMS; функция Ultralytics non_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 в 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.

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

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

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

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

Итоги#

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

Участники

Комментарии