第2章:环境搭建——CUDA与cuDNN安装、TensorRT安装与验证、开发环境配置(Python/C++)

好,咱们直接进入正题。环境搭建这事儿,说难不难,说简单吧,我见过太多人在这一步卡上好几天。说白了,就是版本匹配的问题。你想想看,CUDA、cuDNN、TensorRT,这三个东西版本不对齐,后面跑啥都是错。

我个人习惯是,先确定好你要用的TensorRT版本,然后倒推CUDA和cuDNN的版本。别一上来就装最新的CUDA 12.x,TensorRT可能还没跟上呢。

2.1 CUDA与cuDNN安装

CUDA安装其实没啥技术含量,但有几个坑我得提前说。

⚠️ 警告: 千万别用系统包管理器(apt/yum)直接装CUDA,除非你清楚自己在做什么。我建议用NVIDIA官方的runfile或者deb local安装包。

第一步:确认你的显卡

先跑一下这个命令:

nvidia-smi

看看驱动版本和最高支持的CUDA版本。嗯,这里要注意,nvidia-smi显示的CUDA Version是驱动支持的最高版本,不是你实际装的那个。

第二步:下载CUDA Toolkit

去NVIDIA官网,找到CUDA Toolkit Archive。我个人习惯用11.8,因为TensorRT 8.x系列对它的支持最稳。我在项目中遇到过,用CUDA 12.0跑TensorRT 8.5,结果某些算子直接报错,折腾了两天才发现是版本不兼容。

安装命令(以CUDA 11.8为例):

wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run

安装时记得不要勾选驱动,除非你确定要覆盖现有驱动。

第三步:配置环境变量

编辑 ~/.bashrc,加上:

export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH

然后 source ~/.bashrc,验证一下:

nvcc --version

第四步:安装cuDNN

cuDNN其实就是一个压缩包,解压后把文件复制到CUDA目录就行。我曾经见过有人直接apt安装cuDNN,结果版本对不上,跑模型时各种段错误。

# 下载cudnn-linux-x86_64-8.9.0.131_cuda11-archive.tar.xz
tar -xvf cudnn-linux-x86_64-8.9.0.131_cuda11-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-11.8/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-11.8/lib64/
sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*

验证cuDNN版本:

cat /usr/local/cuda-11.8/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
💡 小技巧: 我习惯把不同版本的CUDA装在不同的目录,比如 /usr/local/cuda-11.8、/usr/local/cuda-12.0,然后通过修改软链接 /usr/local/cuda 来切换版本。这样测试不同环境时特别方便。

2.2 TensorRT安装与验证

TensorRT的安装方式有两种:tar包安装和deb包安装。我个人推荐tar包,因为灵活,想放哪放哪。

下载TensorRT

去NVIDIA官网下载对应版本的TensorRT。记得选跟CUDA匹配的版本。比如CUDA 11.8,就选TensorRT 8.6 GA或者8.5 GA。

tar -xzvf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz
sudo mv TensorRT-8.6.1.6 /opt/

配置环境变量:

export LD_LIBRARY_PATH=/opt/TensorRT-8.6.1.6/lib:$LD_LIBRARY_PATH
export PATH=/opt/TensorRT-8.6.1.6/bin:$PATH

验证安装

跑一下自带的样例:

cd /opt/TensorRT-8.6.1.6/samples/sampleOnnxMNIST
make -j8
./sampleOnnxMNIST

如果看到输出结果和正确率,说明安装成功。嗯,这里要注意,第一次编译可能会报缺少依赖,装一下libprotobuf-dev就行。

🔑 核心验证命令:
trtexec --version

这个命令能快速确认TensorRT是否可用。我每次装完新环境,第一件事就是跑这个。

2.3 开发环境配置(Python/C++)

环境搭好了,接下来就是配置开发环境。这部分我踩过不少坑,尤其是Python的TensorRT包,版本搞错的话,import就直接崩。

Python环境配置

我建议用conda创建虚拟环境,别直接在base环境里搞,不然项目多了会乱。

conda create -n tensorrt_env python=3.9
conda activate tensorrt_env

安装TensorRT的Python包:

pip install /opt/TensorRT-8.6.1.6/python/tensorrt-8.6.1-cp39-none-linux_x86_64.whl

验证:

python -c "import tensorrt as trt; print(trt.__version__)"

如果报错说找不到libnvinfer.so,那就是LD_LIBRARY_PATH没设对。我曾经在服务器上折腾了一下午,最后发现是环境变量没source。

💡 避坑指南: 我曾经在Python中直接pip install tensorrt,结果装了个CPU版本的,跑起来慢得要命。记住,一定要用TensorRT安装包里的whl文件。

C++环境配置

C++开发主要就是配置CMakeLists.txt。我一般这样写:

cmake_minimum_required(VERSION 3.10)
project(MyTensorRTProject)

set(CMAKE_CXX_STANDARD 17)

# TensorRT
set(TENSORRT_ROOT /opt/TensorRT-8.6.1.6)
find_library(NVINFER_LIB nvinfer ${TENSORRT_ROOT}/lib)
find_library(NVINFER_PLUGIN_LIB nvinfer_plugin ${TENSORRT_ROOT}/lib)
include_directories(${TENSORRT_ROOT}/include)

# CUDA
find_package(CUDA REQUIRED)

add_executable(main main.cpp)
target_link_libraries(main ${NVINFER_LIB} ${NVINFER_PLUGIN_LIB} ${CUDA_LIBRARIES})

编译测试:

mkdir build && cd build
cmake ..
make -j8

如果编译通过,说明C++环境也配好了。

验证完整流程

我习惯写一个简单的测试脚本,验证整个链路是否通畅:

import tensorrt as trt
import numpy as np

# 创建builder
logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(logger)
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))

# 添加一个简单的输入
input_tensor = network.add_input("input", trt.float32, (1, 3, 224, 224))
identity = network.add_identity(input_tensor)
network.mark_output(identity.get_output(0))

# 构建引擎
config = builder.create_builder_config()
config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 << 20)
engine = builder.build_serialized_network(network, config)

print("TensorRT引擎构建成功!")
print(f"引擎大小: {len(engine)} bytes")

跑一下,如果输出"引擎构建成功",那恭喜你,环境全部搭好了。

⚠️ 最后提醒: 不同版本的TensorRT API可能有差异。比如8.x系列和7.x系列,builder的创建方式就完全不同。如果你用的是旧教程,记得对照官方文档调整。

好了,环境搭建就到这里。下一章我们开始讲模型解析与网络定义,那才是真正有意思的部分。