Inference Engine
Движок инференса запускает обученные модели на целевом оборудовании, используя объединённые слои, пониженную точность и оптимизированные ядра. Как он работает и какие движки распространены.
Движок инференса — это программное обеспечение, которое выполняет обученную нейронную сеть, чтобы получать предсказания на новых данных. Он принимает экспортированную модель из фреймворка обучения, обычно в виде вычислительного графа, например файла ONNX, оптимизирует граф для конкретного процессора и выполняет его с минимально возможными задержкой инференса и расходом памяти. Движки существуют для всех типов оборудования — от GPU центров обработки данных до телефонов и микроконтроллеров, а при развёртывании модели именно движок вычисляет каждое предсказание.
Как движки инференса ускоряют модели#
Развёрнутая модель не обновляет свои веса, поэтому движок может отбросить всё необходимое для обучения, например сохранённые активации для обратного распространения ошибки, и свободно переписать граф. Он предварительно вычисляет все части, зависящие только от констант, объединяет цепочки слоёв, например свёртку, нормализацию и активацию, в отдельные ядра, чтобы промежуточные результаты оставались в быстрой встроенной памяти, и планирует использование памяти, чтобы повторно задействовать буферы. Движок может снизить числовую точность до FP16 или INT8 с помощью квантования модели; для INT8 диапазоны активаций измеряются на примерах данных. Такие движки, как TensorRT, затем замеряют время выполнения нескольких возможных ядер для каждого слоя на целевом устройстве и выбирают самое быстрое — поэтому результат зависит от конкретного оборудования:
Свёртка пакетной нормализации с предшествующей свёрткой — один из самых распространённых способов переписывания графа. При инференсе нормализация лишь масштабирует и смещает каждый канал на фиксированные величины, поэтому эти значения можно объединить с весами и смещением свёртки. PyTorch предоставляет такое же преобразование через fuse_conv_bn_eval:
import torch
from torch.nn.utils.fusion import fuse_conv_bn_eval
torch.manual_seed(0)
# A trained convolution followed by batch normalization (random statistics here)
conv = torch.nn.Conv2d(16, 32, kernel_size=3, padding=1).eval()
bn = torch.nn.BatchNorm2d(32).eval()
bn.running_mean.uniform_(-1, 1)
bn.running_var.uniform_(0.5, 2.0)
# Fold the normalization's scale and shift into the convolution's weights and bias
fused = fuse_conv_bn_eval(conv, bn)
# One layer now replaces two and produces the same output
x = torch.randn(1, 16, 64, 64)
with torch.inference_mode():
diff = (bn(conv(x)) - fused(x)).abs().max().item()
print(f"Max difference after fusing: {diff:.1e}")Выводится максимальная разница 2.1e-06 — это погрешность округления с плавающей точкой: один объединённый слой вычисляет ту же функцию, что и два исходных слоя, но за один проход по памяти вместо двух.
Распространённые движки инференса#
- TensorRT: Движок NVIDIA для GPU центров обработки данных и модулей Jetson. Он создаёт план для конкретной модели GPU и версии TensorRT, поэтому при изменении любого из них движок нужно собрать заново.
- OpenVINO: Набор инструментов Intel для CPU, интегрированных и дискретных GPU и NPU.
- ONNX Runtime: Кроссплатформенный движок Microsoft для моделей ONNX. Он передаёт задачи аппаратным бэкендам, называемым провайдерами выполнения, включая CUDA, TensorRT, OpenVINO и Core ML.
- LiteRT: Среда выполнения Google, ранее TensorFlow Lite, для Android, встроенного Linux и микроконтроллеров; поддерживает делегаты для мобильных GPU и NPU.
- Core ML: Фреймворк Apple для выполнения на устройстве, распределяющий задачи между CPU, GPU и Neural Engine.
- vLLM: Движок с открытым исходным кодом для больших языковых моделей. Он добавляет планирование запросов и постраничное управление памятью для кэша внимания, чтобы одновременно обслуживать много пользователей.
Ultralytics YOLO API выбирает движок по загружаемому файлу, поэтому один и тот же вызов predict выполняет контрольную точку .pt в PyTorch, файл .onnx в ONNX Runtime, файл .engine в TensorRT или папку OpenVINO в OpenVINO. Экспорт Ultralytics YOLO26 в OpenVINO и загрузка результата переключают движки без других изменений кода:
from ultralytics import YOLO
# Экспортируй модель PyTorch в формат OpenVINO
model = YOLO("yolo26n.pt")
path = model.export(format="openvino") # creates 'yolo26n_openvino_model/'
# Загрузи экспортированную папку, чтобы выполнять предсказания с помощью движка OpenVINO
ov_model = YOLO(path)
results = ov_model("https://ultralytics.com/images/bus.jpg")
results[0].save(filename="bus_openvino.jpg")Движки инференса и связанные понятия#
- PyTorch и другие фреймворки обучения: Оставляют граф гибким и записывают операции для вычисления градиентов, чтобы проектировать и обучать модели. Они также выполняют инференс, но с большими накладными расходами, чем движок, оптимизированный для одного устройства.
- ONNX: Формат файла, описывающий граф и веса модели. ONNX Runtime и TensorRT — движки, которые его читают.
- Обслуживание моделей: один или несколько движков оборачиваются в сетевой сервис с API, пакетной обработкой запросов и управлением версиями. Так работает NVIDIA Dynamo-Triton, ранее называвшийся Triton Inference Server, для моделей TensorRT, ONNX Runtime и PyTorch.
- Механизм вывода экспертной системы: Более раннее значение этого термина из области ИИ на основе правил: механизм вывода применяет правила «если — то» к базе знаний, используя прямой или обратный вывод.










