Ultralytics YOLO27: Встать в лист ожидания.
Get Started
Ultralytics YOLO в продакшене·Выбери среду выполнения·Урок 1/9
Уроксредний

Выбери целевую платформу развёртывания

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

Камера наблюдения над городской автомагистралью на закате: Ultralytics YOLO отслеживает автомобили, фургон и грузовики, помечая каждый объект классом и идентификатором

Одна и та же YOLO26n обрабатывает изображение за 38.9 мс на CPU с ONNX Runtime и за 1.7 мс на GPU T4 с TensorRT согласно тестам производительности YOLO26. Неподходящая среда выполнения заставит тебя либо платить за гораздо более мощное оборудование, чем нужно, либо запускать камеры, которые не справляются с нагрузкой. В этом уроке ты за десять минут примешь решение, которое сможешь обосновать числами, измеренными непосредственно на устройстве.

Результат

Выбери среду выполнения и значение format= для устройства, преобразуй целевое значение FPS в бюджет времени в миллисекундах и подтверди выбор повторными тестами производительности.

Ускоренное прохождение
Если ты уже освоился, вот краткая версия.
  1. GPU NVIDIA или Jetson → TensorRT (engine), сборка на целевом устройстве. CPU, iGPU или NPU Intel → OpenVINO (openvino).

  2. Apple → CoreML (coreml). Android → LiteRT (litert). NPU Snapdragon → QNN (qnn). Raspberry Pi → NCNN (ncnn).

  3. Любое другое устройство → ONNX Runtime (onnx). Если серверы не нужны — управляемая конечная точка Ultralytics Platform.

  4. Бюджет = 1000 ÷ FPS за вычетом времени на декодирование и постобработку. Измерь время на устройстве и ориентируйся на p95, а не на среднее значение.

Практические занятия

Начни с устройства#

Среду выполнения выбирают исходя из того, где выполняется инференс, а не по привычке. Пройди по схеме сверху вниз и остановись на первом подходящем варианте:

Каждой среде выполнения соответствует одно значение format= в режиме экспорта:

Целевой показательСреда выполненияformat=Обрати внимание на
GPU NVIDIA, JetsonTensorRTengineДвижок запускается только на семействе GPU и с версией TensorRT, использованными при его сборке
CPU, iGPU, NPU IntelOpenVINOopenvinoОптимизирован для Intel; перед использованием на другом оборудовании проведи измерения
Любой CPU или GPUONNX RuntimeonnxЯвно выбери провайдер выполнения
iPhone, iPad, MacCoreMLcoremlЭкспорт выполняется в macOS или Linux, но не в Windows
Android, встраиваемые устройстваLiteRTlitertДля INT8 нужны данные калибровки data
NPU SnapdragonQualcomm QNNqnnТолько экспорт с квантованием; передай целевую платформу Hexagon как name
Raspberry Pi, ARM CPUNCNNncnnСамый быстрый формат в руководстве по Raspberry Pi
БраузерONNX Runtime WebonnxИспользуй только модели n или s

На новейших платформах Apple можно также экспортировать модель в более новый формат Apple Core AI (format=coreai, экспортированный на Apple silicon с macOS 26+ или на Linux x86-64). Впервые экспортируешь модель? В уроке Экспорт для развёртывания рассмотрены основы.

Если ты вообще не хочешь запускать серверы инференса, Ultralytics Platform развернёт модель в виде выделенной конечной точки в одном из 42 регионов, а на вкладке Deployments твоего профиля показано, где работает каждая из них:

Вкладка Deployments профиля Ultralytics Platform с картой регионов развёртывания и карточками с обзором активных развёртываний, HTTP-запросов, частоты ошибок и задержки P95

Этот способ описан в разделе Развёртывание и вызов конечной точки. Остальная часть курса предназначена для тех случаев, когда ты запускаешь модель самостоятельно.

Переведи целевое значение FPS в бюджет миллисекунд#

«Работа в реальном времени» — это не требование, а вот число — требование. Рассчитай его до любого бенчмарка:

ПереходПример: 20 FPS на камеру
Бюджет кадра = 1000 ÷ FPS50 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, а на устройстве теряет кадры. Решение: проводи тестирование на целевом оборудовании или на максимально близкой к нему машине и запускай модель под ожидаемой в рабочей среде нагрузкой (другие процессы, другие камеры).

Движки TensorRT зависят от устройства

Симптом: .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 обеспечивает их единообразие.
Попробовать

Составь краткое описание развёртывания реального или запланированного проекта из пяти пунктов: целевое устройство, FPS на камеру, камер на устройство, язык вызывающего кода и размер парка устройств. Рассчитай на его основе бюджет модели в миллисекундах, выбери кандидатов по дереву решений и запусти pick_runtime.py (со своей моделью и кандидатами) на целевом устройстве или на максимально похожей машине.

Критерии готовности
Урок считается завершённым, если выполнены все условия ниже.
  • В описании указаны устройство, среда выполнения и точное значение format=.

  • Ты рассчитал бюджет модели в миллисекундах на основе целевого значения FPS и показал, что именно вычел.

  • Для каждого кандидата у тебя есть измеренные на устройстве значения времени инференса p50 и p95, а также вывод о соответствии бюджету.

Показать решение

Пример описания развёртывания системы аналитики в розничной сети:

ВопросОтвет
Устройство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", прежде чем покупать оборудование.

Что дальше

Выбрав целевую платформу, в следующем уроке ты экспортируешь модель в ONNX и проверишь, что экспорт даёт те же результаты, что и PyTorch.

Войди, чтобы сохранять прогресс