Выбери целевую платформу развёртывания
Определи среду выполнения и формат экспорта по устройству, бюджету задержки и парку устройств, а затем проверь их на самом устройстве.

Одна и та же YOLO26n обрабатывает изображение за 38.9 мс на CPU с ONNX Runtime и за 1.7 мс на GPU T4 с TensorRT согласно тестам производительности YOLO26. Неподходящая среда выполнения заставит тебя либо платить за гораздо более мощное оборудование, чем нужно, либо запускать камеры, которые не справляются с нагрузкой. В этом уроке ты за десять минут примешь решение, которое сможешь обосновать числами, измеренными непосредственно на устройстве.
Практические занятия
Начни с устройства#
Среду выполнения выбирают исходя из того, где выполняется инференс, а не по привычке. Пройди по схеме сверху вниз и остановись на первом подходящем варианте:
Каждой среде выполнения соответствует одно значение format= в режиме экспорта:
| Целевой показатель | Среда выполнения | format= | Обрати внимание на |
|---|---|---|---|
| GPU NVIDIA, Jetson | TensorRT | engine | Движок запускается только на семействе GPU и с версией TensorRT, использованными при его сборке |
| CPU, iGPU, NPU Intel | OpenVINO | openvino | Оптимизирован для Intel; перед использованием на другом оборудовании проведи измерения |
| Любой CPU или GPU | ONNX Runtime | onnx | Явно выбери провайдер выполнения |
| iPhone, iPad, Mac | CoreML | coreml | Экспорт выполняется в macOS или Linux, но не в Windows |
| Android, встраиваемые устройства | LiteRT | litert | Для INT8 нужны данные калибровки data |
| NPU Snapdragon | Qualcomm QNN | qnn | Только экспорт с квантованием; передай целевую платформу Hexagon как name |
| Raspberry Pi, ARM CPU | NCNN | ncnn | Самый быстрый формат в руководстве по Raspberry Pi |
| Браузер | ONNX Runtime Web | onnx | Используй только модели n или s |
На новейших платформах Apple можно также экспортировать модель в более новый формат Apple Core AI (format=coreai, экспортированный на Apple silicon с macOS 26+ или на Linux x86-64). Впервые экспортируешь модель? В уроке Экспорт для развёртывания рассмотрены основы.
Если ты вообще не хочешь запускать серверы инференса, Ultralytics Platform развернёт модель в виде выделенной конечной точки в одном из 42 регионов, а на вкладке Deployments твоего профиля показано, где работает каждая из них:

Этот способ описан в разделе Развёртывание и вызов конечной точки. Остальная часть курса предназначена для тех случаев, когда ты запускаешь модель самостоятельно.
Переведи целевое значение FPS в бюджет миллисекунд#
«Работа в реальном времени» — это не требование, а вот число — требование. Рассчитай его до любого бенчмарка:
| Переход | Пример: 20 FPS на камеру |
|---|---|
| Бюджет кадра = 1000 ÷ FPS | 50 ms |
| Минус декодирование (RTSP, 1080p) | около 10 мс |
| Минус трекинг, подсчёт, выходные потоки | около 5 мс |
| Минус 20% запаса на пиковые нагрузки | 10 ms |
| Остаётся для модели | около 25–30 мс |
Затем примени следующие правила выбора:
- Если YOLO26n требует на CPU устройства больше времени, чем выделено модели, перейди на ускоритель (GPU, iGPU, NPU) или сначала уменьши
imgsz; в бенчмарках YOLO26 для YOLO26n указано 38.9 мс на CPU с ONNX и 1.7 мс на T4 с TensorRT. - Если одно устройство должно обслуживать несколько камер, раздели бюджет модели на число камер.
- Если в парке устройств больше нескольких типов, выбирай среды выполнения, для которых не нужны сборки под каждое устройство, либо запланируй отдельную сборку для каждого класса устройств.
- Если вызывающий код написан на Swift, Kotlin или C++, перед выбором проверь, есть ли в SDK среды выполнения поддержка этого языка.
Проведи бенчмарк кандидатов на устройстве#
Технические характеристики и чужие бенчмарки — лишь отправная точка. Решение принимается на оборудовании, на котором ты будешь развёртывать модель, и по медленным кадрам, а не по среднему значению: среда выполнения, которая обычно работает быстро, но зависает на каждом двадцатом кадре, всё равно будет пропускать кадры. Этот скрипт экспортирует каждый вариант, измеряет время 100 инференсов на реальном кадре и оценивает каждый по 95-му процентилю (p95):
from ultralytics import YOLO
from ultralytics.utils.downloads import safe_download
BUDGET_MS = 30 # the model's share of a 20 FPS frame budget
CANDIDATES = ("onnx", "openvino") # runtimes the decision tree allows on this machine
if __name__ == "__main__": # exports and inference can start worker processes on macOS and Windows
frame = str(safe_download("https://ultralytics.com/images/bus.jpg")) # use a real frame from your camera
for fmt in CANDIDATES:
model = YOLO(YOLO("yolo26n.pt").export(format=fmt))
for _ in range(5): # warm up: the first calls include one-time setup
model(frame, verbose=False)
runs = sorted(model(frame, verbose=False)[0].speed["inference"] for _ in range(100))
p50, p95 = runs[49], runs[94]
verdict = "meets" if p95 <= BUDGET_MS else "misses"
print(f"{fmt:9s} p50 {p50:5.1f} ms p95 {p95:5.1f} ms {verdict} the {BUDGET_MS} ms budget")На ноутбуке с Apple silicon, использованном для тестирования этого курса, когда CPU был занят и другими задачами:
onnx p50 30.0 ms p95 46.4 ms misses the 30 ms budget
openvino p50 22.8 ms p95 113.5 ms misses the 30 ms budgetРазберём всё по пунктам:
speed["inference"]— это время, затраченное самой моделью на обработку кадра, без декодирования и отрисовки, поэтому среды выполнения можно сравнивать честно.- OpenVINO выигрывает по медиане, но проигрывает по p95 более чем вдвое. Оценивая по средним значениям, ты выбрал бы среду выполнения, которая зависает при высокой нагрузке; по p95 ONNX Runtime на этой машине оказывается более стабильным вариантом.
- Оба варианта не укладываются в бюджет, поэтому здесь стоит выбрать модель меньшего размера
imgsz, ускоритель или меньше камер на устройство, а не другую среду выполнения для CPU.
Чтобы быстро сравнить точность и скорость разных форматов, режим Benchmark экспортирует, проверяет и измеряет время работы каждого из них:
yolo benchmark model=yolo26n.pt data=coco8.yaml imgsz=640 format=onnxУбери format=, чтобы проверить все форматы, поддерживаемые машиной. В COCO8 всего четыре изображения для валидации, поэтому считай столбец mAP лишь проверкой работоспособности, а для принятия решений о точности используй YAML-файл собственного набора данных.
Подводные камни#
Симптом: на рабочей станции модель выдавала 60 FPS, а на устройстве теряет кадры. Решение: проводи тестирование на целевом оборудовании или на максимально близкой к нему машине и запускай модель под ожидаемой в рабочей среде нагрузкой (другие процессы, другие камеры).
Симптом: .engine, собранный на серверном GPU, не загружается на Jetson Orin. Решение: собирай его на целевом устройстве во время установки (сборка YOLO26n FP16 занимает около 5 минут на Jetson Orin, согласно документации по экспорту на платформу) или храни отдельную сборку для каждого класса устройств и версии TensorRT, а также поставляй .pt или .onnx, чтобы любое устройство могло выполнить сборку.
yolo benchmark измеряет производительность при значении imgsz, которое ты укажешь. Если в рабочей среде используется imgsz=1280, тестируй при размере 1280: вычислительная нагрузка растёт пропорционально числу пикселей, поэтому результаты для 640 примерно в 4 раза завышают производительность при развертывании с размером 1280.
Для граничных устройств нужно ответить ещё на четыре вопроса#
В руководствах по Raspberry Pi, NVIDIA Jetson и DeepStream на Jetson подробно описаны распространённые целевые платформы. Прежде чем остановить выбор на граничном устройстве, ответь на вопросы:
- Холодный запуск: где собирается движок TensorRT и кто ждёт завершения сборки?
- Питание и нагрев: сможет ли корпус целый день поддерживать работу модели с полной частотой FPS?
- Память: хватит ли места для буферов кадров и состояния трекера помимо модели? INT8 вдвое уменьшает долю модели.
- Обновления: как новая версия
best.ptпопадёт на 1 000 устройств? Образ Docker обеспечивает их единообразие.
Показать решение
Пример описания развёртывания системы аналитики в розничной сети:
| Вопрос | Ответ |
|---|---|
| Устройство | 40 мини-ПК в магазинах с процессорами Intel Core Ultra, без дискретного GPU |
| FPS и камеры | 10 FPS на камеру, 2 камеры на устройство |
| Вызывающий код | Сервис на Python под Linux |
| Парк устройств | 40 устройств, обновление из образа Docker |
Бюджет: 1000 ÷ 10 = 100 мс на кадр; после вычета около 15 мс на декодирование и трекинг и 20% запаса остаётся около 65 мс, которые делятся между двумя камерами, то есть около 30 мс на один инференс. По дереву решений подходит OpenVINO (CPU Intel), а запасной вариант — ONNX Runtime. Проверим на одном устройстве в магазине:
python pick_runtime.py # CANDIDATES = ("onnx", "openvino"), BUDGET_MS = 30Согласно бенчмарку CPU Core Ultra 7 155H в документации OpenVINO, YOLO26n работает за 13.4 мс с OpenVINO FP32, поэтому yolo26n должно укладываться с запасом; если p95 на реальном устройстве, где работают оба конвейера камер, меньше 30 мс, используй OpenVINO. Если не укладывается, попробуй встроенный GPU устройства с device="intel:gpu", прежде чем покупать оборудование.