← ガイドに戻る
ONNXTensorRTOpenVINOデプロイ

ONNX 顔モデルを TensorRT と OpenVINO に変換する

InsightFace 形式の ONNX モデルを TensorRT engine と OpenVINO IR に変換し、検証、精度選択、ベンチマーク、本番リリース確認まで扱う実践ガイドです。

12 分で読めます

このガイドで作るもの

多くの InsightFace デプロイは、研究環境、Python サービス、エッジ配布で扱いやすい ONNX から始まります。本番では NVIDIA GPU 向けに TensorRT、Intel CPU/iGPU/エッジ向けに OpenVINO が必要になることが多いです。

このガイドでは、ONNX グラフ検証、静的形状の簡略化、TensorRT engine 作成、OpenVINO IR 書き出し、ベンチマーク、元の ONNX 出力との比較までを安全な手順としてまとめます。

始める前に

  • 入力名、入力レイアウト、正規化規則が確認済みの ONNX モデル。
  • Linux x86_64 サーバー。Ubuntu 22.04 LTS または 24.04 LTS と sudo 権限を推奨します。
  • NVIDIA GPU 向けの場合、TensorRT package と一致する NVIDIA driver と CUDA toolkit。
  • 本番の画像サイズ、人物分布、照明、カメラ品質を反映した小さな検証セット。

1. Linux サーバーに変換ツールをインストールする

クリーンな Linux x86_64 サーバーから始めます。Python wheel、OpenVINO、NVIDIA driver、CUDA、TensorRT ツールのサポートが安定しているため、Ubuntu 22.04 LTS または 24.04 LTS が実用的な標準です。

ONNX ユーティリティは virtual environment に入れ、CPU と Intel デバイス向け変換には PyPI の OpenVINO を使い、TensorRT はサーバーの driver と CUDA に合う NVIDIA パッケージを入れます。変換 artifact と一緒にバージョンを保存し、production engine を再現できるようにします。

  • TensorRT engine は production と同じ CUDA、TensorRT、driver 系でビルドします。
  • Python ツールは virtual environment に分離し、serving stack に影響しないようにします。
  • 顧客モデルや production モデルを変換する前に検証コマンドを実行します。
Install Python ONNX tools
sudo apt-get update
sudo apt-get install -y python3 python3-venv python3-pip build-essential
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install onnx onnxsim onnxruntime numpy
Install OpenVINO CLI tools
source .venv/bin/activate
python -m pip install openvino
ovc --help
benchmark_app --help
Install TensorRT CLI tools
# Install an NVIDIA driver and CUDA version supported by your TensorRT package first.
# Then download the matching TensorRT tar package from NVIDIA Developer.
tar -xzf TensorRT-10.*.Linux.x86_64-gnu.cuda-12.*.tar.gz
export TENSORRT_HOME=$PWD/TensorRT-10.*
export PATH=$TENSORRT_HOME/bin:$PATH
export LD_LIBRARY_PATH=$TENSORRT_HOME/lib:$LD_LIBRARY_PATH
trtexec --version
Verify the conversion toolchain
source .venv/bin/activate
python - <<'PY'
import onnx
import onnxruntime
import openvino
print("onnx", onnx.__version__)
print("onnxruntime", onnxruntime.__version__)
print("openvino", openvino.__version__)
PY
trtexec --version

2. ソース ONNX グラフを検証する

変換前に、入力名や形状を推測せずモデルを確認します。顔認識モデルの入力は通常 NCHW layout(batch, channels, height, width)の 1x3x112x112 で、検出器やスワッパーではより大きな動的形状を使う場合があります。

RGB/BGR 順序、平均と標準偏差、チャネルレイアウト、アラインメント、クロップサイズ、出力後処理を正確に記録してください。ランタイム変換では前処理の不一致は修正できません。

Inspect inputs and outputs
python - <<'PY'
import onnx
from onnx import checker

model_path = "models/insightface.onnx"
model = onnx.load(model_path)
checker.check_model(model)
print("IR version:", model.ir_version)
print("Inputs:")
for item in model.graph.input:
    shape = [dim.dim_value or dim.dim_param for dim in item.type.tensor_type.shape.dim]
    print(" ", item.name, shape)
print("Outputs:")
for item in model.graph.output:
    shape = [dim.dim_value or dim.dim_param for dim in item.type.tensor_type.shape.dim]
    print(" ", item.name, shape)
PY

3. 必要に応じて形状を固定し簡略化する

TensorRT と OpenVINO は、グラフ形状が明確なほど最適化しやすくなります。固定サイズの顔認識 backbone では入力形状を固定し、検出器では動的次元を残して後で現実的な optimization profile を定義します。

簡略化後は、簡略化モデルが元の ONNX と数値的に近い出力を返すことを検証してください。商用出荷モデルでは、cosine similarity チェックを CI に含めるべきです。

Simplify a fixed-size recognition model
python -m onnxsim models/insightface.onnx models/insightface.simplified.onnx   --overwrite-input-shape input:1,3,112,112

4. TensorRT engine を構築する

TensorRT engine はハードウェアと TensorRT バージョンに依存します。本番と同じ GPU クラス、ドライバ、CUDA スタックで構築し、元 ONNX、TensorRT バージョン、CUDA バージョン、精度、optimization profile を artifact と一緒に保存します。

最新の NVIDIA GPU では、ほとんどの顔 embedding と顔交換ワークロードで FP16 が標準的な本番選択です。INT8 は高スループット検出に有効ですが、キャリブレーションデータと厳格な精度ゲートが必要です。

  • min/opt/max shapes は理論上限ではなく実際の batch size に合わせます。
  • 検出器やスワッパーの入力形状が大きく異なる場合は、主要な入力ファミリーごとに engine を分けます。
  • embedding cosine similarity や検出指標がリリース閾値を超えて悪化した engine は採用しません。
Build an FP16 TensorRT engine
trtexec   --onnx=models/insightface.simplified.onnx   --saveEngine=engines/insightface_fp16.plan   --minShapes=input:1x3x112x112   --optShapes=input:16x3x112x112   --maxShapes=input:32x3x112x112   --fp16   --workspace=4096   --verbose
Optional INT8 engine with calibration cache
trtexec   --onnx=models/insightface.simplified.onnx   --saveEngine=engines/insightface_int8.plan   --minShapes=input:1x3x112x112   --optShapes=input:16x3x112x112   --maxShapes=input:32x3x112x112   --int8   --calib=calibration.cache

5. ONNX を OpenVINO IR に変換する

OpenVINO IR は XML と BIN で構成され、OpenVINO runtime からデプロイできます。CPU 中心のサービス、Intel GPU 推論、運用のシンプルさを重視する edge box に適しています。

認識モデルでは、FP16 圧縮によりメモリを削減しスループットを改善でき、embedding のドリフトは通常小さくなります。監査が重要な検証システムでは、本番が FP16 でも比較用 FP32 artifact を残してください。

Convert to OpenVINO IR
ovc models/insightface.simplified.onnx   --output_model openvino/insightface.xml   --input "input[1,3,112,112]"   --compress_to_fp16=True
Benchmark OpenVINO throughput
benchmark_app   -m openvino/insightface.xml   -d CPU   -shape "input[16,3,112,112]"   -hint throughput

6. OpenVINO で推論する

サービス起動時に compiled OpenVINO model を一度ロードし、リクエスト間で再利用します。本番ハードウェア方針に合わせて CPU、GPU、AUTO、HETERO を選択します。

顔認識では、cosine similarity や照合閾値を計算する前に、ONNX baseline と同じ方法で出力 embedding を正規化します。

Minimal OpenVINO Python inference
from openvino import Core
import numpy as np

core = Core()
compiled = core.compile_model("openvino/insightface.xml", "CPU")
input_layer = compiled.input(0)
output_layer = compiled.output(0)

batch = np.random.rand(16, 3, 112, 112).astype("float32")
embeddings = compiled([batch])[output_layer]
print(embeddings.shape)

7. 精度を検証し安全にリリースする

engine が動くだけでは変換完了ではありません。代表的な検証セットで元 ONNX、TensorRT、OpenVINO の出力を比較します。Embedding では cosine similarity、norm 分布、閾値影響を、検出では recall、false positive、landmark、NMS を確認します。

レイテンシ、スループット、メモリ、精度がすべて本番目標を満たした場合だけ artifact を昇格します。artifact metadata と rollback 手順をリリースパッケージに含めてください。

  • 固定 random seed と安定した前処理コードで比較を再現可能にします。
  • cold start と steady-state latency は別々に benchmark します。
  • カメラ品質や顔姿勢は検証セットと異なるため、production drift を監視します。

本番デプロイの支援が必要ですか?

モデルライセンス、ランタイム最適化、対象ハードウェアへのデプロイ支援について InsightFace にご相談ください。

お問い合わせ