2、环境搭建:CUDA与cuDNN版本选择、TensorRT安装(tar包与Debian包)、验证安装是否成功

环境搭建这事儿,说简单也简单,说坑也多。我见过不少同学花了一整天装TensorRT,最后发现是CUDA版本没对上。嗯,咱们今天就把这事彻底捋清楚。

2.1 CUDA与cuDNN版本选择——别小看这一步

说白了,TensorRT是个"挑剔"的家伙。它对CUDA和cuDNN的版本有严格要求。你想想看,如果版本不对,编译都过不去,更别提推理加速了。

我的建议是:先看TensorRT的Release Notes。 每个版本的TensorRT都会明确列出支持的CUDA和cuDNN版本。我个人习惯是直接去NVIDIA官网下载页面,找到对应版本的文档。

核心原则:TensorRT版本 → 决定CUDA版本 → 决定cuDNN版本。千万别反过来选。

举个例子,TensorRT 8.5 GA版本支持的CUDA版本是11.0、11.1、11.2、11.3、11.4、11.5、11.6、11.7、11.8。cuDNN则要求8.3.2或8.4.1。你看,范围其实挺宽的,但你不能用CUDA 12.x去配TensorRT 8.5,那肯定报错。

TensorRT版本 推荐CUDA版本 推荐cuDNN版本
8.4 GA 11.6 / 11.7 8.3.2 / 8.4.0
8.5 GA 11.8 8.4.1 / 8.5.0
8.6 EA 11.8 / 12.0 8.6.0 / 8.7.0

我曾经踩过的坑:有一次我图省事,直接用了系统自带的CUDA 12.0去装TensorRT 8.4,结果编译时各种符号找不到。折腾了两小时才发现是版本不兼容。从那以后,我每次装之前都会先查一遍官方文档。

2.2 TensorRT安装——tar包 vs Debian包

TensorRT提供了两种安装方式:tar包和Debian包。这两种方式各有优劣,我分别说说。

2.2.1 用tar包安装(推荐)

我个人更倾向于用tar包。为什么?因为灵活。你可以把TensorRT解压到任意目录,不影响系统其他组件。而且切换版本也方便,删掉目录换个软链接就行。

具体步骤:

  1. 从NVIDIA官网下载对应版本的tar包,比如 TensorRT-8.5.3.1.Linux.x86_64-gnu.cuda-11.8.tar.gz
  2. 解压到目标目录:tar -xzvf TensorRT-8.5.3.1.Linux.x86_64-gnu.cuda-11.8.tar.gz -C /opt/
  3. 配置环境变量:
export TRT_ROOT=/opt/TensorRT-8.5.3.1
export LD_LIBRARY_PATH=$TRT_ROOT/lib:$LD_LIBRARY_PATH
export PATH=$TRT_ROOT/bin:$PATH
export PYTHONPATH=$TRT_ROOT/python/python3.10/site-packages:$PYTHONPATH

注意,Python路径要根据你的Python版本调整。我一般会把这几个export加到 ~/.bashrc 里,省得每次都要手动敲。

2.2.2 用Debian包安装(适合新手)

Debian包安装更"傻瓜式",适合不想折腾的同学。但有个缺点:它会安装到系统目录,卸载或切换版本比较麻烦。

步骤:

  1. 下载对应的 .deb 文件
  2. 安装:sudo dpkg -i nv-tensorrt-repo-ubuntu2204-cuda11.8-trt8.5.3.1-ga-20230314_1-1_amd64.deb
  3. 更新源并安装:sudo apt-get update && sudo apt-get install tensorrt

小提示:如果你用Debian包安装,记得同时安装 python3-libnvinfer-devpython3-libnvinfer,否则Python接口可能用不了。

2.3 验证安装是否成功

装完了,怎么知道对不对?别急,我教你几招。

2.3.1 命令行验证

最简单的办法:

trtexec --version

如果能看到版本号,说明核心库装好了。比如输出:

TensorRT version: 8.5.3

2.3.2 Python接口验证

打开Python终端:

import tensorrt as trt
print(trt.__version__)

如果没报错,说明Python接口也正常。我一般还会多跑一步:

logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(logger)
print("TensorRT builder created successfully")

注意:如果Python导入时报错 libnvinfer.so: cannot open shared object file,八成是LD_LIBRARY_PATH没设对。检查一下你的环境变量。

2.3.3 跑一个简单的模型验证

我个人习惯用trtexec跑一个ONNX模型,看看能不能正常构建engine:

trtexec --onnx=model.onnx --saveEngine=model.engine --workspace=1024

如果顺利生成 model.engine 文件,说明整个链路都通了。嗯,这一步其实挺有成就感的。

我曾经遇到的坑:有一次我装完TensorRT,Python接口能导入,但一跑推理就Segmentation Fault。查了半天,发现是cuDNN版本不对——我装的是8.2,但TensorRT 8.5需要8.4以上。所以,cuDNN版本一定要严格匹配,别心存侥幸。

2.4 常见问题与避坑指南

  • 问题1:安装后找不到 trtexec 命令。解决:检查 PATH 是否包含 $TRT_ROOT/bin
  • 问题2:Python导入报错 No module named 'tensorrt'。解决:确认 PYTHONPATH 指向了正确的 python 子目录。
  • 问题3:编译自定义算子时链接不到TensorRT库。解决:检查 LD_LIBRARY_PATHCMAKE_PREFIX_PATH

好了,环境搭建这块就这些。说白了,只要版本对、路径对,基本不会出大问题。下一章咱们开始讲TensorRT的核心概念——网络定义与Builder配置,到时候你会真正感受到TensorRT的威力。