第2章:环境搭建与版本选择

说实话,很多同学刚开始接触TensorRT时,第一个坑就踩在环境搭建上。我见过太多人花了一整天装环境,结果版本对不上,编译报错,心态直接崩了。这一章,我就带你把这关过了。

2.1 版本匹配关系:别让版本坑了你

CUDA、cuDNN、TensorRT这三者的关系,说白了就是「底层驱动-加速库-推理引擎」的链条。版本不匹配,就像你给法拉利加了92号汽油——跑不起来。

我个人习惯用一个表格来对照,这样最清晰。下面是我整理的主流版本匹配关系:

TensorRT版本 CUDA版本 cuDNN版本 备注
8.4.x 11.6 / 11.7 8.4.x 比较稳定的组合
8.5.x 11.8 8.6.x 支持FP8
8.6.x 11.8 / 12.0 8.7.x 我目前主力在用
9.0.x 12.0 / 12.1 8.9.x 新特性多,但生态还不够稳
⚠️ 注意: 千万别只看大版本号。比如CUDA 11.x系列里,11.4和11.8的驱动API都有差异。我曾经因为用了CUDA 11.4搭配TensorRT 8.5,结果一个算子死活跑不起来,查了两天才发现是版本兼容问题。

2.2 两种搭建方式:Docker vs 源码编译

环境搭建主要有两条路:用Docker镜像,或者自己源码编译。我两种都试过,各有优劣。你想想看,如果你只是做推理部署,Docker是最省心的;但如果你要改TensorRT的源码或者做深度定制,那源码编译就是必经之路。

2.2.1 Docker镜像搭建(推荐新手)

Docker的好处是「开箱即用」。NVIDIA官方提供了TensorRT的Docker镜像,你拉下来就能跑。

# 拉取TensorRT 8.6的镜像
docker pull nvcr.io/nvidia/tensorrt:23.06-py3

# 启动容器,挂载你的项目目录
docker run --gpus all -it --rm \
  -v /your/project:/workspace \
  nvcr.io/nvidia/tensorrt:23.06-py3

进去之后,TensorRT已经装好了。你直接 python3 -c "import tensorrt as trt; print(trt.__version__)" 就能看到版本号。嗯,就是这么简单。

💡 小技巧: 我建议你在Docker里也装好pycuda和onnxruntime,方便后面做模型转换和精度对比。命令是 pip install pycuda onnxruntime-gpu

2.2.2 源码编译(进阶玩家)

如果你需要定制TensorRT的插件,或者想用最新的开发分支,那就得走源码编译了。这条路稍微折腾一点,但自由度更高。

我记得第一次编译TensorRT时,光依赖就装了半小时。这里我把关键步骤列出来:

  1. 安装依赖: gcc、cmake、protobuf、libssl-dev 等。Ubuntu下直接 apt-get install 就行。
  2. 下载源码: 从NVIDIA的GitHub仓库拉取对应分支。
  3. 配置编译选项: 用cmake指定CUDA路径、cuDNN路径。
  4. 编译: make -j$(nproc),这个过程大概10-20分钟。
  5. 安装: make install,然后设置环境变量。
# 以TensorRT 8.6为例
git clone -b release/8.6 https://github.com/NVIDIA/TensorRT.git
cd TensorRT
mkdir build && cd build

cmake .. -DTRT_LIB_DIR=/usr/lib/x86_64-linux-gnu \
         -DCUDA_VERSION=11.8 \
         -DCUDNN_ROOT=/usr/lib/x86_64-linux-gnu

make -j$(nproc)
make install
⚠️ 避坑指南: 我曾经在编译时忘了装protobuf的dev包,结果编译到一半报错,白白浪费了20分钟。所以编译前一定检查好所有依赖。用 dpkg -l | grep protobuf 确认一下。

2.3 验证环境是否正常

不管用哪种方式,装完之后一定要验证。我一般会跑一个最简单的TensorRT程序:

import tensorrt as trt

# 创建builder和network
logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(logger)
network = builder.create_network()

# 打印版本信息
print(f"TensorRT version: {trt.__version__}")
print(f"CUDA version: {trt.__cuda_version__}")
print(f"cuDNN version: {trt.__cudnn_version__}")

# 检查GPU是否可用
import pycuda.driver as cuda
cuda.init()
print(f"GPU count: {cuda.Device.count()}")

如果这段代码能跑通,说明环境基本没问题了。如果报错,多半是版本不匹配或者路径没设对。

2.4 我的个人建议

如果你只是做课程里的实验,用Docker镜像最省事。但如果你要在生产环境部署,我建议你走源码编译——因为你可以控制每一个依赖的版本,而且方便后续加自定义插件。

嗯,环境搭建这部分就到这里。下一章我们开始写第一个TensorRT程序,到时候你就知道今天搭的环境有多重要了。