Inference Engine
推論エンジンは、レイヤーの融合、低精度化、最適化されたカーネルを使い、ターゲットハードウェア上で学習済みモデルを実行します。仕組みと一般的なエンジンについて解説します。
推論エンジンとは、学習済みのニューラルネットワークを実行し、新しいデータに対する予測を生成するソフトウェアです。学習フレームワークからエクスポートされたモデルを受け取り、通常はONNXファイルのような計算グラフとして読み込み、そのグラフを特定のプロセッサ向けに最適化して、推論レイテンシとメモリ使用量をできるだけ抑えて実行します。データセンターのGPUからスマートフォンやマイクロコントローラーまで、あらゆる種類のハードウェアに対応するエンジンがあります。モデルデプロイでは、エンジンがすべての予測を計算するコンポーネントです。
推論エンジンがモデルを高速化する仕組み#
デプロイ済みモデルの重みは更新されないため、エンジンは誤差逆伝播用に保存する活性化値など、学習に必要な要素をすべて省き、グラフを自由に書き換えられます。定数のみに依存する部分は事前計算し、畳み込み、正規化、活性化などのレイヤー列を単一のカーネルに融合して、中間結果を高速なオンチップメモリに保持し、バッファを再利用するようメモリを計画します。モデル量子化によって数値精度をFP16やINT8に下げることができ、INT8ではサンプルデータを使って活性化値の範囲を測定します。TensorRTなどのエンジンは、実際のデバイス上で各レイヤーの複数のカーネル候補を実行して時間を計測し、最速のものを採用するため、結果はそのハードウェアに依存します。
バッチ正規化を直前の畳み込みに畳み込む処理は、最も一般的な書き換えの1つです。推論時の正規化は、各チャネルを固定値でスケーリングしてシフトするだけなので、それらの値を畳み込みの重みとバイアスに統合できます。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と出力されます。これは浮動小数点の丸め誤差です。融合後の単一レイヤーは、メモリを2回ではなく1回走査して、元の2つのレイヤーと同じ関数を計算します。
一般的な推論エンジン#
- TensorRT: データセンター向けGPUとJetsonモジュール用のNVIDIA製エンジンです。GPUモデルとTensorRTのバージョンを指定してプランを構築するため、どちらかが変わるとエンジンを再構築します。
- OpenVINO: Intel製CPU、内蔵GPUとディスクリートGPU、NPU向けのツールキットです。
- ONNX Runtime: ONNXモデル向けのMicrosoft製クロスプラットフォームエンジンです。CUDA、TensorRT、OpenVINO、Core MLなど、実行プロバイダーと呼ばれるハードウェアバックエンドに処理を委ねます。
- LiteRT: 旧称TensorFlow LiteのGoogle製ランタイムです。Android、組み込みLinux、マイクロコントローラーに対応し、モバイルGPUやNPU向けのデリゲートを備えています。
- Core ML: CPU、GPU、Neural Engineに処理を分散するApple製オンデバイスフレームワークです。
- vLLM: 大規模言語モデル向けのオープンソースエンジンです。リクエストのスケジューリングとアテンションキャッシュ用のページングメモリを追加し、多数のユーザーに同時に応答できます。
Ultralytics YOLO APIは読み込むファイルに基づいてエンジンを選択するため、同じpredict呼び出しで、PyTorchの.ptチェックポイント、ONNX Runtimeの.onnxファイル、TensorRTの.engineファイル、または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は、この形式を読み込むエンジンです。
- モデルサービング: 1つ以上のエンジンを、API、リクエストのバッチ処理、バージョン管理を備えたネットワークサービスとして提供します。以前はTriton Inference Serverと呼ばれていたNVIDIA Dynamo-Tritonは、TensorRT、ONNX Runtime、PyTorchのモデルに対してこの機能を提供します。
- エキスパートシステムの推論エンジン: この用語の古い意味であり、ルールベースAIにおいて、推論エンジンが前向き連鎖または後向き連鎖によって知識ベースにif-thenルールを適用するものです。










