TensorRT模型优化实战:从安装到加速推理全流程
为什么你需要用 TensorRT 优化模型?
训练好的深度学习模型在推理时,往往无法直接发挥 GPU 的全部算力。
TensorRT 是 NVIDIA 推出的推理优化工具,通过层融合、精度校准和内核自动调优等手段,将模型转换为高度优化的引擎文件,推理速度可以提升数倍甚至数十倍。
本文面向零基础用户,带你手把手完成一次完整的 TensorRT 模型优化流程,包含安装、转换、排错和效果验证。
环境搭建与依赖检查
TensorRT 对系统环境有明确要求,建议先确认以下组件版本是否正确。
# 查看 CUDA 版本
nvidia-smi
# 或者
nvcc --version
CUDA 版本必须与 TensorRT 对应(例如 TensorRT 8.x 支持 CUDA 11.x)。
接着安装 cuDNN,并在系统路径中正确配置。
下载 TensorRT 时选择与系统一致的 .tar 包(适用于 Linux)或 Windows 安装程序。
解压后配置环境变量:
export LD_LIBRARY_PATH=/path/to/TensorRT/lib:$LD_LIBRARY_PATH
export PATH=/path/to/TensorRT/bin:$PATH
验证安装:运行 trtexec --help,如果显示帮助信息,说明安装成功。
模型转换实操
假设你有一个 ONNX 格式的模型 model.onnx,使用 trtexec 可以一键转换为 TensorRT 引擎(默认生成 .plan 文件)。
trtexec --onnx=model.onnx --saveEngine=model.plan --fp16
--fp16开启半精度推理,能进一步提升速度,精度损失通常可忽略。- 如果模型输入尺寸动态,需要指定
--minShapes、--optShapes和--maxShapes。
若希望用 Python 进行更灵活的控制,可以使用 TensorRT Python API:
import tensorrt as trt
trt_logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(trt_logger)
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
parser = trt.OnnxParser(network, trt_logger)
with open("model.onnx", "rb") as f:
parser.parse(f.read())
config = builder.create_builder_config()
config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 << 30) # 1GB
config.set_flag(trt.BuilderFlag.FP16)
engine = builder.build_serialized_network(network, config)
with open("model.plan", "wb") as f:
f.write(engine)
运行后会在当前目录生成 model.plan。
优化过程中的常见陷阱
1. 版本不匹配:CUDA、cuDNN 和 TensorRT 三者版本必须严格对应。
安装前先查阅 NVIDIA 官方兼容性表格。
2. 动态形状支持:如果模型输入尺寸变化(如 NLP 任务),必须正确配置 --minShapes 等参数,否则可能转换失败或推理时崩溃。
3. 精度问题:使用 FP16 或 INT8 时,部分模型精度下降明显。
建议先在验证集上对比输出误差(例如使用 cosine similarity),若超出容忍范围,回退到 FP32。
4. 内存不足:转换时工作空间设置过大会导致 OOM。
使用 --workspace=1024(单位 MB)或 Python 中的 set_memory_pool_limit 适当控制。
加速效果验证
加载生成的引擎文件,测试推理延迟(单位 ms)。
可以使用 trtexec 直接跑性能测试:
trtexec --loadEngine=model.plan --shapes=input:1x3x224x224 --iterations=100 --warmUp=10
关注输出中的 mean 延迟。
与原始 ONNX 模型(使用 ONNX Runtime)对比,可以看到明显提升。
也可以编写简单 Python 脚本记录前后时间差:
import time
import tensorrt as trt
import numpy as np
# 加载引擎... 此处省略
start = time.time()
for _ in range(100):
# 执行推理
pass
end = time.time()
print(f"平均延迟: {(end-start)/100*1000:.2f} ms")
对比优化前的推理时间,通常能获得 2-5 倍加速。
高频问题解答
Q:转换时提示“Unsupported ONNX node”怎么办?
A:查看具体节点类型,可能需要使用 tf2onnx 或 onnx-simplifier 简化模型,或者自定义插件。
Q:有没有可视化工具?
A:可以使用 trtexec --dumpLayerInfo 或 NVIDIA Nsight 进行性能分析。
Q:优化后的模型只能在相同 GPU 上运行吗?
A:引擎文件与 GPU 架构绑定(如 SM 版本),换卡后需重新转换。
如果你正在处理 TensorRT 模型优化,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。