简介:TensorRT 7.2.3.4 是 NVIDIA 推出的高性能深度学习推理优化库,该版本面向 Windows10 x86-64 平台,匹配 CUDA 11.0 与 cuDNN 8.1,主要用于解决深度学习模型在 GPU 上推理速度慢、延迟高的问题,适合自动驾驶、视频分析、智能物联网等实时推理场景。压缩包内共 367 个文件,约 493MB,包含约 67 个头文件与 47 个 C++ 源码,便于开发者理解 API 并二次开发;50 个 batch 校准文件和 3 个 wts 权重文件用于模型量化;13 个 Python 脚本辅助模型转换与自动化处理;26 个 Markdown 与 8 个 PDF 文档提供使用说明;还带有 Visual Studio 工程(sln/vcxproj)、lib/dll 动态库、onnx/caffemodel/uff 等模型文件,基本构成一套完整的 TensorRT 部署工具链。目前已有 186 人学习下载。开发者可借此快速搭建开发环境,参考示例工程与官方文档,把 Caffe、TensorFlow、ONNX 等模型转换为 TensorRT 引擎。再通过层融合、精度校准、多 GPU 分配等手段提升推理性能,降低显存占用,在实时业务场景中落地高效 AI 服务。
1. TensorRT-7.2.3.4.Windows10.x86-64.cuda-11.0.cudnn8.1.zip 到底在装什么
先给一个反直觉结论:TensorRT 7.2.3.4 这个包根本不需要 setup 安装,解压即用。文件名里那串TensorRT-7.2.3.4.Windows10.x86-64.cuda-11.0.cudnn8.1.zip已经把兼容性边界写死在名字上了——它绑定 CUDA 11.0 和 cuDNN 8.1,只能在 64 位 Windows 10 环境里跑。很多人在这一步栽跟头,不是因为不会解压,而是没搞明白 TensorRT 和 CUDA、cuDNN 三者是独立的。TensorRT 只是推理加速库,它依赖 CUDA 运行时和 cuDNN 的 DLL,但不会替你装驱动,也不会覆盖你已有的 CUDA 安装。
这篇文章解决三类实际问题:老项目被锁在 CUDA 11.0 上想上 TensorRT;新机器要装一个和现有 CUDA 版本匹配的 TensorRT;以及装完之后怎么用 trtexec 和 Python API 把模型转成 engine 并跑起来。适合在 Windows 上做推理优化、部署的工程师,如果你是拿 Linux 服务器跑推理,这个 zip 包不适用,去找对应平台的 tar 包。开始之前先确认一件事:你的显卡驱动版本是否支持 CUDA 11.0,这个决定你后面要不要装低版本 CUDA。
2. 先对齐运行环境:CUDA 11.0 与 cuDNN 8.1 的版本匹配检查
TensorRT 不会做系统级登记,它只是在你跑推理时加载 CUDA 和 cuDNN 的动态库。所以环境对齐是第一步,也是最容易忽略的一步。Windows 上常见的问题是:驱动太新,CUDA 版本太老;或者 CUDA 装好了,cuDNN 版本不对,导致 TensorRT 加载cudnn64_8.dll失败。这一章把检查方法和安装顺序讲清楚。
2.1 查看 cuda cudnn 版本的三条命令
先看你机器上真实的 CUDA 运行时版本,而不是看环境变量里写的是什么。打开 CMD,依次执行:
nvidia-smi输出右上角的 CUDA Version 表示当前驱动支持的最高 CUDA 版本,不代表你装了 CUDA Toolkit。如果这里显示的是 12.x,而你项目里要求 CUDA 11.0,显卡驱动本身是可以向下兼容运行时的,但这取决于驱动分支。NVIDIA 从 CUDA 11 开始推行驱动新老兼容策略,较新的驱动通常仍能运行 CUDA 11 的应用程序,但个别专业卡和特挑驱动分支会有限制。
nvcc --version这个命令输出的是 CUDA Toolkit 编译器版本。如果提示nvcc 不是内部或外部命令,说明 CUDA Toolkit 没装或者没加入 PATH,但 TensorRT 运行时不强制需要 nvcc,它只依赖 CUDA 运行时库。你的机器上如果已经装了 CUDA 12,再装 CUDA 11.0 需要手动处理 PATH 优先级,常见做法是安装到不同目录,然后在项目脚本里显式指定路径。
再看 cuDNN 版本。Windows 上 cuDNN 是以文件形式存在的,没有注册表信息,需要打开目录确认:
type C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include\cudnn_version.h如果文件不存在,说明你的 cuDNN 只是简单拷贝或者没装全。这个头文件里会定义CUDNN_MAJOR、CUDNN_MINOR、CUDNN_PATCHLEVEL三个宏,对应 8.1.x 中的 8、1、x。老版本 cuDNN 可能没有这个头文件,只有cudnn.h,那就直接看文件版本属性:右键cudnn64_8.dll,在详细信息里查看文件版本。
2.2 安装顺序与版本对应关系
| 组件 | 版本 | 作用 | 安装方式 |
|---|---|---|---|
| 显卡驱动 | 不低于 451.x | 提供 CUDA 驱动 API | exe 安装,全局生效 |
| CUDA Toolkit | 11.0 | 提供 nvcc 与运行时库 | exe 安装,自定义目录 |
| cuDNN | 8.1 | 深度神经网络加速库 | 解压后拷贝到 CUDA 目录 |
| TensorRT | 7.2.3.4 | 推理优化与 engine 生成 | 解压 zip 即用 |
安装顺序我一般固定为:驱动 → CUDA Toolkit → cuDNN → TensorRT。驱动装完先重启再继续,不然nvidia-smi可能读不到 GPU。CUDA Toolkit 安装时不要勾选 Visual Studio Integration,TensorRT 7.2.3.4 这个年代的版本对 VS 版本敏感,集成失败反而会影响后续编译。
cuDNN 的安装方式很机械:解压后把bin、include、lib三个目录里的文件,分别复制到 CUDA 11.0 安装目录对应的同名目录下。注意不要只复制 DLL,cudnn_ops_infer64_8.dll、cudnn_ops_train64_8.dll、cudnn_cnn_infer64_8.dll这些文件在 TensorRT 推理时会被调用,漏一个就报错。复制完成后可以用 2.1 节的命令验证版本。
2.3 Windows10 原生环境与 WSL2 的边界
很多人查资料时看到 WSL2 里能跑 CUDA,就想着把 TensorRT 也扔进去。这个 zip 包不能在 WSL2 里用。WSL2 虽然共享 Windows 的 GPU 驱动,但它内部的 CUDA 库是 Linux 版,需要下载 Linux 平台的 TensorRT tar 包。Windows 原生环境使用这个 zip 包时,也要注意 32 位应用调用不到 64 位 DLL,Python 解释器必须用 64 位版本。
另外提醒一句,如果你用的是 RTX 4060 Ti 这类新卡,先查驱动是否支持 CUDA 11.0。新卡通常需要新驱动,而新驱动一般不会提供对老 CUDA 运行时的完整兼容测试。遇到加载失败时,第一反应不应该是怀疑 TensorRT,而是先用nvidia-smi确认驱动版本,再决定要不要换驱动分支。
3. 解压后的目录结构与最小可运行验证
zip 包解压后,目录结构和 Linux 版略有差异,但核心组成一致。很多人解压完直接找setup.exe,找不到就开始怀疑包损坏,其实是没理解 TensorRT 的分发方式。这一章从目录用途讲起,然后给一个最快验证路径。
3.1 解压后先看这四个目录
解压到纯英文路径,比如D:\TensorRT-7.2.3.4。目录里值得关注的是bin、include、lib、samples四个子目录。
bin:包含trtexec.exe、polygraphy.exe等命令行工具。trtexec.exe是你最常用的工具,负责模型转换和 benchmark。include:C++ API 的头文件。你写 C++ 推理代码时,头文件路径指向这里。lib:核心库文件,包含nvinfer.dll、nvinfer_plugin.dll、nvparsers.dll以及对应的lib文件。samples:官方示例代码,里面能参考sampleOnnxMNIST的 C++ 实现,以及trtexec的完整调用方式。
python目录在 7.2.3.4 这个版本里通常不直接出现在根目录,而是打包在python\tensorrt-7.2.3.4-cp37-none-win_amd64.whl。如果你解压后没找到,直接搜索*.whl文件,用 pip 安装即可。
3.2 配置 PATH 与最小验证命令
把D:\TensorRT-7.2.3.4\lib和D:\TensorRT-7.2.3.4\bin加入系统 PATH。这一步很关键,TensorRT 运行时需要通过 PATH 找到nvinfer.dll,否则 Python 里import tensorrt会报找不到 DLL。加完之后,在 CMD 里执行:
trtexec.exe --version正常输出会显示TensorRT Version: 7.2.3.4。如果提示找不到nvinfer.dll,说明 PATH 没生效或者 DLL 文件缺失。检查D:\TensorRT-7.2.3.4\lib下是否存在这几个文件:nvinfer.dll、nvinfer_plugin.dll、nvparsers.dll。
3.3 常见 DLL 加载失败与排查
| 报错信息 | 原因 | 解决 |
|---|---|---|
找不到nvinfer.dll | PATH 未配置或 lib 目录缺失 | 检查 PATH,确认 DLL 存在 |
找不到cudnn64_8.dll | cuDNN 未安装或版本不对 | 重新拷贝 cuDNN 到 CUDA 目录 |
找不到cublas64_11.dll | CUDA 11.0 运行时缺失 | 重装或修复 CUDA Toolkit |
| 应用程序无法启动 0xc000007b | 32 位应用调用 64 位 DLL | 确认应用是 64 位 |
我用过一个偏门解法:把cudnn64_8.dll直接复制到 TensorRT 的lib目录。这样能绕开 PATH 的问题,但治标不治本。如果你需要同时维护多个 TensorRT 版本,建议不要做这种拷贝,而是为每个版本写一个环境变量脚本,切换版本时改 PATH 即可。检查 DLL 依赖可以用dumpbin /dependents nvinfer.dll,这是 VS 自带的工具,能一眼看出缺失的依赖项。
4. 用 trtexec 把 ONNX 模型转成 TensorRT engine
环境没问题,接下来就是核心操作:把模型转成 TensorRT 的 engine 格式。这一章用trtexec.exe完成转换。不要一上来就写 Python API,先用命令行工具跑通流程,确认模型能转换、target 平台能加载,再考虑集成到代码里。
4.1 静态 batch 最小命令
假设你有一个model.onnx,先转一个固定 batch 为 1 的 engine。CMD 里执行:
trtexec.exe --onnx=model.onnx --saveEngine=model.engine --workspace=1024 --fp16各参数含义:
--onnx=model.onnx:指定输入 ONNX 模型文件路径。--saveEngine=model.engine:把构建好的 engine 序列化到磁盘,下次直接加载,不需要重新构建。--workspace=1024:指定 TensorRT 构建时能使用的显存上限,单位是 MB。7.2 这个版本还没有--memPoolSize,你用--workspace就对了。--fp16:开启 FP16 推理。如果显卡不支持 FP16,比如部分老 Quadro 卡,这个参数会导致构建失败,去掉即可。
转换过程中trtexec会打印每层的信息,包括层名、输入输出维度、显存占用。转换时间取决于模型复杂度,一个 ResNet50 大约需要 30 到 60 秒。转换完成后目录下会多出一个model.engine文件,这就是最终要分发和加载的文件。
4.2 动态 shape 参数与三种 profile
很多场景下输入 batch 不固定,需要动态 shape。这时要指定--minShapes、--optShapes、--maxShapes三个参数,TensorRT 会根据这三个 profile 做尺寸优化:
trtexec.exe --onnx=model.onnx --saveEngine=model.engine ^ --minShapes=input:1x3x224x224 ^ --optShapes=input:4x3x224x224 ^ --maxShapes=input:8x3x224x224 ^ --workspace=1024 --fp16参数说明:
input是 ONNX 模型里输入张量的名字。如果你不知道输入名,可以先用--onnx=model.onnx --printLayerInfo查看,或者在 Python 里用 onnx 库读出graph.input[0].name。- 三个 shape 的顺序是
NCHW,分别是最小、最优、最大。optShapes是性能优化目标,实际推理时 shape 越接近optShapes,性能越好。 - 动态 shape 模式下,加载 engine 后每次推理都要显式
set_binding_shape,不设置会报INVALID_BINDING错误。
4.3 三个必踩的坑
第一,--workspace不是实际显存占用,而是构建阶段的允许上限。构建完成后,推理阶段的显存占用由 TensorRT 自行管理,这个参数对推理性能影响不大。如果构建时显存不足,优先调低这个值,而不是换显卡。
第二,FP16 精度不一定能无损。图像分类这类模型通常没问题,但检测、分割模型里的某些层对精度敏感。建议转换后跑一遍精度对比,方法很简单:同一张输入图,ONNX Runtime 输出和 TensorRT engine 输出做逐元素比较,误差超过 1e-2 就要考虑关闭--fp16或者用 INT8 量化。INT8 需要校准数据集,不是一条命令能解决的,前期不要碰。
第三,构建过程中如果出现Error[3]: invalid argument,绝大多数情况是输入 shape 和模型不匹配。多模态模型或带 text 输入的模型尤其容易触发,用--printLayerInfo查看输入要求,再重新写参数。7.2 版本对 Transformer 结构的支持不如 8.x 版本,如果模型架构过新,转换失败时不要硬调参数,回归到 Pytorch 导出的 ONNX 版本上检查算子支持情况。
5. Python API 加载 engine 并完成一次推理
命令行跑通之后,就该把 engine 集成到实际代码里了。这一章用 Python 完成从加载 engine 到输出结果的完整流程。注意 7.2.3.4 的 Python API 风格和 8.x、9.x 有差异,不要拿新版本的写法硬套,否则会碰到AttributeError。
5.1 环境准备与 wheel 安装
先安装 TensorRT 的 Python 包。解压目录里找到对应的 wheel 文件,CMD 中执行:
pip install D:\TensorRT-7.2.3.4\python\tensorrt-7.2.3.4-cp37-none-win_amd64.whl注意文件名里的cp37表示 CPython 3.7,但 7.2 时代的 wheel 多数是纯 ABI 的,cp37后缀在 3.8、3.9 下通常也能装。如果安装失败,检查 Python 版本,然后找一个对应版本的 wheel。安装完成后验证:
import tensorrt as trt print(trt.__version__)能打印7.2.3.4就说明 TensorRT Python 绑定没问题。这时如果报ImportError: DLL load failed,回头检查 3.3 节的 DLL 依赖,pycuda也需要提前安装:
pip install pycudapycuda 的作用是管理 GPU 显存分配,TensorRT 本身不提供 Python 端的显存管理接口,没有 pycuda 你就没法在 Python 里给输入输出分配 device 内存。
5.2 最小推理代码与参数说明
import tensorrt as trt import pycuda.driver as cuda import pycuda.autoinit import numpy as np # 创建 TensorRT 运行时和日志对象 TRT_LOGGER = trt.Logger(trt.Logger.WARNING) def load_engine(engine_path): with open(engine_path, "rb") as f, trt.Runtime(TRT_LOGGER) as runtime: return runtime.deserialize_cuda_engine(f.read()) engine = load_engine("model.engine") context = engine.create_execution_context() # 获取输入输出 binding 索引 input_idx = engine.get_binding_index("input") output_idx = engine.get_binding_index("output") print(f"input binding index: {input_idx}, output binding index: {output_idx}") # 分配 host 内存和 device 显存 input_shape = (1, 3, 224, 224) output_shape = (1, 1000) h_input = np.random.randn(*input_shape).astype(np.float32) h_output = np.empty(output_shape, dtype=np.float32) d_input = cuda.mem_alloc(h_input.nbytes) d_output = cuda.mem_alloc(h_output.nbytes) # 如果是动态 shape,需要先 set_binding_shape # context.set_binding_shape(input_idx, input_shape) # 拷贝输入数据传输到 GPU cuda.memcpy_htod(d_input, h_input) # 执行推理 context.execute_v2(bindings=[int(d_input), int(d_output)]) # 把结果拷贝回 CPU cuda.memcpy_dtoh(h_output, d_output) # 查看 top-5 置信度 top5 = np.argsort(h_output[0])[::-1][:5] print("top5 class ids:", top5) print("top5 scores:", h_output[0][top5])代码逻辑拆开看:先反序列化 engine 文件拿到engine对象,再通过create_execution_context()创建执行上下文,这是每次推理独立的状态容器。get_binding_index拿到的索引是数据的通行证,后续无论拷贝还是推理都靠它定位缓冲区。execute_v2的bindings参数要求传入 device 指针列表,顺序必须和 binding 索引一一对应,这就是为什么要把d_input和d_output转成int再包装进列表。
5.3 首次推理时间与性能验证
代码能跑通后,关注两个时间指标:首次推理时间(first inference latency)和稳定推理时间。首次推理时间通常明显比后续慢,因为 TensorRT 在首次调用时会加载 CUDA kernel、做显存初始化和算子调度。你可以在代码里加一个循环,预热 10 次再计时:
for _ in range(10): context.execute_v2(bindings=[int(d_input), int(d_output)])预热完成后,再用time.perf_counter()测 100 次推理取平均值。这个平均值才是真实的部署性能。如果对比 ONNX Runtime,TensorRT 7.2.3.4 在常见 CNN 模型上通常有 1.5 到 4 倍的提升,但 transformer 类模型的提升幅度可能没那么明显,这是 7.x 的老问题。
6. 把老版本加速跑稳:workspace 调参、错误码与性能验证
最后一章落到实用技巧,针对 7.2.3.4 这个特定版本在 Windows 上的三个具体优化点。
第一个技巧是合理控制--workspace。构建阶段把它设成显存最大值的 50%,而不是往大了调。原因在于 TensorRT 选择算子融合算法时,workspace 越大搜索空间越大,构建时间越长,但推理性能提升在 50% 之后基本趋平。如果构建时遇到cudaErrorMemoryAllocation,说明 workspace 超过实际可用显存,直接减半再试。
第二个技巧是处理cudaErrorInsufficientDriver。这个错误看起来像驱动缺失,实际上多数情况是驱动版本太老,不满足 CUDA 11.0 的最低要求。用nvidia-smi查看驱动版本,对照 CUDA 11.0 的兼容表。不建议重装系统或大版本升级驱动,先试 NVIDIA 官方的驱动更新小版本,往往能解决。
第三个技巧是设置CUDA_CACHE_MAXSIZE环境变量。运行多次 TensorRT 推理后,CUDA 驱动会缓存编译好的 kernel,默认缓存容量有限。设置一个较大的值可以减少重复编译,实测把CUDA_CACHE_MAXSIZE设为 536870912(512MB)后,连续跑多个模型的首次推理延迟有明显降低。CMD 中执行:
set CUDA_CACHE_MAXSIZE=536870912最后,性能验证不只看解码速度,还要关注 GPU 利用率。用nvidia-smi -l 1实时监控推理时的 GPU 占用,如果发现利用率持续低于 50%,大概率是数据拷贝或者 CPU 预处理成了瓶颈,和 TensorRT 无关。建议对照同一模型在trtexec的 benchmark 输出,那个数据排除了 Python 开销,能更客观地反映 engine 的真实性能。
本文还有配套的精品资源,点击获取