← 返回教程
ONNXTensorRTOpenVINO部署

将 ONNX 人脸模型转换为 TensorRT 与 OpenVINO

面向生产部署的完整教程:把 InsightFace 风格的 ONNX 模型转换为 TensorRT engine 和 OpenVINO IR,并覆盖校验、精度选择、基准测试与上线检查。

12 分钟阅读

你将完成什么

大多数 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。
  • 转换客户模型或生产模型前,先运行工具链验证命令。
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 可以冻结输入形状;检测模型则保留动态维度,并在后续设置真实的优化 profile。

简化后必须确认输出与原 ONNX 数值接近。对于商业交付模型,原 ONNX 与简化 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 类别和驱动栈上构建,并随 artifact 记录源 ONNX、TensorRT 版本、CUDA 版本、精度和优化 profile。

现代 NVIDIA GPU 上,多数人脸 embedding 和换脸工作负载默认选择 FP16。INT8 适合高吞吐检测,但需要校准数据和更严格的准确率门槛。

  • min/opt/max shapes 应匹配真实 batch,而不是极端理论上限。
  • 检测器或换脸模型形状差异很大时,按主要输入族维护多个 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 推理,以及更重视运维简单性的边缘盒子。

对识别模型而言,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、误检、landmark 和 NMS 行为。

只有延迟、吞吐、内存和准确率都满足生产目标时,才提升转换 artifact。发布包中应包含 artifact 元数据和回滚说明。

  • 使用固定随机种子和稳定预处理代码,确保对比可复现。
  • 冷启动和稳态延迟要分开 benchmark。
  • 监控生产漂移,因为摄像头质量和人脸姿态可能与验证集不同。

需要生产部署支持?

联系 InsightFace,获取模型授权、运行时优化和目标硬件部署支持。

联系我们