将 ONNX 人脸模型转换为 TensorRT 与 OpenVINO
面向生产部署的完整教程:把 InsightFace 风格的 ONNX 模型转换为 TensorRT engine 和 OpenVINO IR,并覆盖校验、精度选择、基准测试与上线检查。
你将完成什么
大多数 InsightFace 部署会从 ONNX 开始,因为它便于在研究、Python 服务和边缘交付之间迁移。生产系统通常还需要优化运行时:NVIDIA GPU 选择 TensorRT,Intel CPU、iGPU 和边缘加速器选择 OpenVINO。
本教程采用安全转换流程:校验 ONNX 计算图、简化静态输入形状、构建 TensorRT engine、导出 OpenVINO IR、对两个运行时做 benchmark,并在发布前与原始 ONNX 模型比较 embedding 或检测输出。
开始之前
- 已经验证过的 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 服务器开始。Ubuntu 22.04 LTS 或 24.04 LTS 是比较实用的默认选择,因为 Python wheels、OpenVINO、NVIDIA driver、CUDA 和 TensorRT 工具链支持较好。
将 ONNX 工具安装在 virtual environment 中;CPU 和 Intel 设备转换使用 PyPI OpenVINO;TensorRT 则安装与服务器 driver 和 CUDA 匹配的 NVIDIA package。请把这些版本随转换 artifact 一起记录,保证 production engine 可复现。
- 构建 TensorRT engine 时使用与生产环境一致的 CUDA、TensorRT 和 driver 系列。
- 将 Python 工具隔离在 virtual environment 中,避免转换依赖影响 serving stack。
- 转换客户模型或生产模型前,先运行工具链验证命令。
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 numpysource .venv/bin/activate
python -m pip install openvino
ovc --help
benchmark_app --help# 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 --versionsource .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 --version2. 校验源 ONNX 计算图
转换前先检查模型,不要假设输入名或形状。人脸识别模型的输入通常为 NCHW layout(batch, channels, height, width)的 1x3x112x112;检测和换脸模型可能使用更大的动态形状。
准确记录预处理:RGB/BGR 顺序、均值和标准差、通道布局、对齐、裁剪尺寸以及输出后处理。运行时转换无法修复预处理不一致。
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)
PY3. 在合适场景下简化并固定形状
当计算图形状清晰时,TensorRT 和 OpenVINO 的优化效果更好。固定尺寸的人脸识别 backbone 可以冻结输入形状;检测模型则保留动态维度,并在后续设置真实的优化 profile。
简化后必须确认输出与原 ONNX 数值接近。对于商业交付模型,原 ONNX 与简化 ONNX 的 cosine similarity 检查应进入 CI。
python -m onnxsim models/insightface.onnx models/insightface.simplified.onnx --overwrite-input-shape input:1,3,112,1124. 构建 TensorRT engine
TensorRT engine 与硬件和 TensorRT 版本强相关。请在生产相同 GPU 类别和驱动栈上构建,并随 artifact 记录源 ONNX、TensorRT 版本、CUDA 版本、精度和优化 profile。
现代 NVIDIA GPU 上,多数人脸 embedding 和换脸工作负载默认选择 FP16。INT8 适合高吞吐检测,但需要校准数据和更严格的准确率门槛。
- min/opt/max shapes 应匹配真实 batch,而不是极端理论上限。
- 检测器或换脸模型形状差异很大时,按主要输入族维护多个 engine。
- 如果 embedding cosine similarity 或检测指标漂移超过阈值,应拒绝该 engine。
trtexec --onnx=models/insightface.simplified.onnx --saveEngine=engines/insightface_fp16.plan --minShapes=input:1x3x112x112 --optShapes=input:16x3x112x112 --maxShapes=input:32x3x112x112 --fp16 --workspace=4096 --verbosetrtexec --onnx=models/insightface.simplified.onnx --saveEngine=engines/insightface_int8.plan --minShapes=input:1x3x112x112 --optShapes=input:16x3x112x112 --maxShapes=input:32x3x112x112 --int8 --calib=calibration.cache5. 将 ONNX 转换为 OpenVINO IR
OpenVINO IR 由 XML 与 BIN 文件组成,可通过 OpenVINO runtime 部署。它适合 CPU 密集服务、Intel GPU 推理,以及更重视运维简单性的边缘盒子。
对识别模型而言,FP16 压缩通常能降低内存并提升吞吐,embedding 漂移很小。合规敏感的验证系统即使生产使用 FP16,也建议保留 FP32 artifact 用于审计对比。
ovc models/insightface.simplified.onnx --output_model openvino/insightface.xml --input "input[1,3,112,112]" --compress_to_fp16=Truebenchmark_app -m openvino/insightface.xml -d CPU -shape "input[16,3,112,112]" -hint throughput6. 使用 OpenVINO 推理
服务启动时加载一次 compiled OpenVINO model,并在请求之间复用。根据生产硬件策略选择 CPU、GPU、AUTO 或 HETERO。
做人脸识别时,在计算 cosine similarity 或匹配阈值前,必须与 ONNX baseline 一样规范化输出 embedding。
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、误检、landmark 和 NMS 行为。
只有延迟、吞吐、内存和准确率都满足生产目标时,才提升转换 artifact。发布包中应包含 artifact 元数据和回滚说明。
- 使用固定随机种子和稳定预处理代码,确保对比可复现。
- 冷启动和稳态延迟要分开 benchmark。
- 监控生产漂移,因为摄像头质量和人脸姿态可能与验证集不同。