ONNX 얼굴 모델을 TensorRT와 OpenVINO로 변환하기
InsightFace 스타일 ONNX 모델을 TensorRT engine과 OpenVINO IR로 변환하고 검증, 정밀도 선택, 벤치마크, 배포 점검까지 다루는 프로덕션 가이드입니다.
이 가이드에서 구축할 내용
대부분의 InsightFace 배포는 연구 코드, Python 서비스, 엣지 패키징 사이에서 이식성이 좋은 ONNX로 시작합니다. 프로덕션에서는 NVIDIA GPU용 TensorRT, Intel CPU/iGPU/엣지 가속기용 OpenVINO 같은 최적화 런타임이 필요합니다.
이 가이드는 ONNX 그래프 검증, 정적 입력 shape 단순화, TensorRT engine 생성, OpenVINO IR 내보내기, 두 런타임 벤치마크, 원본 ONNX와 embedding 또는 detection 출력 비교까지 안전한 절차로 정리합니다.
시작하기 전에
- 입력 이름, 입력 layout, normalization 규칙이 검증된 ONNX 모델.
- sudo 권한이 있는 Linux x86_64 서버. Ubuntu 22.04 LTS 또는 24.04 LTS를 권장합니다.
- NVIDIA GPU 대상이면 TensorRT package와 맞는 NVIDIA driver 및 CUDA toolkit.
- 프로덕션 이미지 크기, 인구 분포, 조명, 카메라 품질을 반영한 작은 validation set.
1. Linux 서버에 변환 도구 설치
깨끗한 Linux x86_64 서버에서 시작합니다. Python wheel, OpenVINO package, NVIDIA driver, CUDA, TensorRT 도구 지원이 안정적인 Ubuntu 22.04 LTS 또는 24.04 LTS가 실용적인 기본값입니다.
ONNX 유틸리티는 virtual environment에 설치하고, CPU 및 Intel device 변환에는 PyPI OpenVINO를 사용하며, TensorRT는 서버 driver 및 CUDA와 맞는 NVIDIA package를 설치합니다. 변환 artifact와 함께 버전을 보관해 production engine을 재현 가능하게 만드세요.
- TensorRT engine은 production과 같은 CUDA, TensorRT, driver family에서 빌드합니다.
- Python 도구는 virtual environment에 격리해 conversion dependency가 serving stack에 영향을 주지 않게 합니다.
- 고객 또는 production model을 변환하기 전에 verification command를 실행합니다.
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 그래프 검증
변환 전에 입력 이름이나 shape를 추측하지 말고 모델을 확인합니다. 얼굴 인식 모델 입력은 일반적으로 NCHW layout(batch, channels, height, width)의 1x3x112x112이며, detector와 swapper는 더 큰 dynamic shape를 사용할 수 있습니다.
RGB/BGR 순서, mean/std, channel layout, alignment, crop size, output post-processing을 정확히 기록하세요. Runtime 변환은 preprocessing mismatch를 해결하지 못합니다.
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. 필요한 경우 shape 단순화 및 고정
TensorRT와 OpenVINO는 그래프 shape가 명확할수록 더 잘 최적화됩니다. 고정 크기 얼굴 인식 backbone은 input shape를 고정하고, detector는 dynamic dimension을 유지한 뒤 현실적인 optimization profile을 정의합니다.
단순화 모델이 원본 ONNX와 수치적으로 가까운 출력을 내는지 검증한 뒤에만 사용하세요. 상용 배포 모델에서는 원본 ONNX와 simplified 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 class 및 driver stack에서 생성하고, source ONNX, TensorRT version, CUDA version, precision, optimization profile을 artifact와 함께 저장하세요.
현대 NVIDIA GPU에서는 대부분의 face embedding 및 face swapping workload에 FP16이 기본 선택입니다. INT8은 high-throughput detection에 유용할 수 있지만 calibration data와 더 엄격한 accuracy gate가 필요합니다.
- min/opt/max shapes는 이론적 한계가 아니라 실제 batch size에 맞춥니다.
- Detector 또는 swapper shape가 크게 다르면 주요 input family별로 engine을 유지합니다.
- Embedding cosine similarity나 detection metric이 release threshold를 넘게 drift하면 해당 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 inference, 운영 단순성이 중요한 edge box에 적합합니다.
Recognition model에서는 FP16 compression이 보통 메모리를 줄이고 throughput을 높이며 embedding drift는 작습니다. Compliance-sensitive verification 시스템에서는 production이 FP16을 쓰더라도 audit comparison용 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로 inference 실행
서비스 시작 시 compiled OpenVINO model을 한 번 로드하고 요청 간 재사용합니다. Production hardware policy에 따라 CPU, GPU, AUTO, HETERO를 선택하세요.
얼굴 인식에서는 cosine similarity 또는 matching threshold 계산 전에 ONNX baseline과 동일하게 output embedding을 normalize해야 합니다.
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. 정확도 검증 및 안전한 release
Engine이 실행된다고 변환이 끝난 것은 아닙니다. 대표 validation set에서 원본 ONNX, TensorRT, OpenVINO 출력을 비교하세요. Embedding은 cosine similarity, norm distribution, threshold impact를 보고 detector는 recall, false positive, landmark, NMS behavior를 확인합니다.
Latency, throughput, memory, accuracy가 모두 production target을 만족할 때만 artifact를 승격합니다. Release package에는 artifact metadata와 rollback instructions를 포함하세요.
- 재현 가능한 비교를 위해 고정 random seed와 안정적인 preprocessing code를 사용합니다.
- Cold start와 steady-state latency는 별도로 benchmark합니다.
- Camera quality와 face pose가 validation set과 다를 수 있으므로 production drift를 모니터링합니다.