01 它是干嘛的
TensorRT 是面向推理(也就是「使用模型」)的加速引擎。它把一个训练好的模型编译成针对特定显卡深度优化的「引擎」,通过算子融合、精度量化和内核自动调优,把延迟和显存占用降下来,让同样的硬件能承载更多请求。
02 为什么会有它
2016 年之前:模型训练完就能用,但线上跑起来又慢又贵
训练出来的模型直接上线,往往慢得让人意外:用户等好几秒才拿到结果,服务器要堆很多台才能扛住访问量,机房账单居高不下。原因是训练框架为了通用,做了大量「没说出口的额外工作」。
比如一个简单的运算链,框架会把它拆成很多个小步骤,每一步都要把中间结果写进显存再读出来,读写次数一多,时间就全耗在「搬数据」而不是「算数据」上。
TensorRT 的思路是「为部署而重写」:既然上线后模型不会变,那就提前把它编译成一份只为这台显卡优化的方案——该合并的步骤合并、该降低的精度降低、该调优的参数调优。模型没变,速度却能提升好几倍。
03 它怎么工作
TensorRT 拿到模型后会做一趟「编译」:把零散的小运算合并成大的、把高精度的数字换成更省的低精度、再为这块具体的显卡挑选最快的实现方式,最后产出可直接加载的推理引擎。
让推理变快的三招:算子融合、精度量化、内核自动调优
- 1① 导入模型并解析结构
读取 ONNX 等格式的模型文件,把它拆解成一张「算子和连接关系」的计算图。
- 2② 算子融合
把能合并的小运算(如卷积加激活加归一化)合成一个更大的算子,减少中间结果反复读写显存,这是提速的关键一招。
- 3③ 精度量化
把模型参数从高精度浮点(FP32)压成半精度(FP16)甚至八位整数(INT8)。同样的硬件上,算得更快、占的显存更少。
- 4④ 内核自动调优
同一个运算有很多种实现算法,TensorRT 会在目标显卡上实测各种方案,挑出最快的那一种并记录下来。
- 5⑤ 生成引擎并加载部署
输出一份针对该显卡优化的引擎文件,线上加载后即可高速推理,无需再编译。
04 谁在用它
同一个模型推理提速数倍,意味着同样的显卡能服务更多用户,直接降低单次成本。
语音识别、实时翻译、推荐打分等对延迟敏感的场景,把响应时间压到毫秒级。
算力有限的车载、机器人、摄像头设备上,用低精度量化换取可运行的体积与速度。
对语言模型的矩阵运算做融合与量化,缓解显存占用并提高每秒生成的字数。
05 怎么用
通常不需要写代码:用命令行工具把模型转成引擎即可;要进一步压榨性能再写 API 调优。
- 01准备一个训练好的模型,导出为 ONNX 等通用交换格式。
- 02用官方命令行工具 trtexec 把模型编译成引擎,先不量化跑通再说。
- 03确认可用后逐步开启 FP16、再做 INT8 量化,用校准数据保证精度损失可接受。
- 04在代码中加载生成的引擎文件,构造输入、执行推理、取回输出。
- 05用推理能力对比优化前后的延迟与准确率,确认收益与代价。
# 把 ONNX 模型转成 TensorRT 引擎,并启用 FP16 半精度
trtexec --onnx=model.onnx \
--saveEngine=model-fp16.plan \
--fp16 \
--workspace=4096
# 进一步做 INT8 量化(需先用校准数据生成校准表)
trtexec --onnx=model.onnx \
--saveEngine=model-int8.plan \
--int8 \
--calib=calibration.cache避坑提示
- !量化一定伴随精度损失,务必用真实业务数据跑一遍对比,别只看速度上的提升。
- !引擎文件与显卡型号、TensorRT 版本强绑定,换设备往往要重新编译,别当成可随意复制的模型文件。
- !先跑通精度不受损的 FP16,再考虑 INT8;一上来就重度量化,排查问题会非常痛苦。
06 关键概念
- 推理(Inference)
- 让训练好的模型对输入给出输出,也就是线上「使用模型」的过程。
- 算子融合
- 把多个小运算合并成一个大运算,减少中间结果反复读写显存的开销。
- 量化
- 把高精度数字换成更省的低精度数字,用可接受的精度损失换速度和显存。
- INT8 / FP8
- 用八位整数或八位浮点表示原本更占空间的数字,是常见的低精度方案。