真实面经题目 · 原创解析
训练好的 AI 模型线上推理延迟高时,如何用量化、剪枝、TensorRT 和服务链路优化提速?
这道题考模型部署优化。高质量回答要先定位瓶颈,再分模型压缩、推理引擎、GPU 执行、批处理和服务链路逐层优化,并说明精度、吞吐、P99 延迟和稳定性的取舍。
真实面经题目 · 原创解析
这道题考模型部署优化。高质量回答要先定位瓶颈,再分模型压缩、推理引擎、GPU 执行、批处理和服务链路逐层优化,并说明精度、吞吐、P99 延迟和稳定性的取舍。
我不会一上来就量化,先用 profiling 把延迟拆成预处理、模型前向、后处理、排队、网络和冷启动,并分别看 P50、P95、P99、吞吐、GPU 利用率、显存和错误率。模型侧可以做 FP16、INT8 或 INT4 量化,配合校准集验证精度损失;剪枝要区分结构化剪枝和非结构化剪枝,最好和微调、蒸馏一起做,否则稀疏不一定带来真实加速。部署侧可用 TensorRT 做算子融合、kernel 选择、常量折叠和 engine 编译,注意动态 shape、算子不支持和精度回退。服务侧要优化 batch、异步队列、并发模型实例、缓存、预热、连接复用、超时降级和自动扩缩容。验证时不能只看平均延迟,还要看精度回归、P99、峰值流量、冷启动、成本和回滚方案。
线上延迟可能来自模型计算,也可能来自排队、输入解码、特征读取、后处理、网络、序列化或下游依赖。第一步应打点拆分端到端链路,记录 pre-process、inference、post-process、queue wait、RPC、cache、GPU kernel 时间和 batch 等待时间。只有确认瓶颈在模型前向时,量化、剪枝和 TensorRT 才是主战场。
量化通过降低权重和激活精度减少计算和访存,常见有 FP16、BF16、INT8、INT4。INT8 通常需要代表性校准集或量化感知训练,低比特量化要重点验证长尾输入和边界类别。剪枝通过删除不重要的通道、层、头或神经元降低计算量,但非结构化稀疏如果硬件和引擎不支持,可能只减少参数不减少延迟。蒸馏适合用小模型逼近大模型输出,在延迟要求很硬时比单纯剪枝更可控。
TensorRT 的价值在于把训练框架图转换成更适合 GPU 推理的 engine,做算子融合、内存规划、kernel auto-tuning、精度选择和常量折叠。它对固定 shape 或少量 profile 的场景效果更稳定;动态 shape 很多时,engine 数量、编译时间和性能回退都要管理。还要关注不支持算子、插件实现、CPU fallback、输入输出拷贝和预处理是否仍在 Python 层。
模型变快不代表线上体验一定变好。批处理能提升吞吐,但 batch 等待会拉高单请求延迟;并发实例能提升利用率,但会争抢显存和导致上下文切换;缓存能省计算,但要处理版本和一致性。服务层要有请求队列上限、超时、熔断、降级模型、预热池、连接复用、异步后处理和弹性扩容。验收时应在真实流量分布下压测,确认精度下降在可接受范围内,P99 达标,成本下降,异常时能自动回滚。
不一定。FP16/BF16 通常影响较小,INT8 需要校准集或量化感知训练,INT4 风险更高。关键是用代表线上分布的样本做回归,分整体指标和长尾切片看精度、召回、置信度校准和业务指标变化。
如果只是非结构化地把权重置零,普通 GPU kernel 仍然按 dense 矩阵计算,就不会明显变快。真正推理加速通常需要结构化剪枝、稀疏 kernel 支持、重新导出模型和引擎重编译。
常见问题包括动态 shape 太多、存在不支持算子、插件实现慢、精度回退到 FP32、CPU fallback、输入输出拷贝过多,以及 engine 没有预热。排查时要看 engine 构建日志、layer profile 和实际 kernel 时间。
重点查排队、冷启动、batch 等待、显存抖动、GC、下游依赖超时和流量突刺。P99 问题常常不是模型单次计算慢,而是资源竞争和队列控制不好,需要限流、隔离、预热和超时降级。