Ultralytics YOLO27: Встать в лист ожидания.
Get Started
Ultralytics YOLO в продакшене·Оптимизация·Урок 4/9
Уроксредний

OpenVINO на CPU

Экспортируй модели OpenVINO в FP32, FP16 и INT8, проверь каждую и оставь INT8 только там, где он даёт преимущество на твоём CPU.

CPU Intel, который у тебя уже есть, часто может заменить экземпляр с GPU: в бенчмарках Ultralytics YOLO26m ускоряется с 192 мс в PyTorch до 36 мс с OpenVINO INT8 на ноутбучном CPU Core Ultra. Однако прирост зависит от чипа, а на тестовом ARM-ноутбуке для этого курса экспорт INT8, откалиброванный на четырёх изображениях, потерял 3 пункта mAP. Ты научишься определять, какой случай у тебя, до выпуска модели.

Результат

Экспортируй модели OpenVINO в FP32, FP16 и INT8, сравни точность и скорость на своём CPU и выбери вариант, письменно обосновав решение.

Ускоренное прохождение
Если ты уже освоился, вот краткая версия.
  1. yolo export model=yolo26n.pt format=openvino создаёт yolo26n_openvino_model/.

  2. FP16 (quantize=16) вдвое уменьшает размер файла, но на большинстве CPU работает со скоростью FP32. INT8 (quantize=8 data=your.yaml) ускоряет работу на CPU Intel.

  3. При инференсе выбери устройство Intel: device="intel:cpu", "intel:gpu" или "intel:npu".

  4. Проверяй каждую точность до следующего экспорта, который перезапишет её папку; сравнивай производительность с ONNX Runtime на целевом устройстве.

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

Что даёт OpenVINO#

Экосистема OpenVINO: модели из PyTorch, TensorFlow, Keras, TensorFlow Lite, ONNX, JAX и PaddlePaddle запускаются через OpenVINO на CPU Intel (и ARM), GPU Intel, NPU Intel и FPGA в Windows, Linux и macOS

OpenVINO запускает модели из PyTorch и ONNX на CPU Intel, встроенных и дискретных GPU, а также NPU через единый API. Ядра CPU рассчитаны на наборы инструкций Intel (AVX2, AVX-512, AMX), а поддержка INT8 хорошо отлажена. Обрати внимание на блок ARM в столбце CPU: OpenVINO работает и на ARM, но его ядра оптимизированы для Intel, поэтому сначала измерь производительность.

Опубликованный бенчмарк на CPU Intel Core Ultra 7 155H (COCO128):

МодельPyTorch FP32OpenVINO FP32OpenVINO INT8mAP50-95 FP32 → INT8
YOLO26n33.19 ms13.43 ms11.40 ms0.4734 → 0.4611
YOLO26s70.92 ms36.16 ms15.54 ms0.5632 → 0.5471
YOLO26m192.45 ms102.52 ms35.72 ms0.6191 → 0.6025

Из этой таблицы следуют три правила:

  • Один только OpenVINO FP32 примерно вдвое снижает задержку PyTorch на CPU Intel. Начни с него.
  • Чем крупнее модель, тем выгоднее INT8: ускорение в 1,2 раза для n и в 2,9 раза для m ценой 1,2–1,7 пункта mAP. Для n INT8 редко оправдывает потерю точности.
  • Сначала попробуй встроенный GPU, прежде чем покупать оборудование: Arc iGPU (device="intel:gpu") на том же чипе запускал YOLO26n FP32 за 9.13 мс, а YOLO26m — за 34.47 мс.

Сравни точность на своём CPU#

Экспортируй каждый вариант точности, сразу проверяй его и только потом экспортируй следующий:

from ultralytics import YOLO

if __name__ == "__main__":  # validation starts worker processes on macOS and Windows
    model = YOLO("yolo26n.pt")  # or runs/detect/pills_v1/weights/best.pt
    for name, quantize in (("FP32", None), ("FP16", 16), ("INT8", 8)):
        path = model.export(format="openvino", quantize=quantize, data="coco8.yaml")  # or my_dataset/data.yaml
        m = YOLO(path).val(data="coco8.yaml", batch=1, plots=False, verbose=False)  # before the next export overwrites it
        print(f"{name}: mAP50-95 {m.box.map:.4f}  -> {path}")
OpenVINO: export success ✅ 2.3s, saved as 'yolo26n_openvino_model/' (9.6 MB)
FP32: mAP50-95 0.6783  -> yolo26n_openvino_model/
OpenVINO: export success ✅ 1.6s, saved as 'yolo26n_openvino_model/' (5.1 MB)
FP16: mAP50-95 0.6783  -> yolo26n_openvino_model/
WARNING ⚠️ OpenVINO: >300 images recommended for INT8 calibration, found 4 images.
OpenVINO: export success ✅ 11.3s, saved as 'yolo26n_int8_openvino_model/' (3.2 MB)
INT8: mAP50-95 0.6460  -> yolo26n_int8_openvino_model/

Что показывает каждая строка:

  • FP32 и FP16 показывают одинаковую точность, а FP16 занимает вдвое меньше места (5.1 против 9.6 МБ), но оба варианта записывались в одну папку. Если бы ты сначала экспортировал оба, а проверил позже, то дважды измерил бы FP16.
  • INT8 занимает 3.2 МБ и потерял 3.2 пункта точности, потому что калибровка проводилась на четырёх изображениях из COCO8. Об этом предупреждает сообщение: для реальной калибровки нужны сотни похожих на производственные изображений из твоего YAML-файла (fraction ограничивает их количество).
  • Ничто из этого не измеряет скорость. Для этого используй бенчмарк ниже.

Чтобы запускать экспортированную модель на конкретном устройстве Intel:

from ultralytics import YOLO

ov_model = YOLO("yolo26n_openvino_model/")
results = ov_model("https://ultralytics.com/images/bus.jpg", device="intel:cpu")  # or intel:gpu, intel:npu

Отправляй всю папку: yolo26n.xml (граф), yolo26n.bin (веса) и metadata.yaml. Для intel:gpu и intel:npu требуется оборудование Intel.

Сравни производительность с ONNX Runtime#

Точность уже проверена; скорость нужно измерять на целевом устройстве под реальной нагрузкой. Запусти pick_runtime.py из первого урока с CANDIDATES = ("onnx", "openvino"). На тестовом ноутбуке с 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

У OpenVINO была лучше медианная задержка, но значительно хуже задержка в хвосте распределения. Обёртка Ultralytics компилирует OpenVINO с подсказкой LATENCY (в журнале указано Using OpenVINO LATENCY mode for batch=1 inference on CPU), распределяя каждый запрос по ядрам CPU; когда за эти ядра конкурируют другие задачи, сильнее всего страдают самые медленные запросы. На выделенном компьютере Intel результаты обычно ближе к опубликованным выше, но узнать это можно только по собственным измерениям p95.

Правила выбора:

Подводные камни#

Ожидание ускорения CPU при использовании FP16

Симптом: экспорт FP16 вдвое меньше по размеру, но работает точно так же медленно. Решение: на большинстве CPU плагин самостоятельно выбирает точность вычислений; используй FP16 для уменьшения размера загрузки, а INT8 или встроенный GPU — для ускорения.

Валидация после всех экспортов

Симптом: FP32 и FP16 показывают одинаковые результаты, потому что это один и тот же файл. Решение: экспорты FP32 и FP16 используют общую папку *_openvino_model/; проводи валидацию (или переименовывай папку) сразу после каждого экспорта.

Тестирование на простаивающей машине

Симптом: среднее значение выглядит нормальным, но в моменты высокой нагрузки кадры всё равно пропускаются. Решение: измеряй время инференса при рабочей нагрузке и ориентируйся на p95, а не на среднее значение. Для обработки множества потоков на одном сервере собери модель с подсказкой THROUGHPUT, напрямую загрузив .xml с помощью среды выполнения OpenVINO, как показано в руководстве по режимам задержки и пропускной способности.

Оборачивай скрипты валидации защитным блоком

В macOS и Windows валидация запускает рабочие процессы, которые повторно импортируют твой скрипт. Без if __name__ == "__main__": тестовый запуск для этого урока повторно выполнял экспорт внутри этих процессов, тратил минуты и конкурировал за CPU, производительность которого пытался измерить.

Попробовать

На целевом CPU запусти ov_compare.py со своей моделью и YAML-файлом датасета, затем запусти pick_runtime.py с ONNX и OpenVINO во время производственной нагрузки (или её имитации). Подготовь краткую таблицу (точность или среда выполнения, mAP50-95, размер, p95 в мс) и одним предложением укажи, какой вариант выпустишь.

Критерии готовности
Урок считается завершённым, если выполнены все условия ниже.
  • Ты проверил экспорты одной и той же модели в FP32, FP16 и INT8 для OpenVINO на одних и тех же данных.

  • У тебя есть значения задержки p95 для OpenVINO и ONNX Runtime, полученные на одной и той же машине при реалистичной нагрузке.

  • При выборе точности и среды выполнения укажи измеренную цену в mAP и прирост скорости.

Показать решение
python ov_compare.py    # accuracy and size of FP32, FP16, INT8
python pick_runtime.py  # p50 and p95 for ONNX Runtime and OpenVINO

Пример решения на основе приведённых выше данных для Core Ultra 7 155H:

ПараметрmAP50-95Объёммс на изображение
OpenVINO FP320.47349.6 MB13.43
OpenVINO INT80.46113.2 MB11.40
iGPU FP32 (intel:gpu)0.47589.6 MB9.13

Выпускай OpenVINO FP32 на интегрированном GPU: это самый быстрый вариант без потери качества, тогда как INT8 на CPU обойдётся в 1,2 пункта ради экономии 2 мс. При развёртывании YOLO26m выбор меняется на INT8 на CPU (в 2,9 раза быстрее при потере 1,7 пункта), если такая потеря укладывается в твой бюджет.

Что дальше

Обнаружения на отдельных кадрах — основа. Далее: трекинг, который превращает их в постоянные объекты со стабильными идентификаторами.

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