一句话定义
部署把训练框架里的模型搬到目标硬件上稳定运行:经导出(ONNX)与编译优化(TensorRT 等推理引擎),配合量化(FP32 → INT8)、剪枝与蒸馏压缩体积与时延,工程核心是保证「部署后的精度与训练侧口径一致」。
为什么重要
模型不部署就没有价值,而「实验室 mAP」与「产线 mAP」之间的鸿沟是视觉工程最昂贵的意外来源:预处理不一致、量化掉点、NMS 实现差异,任何一处都能让离线 52% 的模型上线只剩 40%。掌握部署全链路,才能对「能不能实时、能便宜多少」给出负责任的回答。
直观类比
部署像把一位名厨(训练框架)的菜谱交给连锁店后厨(推理硬件)执行:先誊写成标准作业书(ONNX 导出),再按门店灶具重新设计火候(引擎编译与算子融合);量化是把「精确到克」的配方改成「精确到勺」——出品更快、食材更省,但要先试菜(校准)确认客人吃不出差别。
前置知识
kp-026(训练与评估协议);kp-018(检测模型的输入输出形态)。
核心概念
- 导出(Export):PyTorch 动态图 → 静态 ONNX 计算图,是跨框架部署的中转格式。
- 推理引擎:TensorRT(NVIDIA)、OpenVINO(Intel/嵌入式 CPU)、CoreML(Apple)、NCNN/MNN(移动端)。
- 量化(Quantization):FP32 权重与激活映射到低比特整数;PTQ 训练后量化只需校准数据,QAT 量化感知训练在训练中模拟量化。
- 对称/非对称量化:scale 与零点 zero-point 把浮点区间线性映射到整数区间。
- 剪枝(Pruning):删除不重要的通道/权重后微调恢复。
- 知识蒸馏(Distillation):小模型学习大模型的软标签与特征,小数据下涨点明显。
- 预处理一致性:BGR/RGB、归一化系数、letterbox 缩放与填充色,必须与训练管线逐项对齐。
- 指标口径:时延看 P99 而非均值,吞吐受 batch 与流水线影响,精度用部署引擎重跑评测集。
原理与机制
INT8 量化的数学本质是仿射映射:浮点张量 x 经 scale s 与零点 z 映射为整数 q = round(x/s) + z,推理中的卷积/矩阵乘全部落到整数指令(INT8 Tensor Core/DSP/NPU),时延与功耗成倍改善;PTQ 用几百张校准图统计各层激活范围确定 s、z,代价是约 0.5–2 个点的精度损失(检测头与后处理更敏感),掉点超限则上 QAT。工程链路:PyTorch 导出 ONNX → 引擎 builder 编译为硬件专属引擎文件(算子融合、内核自动调优)→ 运行时绑定输入输出张量。最容易翻车的不是算子而是「口径」:训练用 RGB/0–1 归一化、部署用了 BGR/0–255,指标静默掉十几个点;letterbox 的填充色与训练不一致同理。
公式与模型
量化: q = round(x / s) + z , 反量化: x ≈ s·(q − z)
对称量化: s = max(|x|) / (q_max − q_min) / 2 的简化形式(z = 0)
有效比特吞吐对比: INT8 相对 FP32 常见 2 至 4 倍时延收益(视硬件)图示
实例与案例
实时检测上 Jetson:YOLOv8s 经 TensorRT FP16 得约 2 倍提速,再 INT8 PTQ 校准后 mAP 掉 0.8 个点、时延再减半,达标上线;掉点超限时对检测头保留 FP16 混合精度。手机端 OCR:NCNN + INT8 + 剪枝后的轻量骨干,端上冷启动毫秒级。服务端吞吐:视频流多路分析用动态 batch 提高吞吐,但单路时延随之上升——批大小是时延/吞吐的显式旋钮。
# TensorRT 风格推理(伪代码骨架)
engine = build_engine('model.onnx', fp16=True, int8=True, calib=Calibrator(images[:500]))
ctx = engine.create_execution_context()
pre = letterbox(img, size=640, color=114).astype('float32') / 255.0 # 与训练管线一致
out = ctx.execute([pre])
boxes = nms(decode(out), conf=0.25, iou=0.5)常见误区
- 只报平均时延:长尾卡顿(P99)才决定实时体验,必须测分位与时延分布。
- 量化不做精度回归:PTQ 后必须在评测集重跑完整指标(含 NMS 后 mAP),不能只看顶层相似度。
- 预处理口径漂移:色彩顺序、归一化、letterbox 填充色与训练不一致,是最常见的静默掉点来源。
- 把 FLOPs 当时延:访存密集算子的真实时延与 FLOPs 脱节,压缩收益必须实测目标硬件。
- 忽略 warmup:引擎首次推理含编译与显存分配,benchmark 必须预热后计时。
与其他知识点的关系
被部署对象是 kp-018/019 训练出的检测与分割模型;「部署侧重跑评测」是 kp-026 评估纪律在部署侧的延伸;端上人脸比对类应用须遵守 kp-031 的合规边界。
自测题
- PTQ 与 QAT 的取舍原则是什么?
答案要点:PTQ 零训练成本、掉点通常可接受时优先;掉点超限或部署精度敏感(检测头/后处理)再上 QAT。
- 「实验室 mAP 52%、上线 41%」最可能的排查顺序?
答案要点:先查预处理口径(色彩/归一化/letterbox),再查后处理(NMS 参数/解码),最后量化掉点回归;每步用部署引擎重跑评测定位。
- 为什么 benchmark 要预热并报 P99?
答案要点:首次推理含编译与内存分配不计入稳态;平均时延掩盖长尾卡顿,实时性承诺应基于分位数。
延伸阅读
- Jacob 2018《Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference》
- Hinton 2015《Distilling the Knowledge in a Neural Network》