第2章:环境搭建——CUDA与cuDNN安装、TensorRT安装与验证、开发环境配置(Python/C++)
好,咱们直接进入正题。环境搭建这事儿,说难不难,说简单吧,我见过太多人在这一步卡上好几天。说白了,就是版本匹配的问题。你想想看,CUDA、cuDNN、TensorRT,这三个东西版本不对齐,后面跑啥都是错。
我个人习惯是,先确定好你要用的TensorRT版本,然后倒推CUDA和cuDNN的版本。别一上来就装最新的CUDA 12.x,TensorRT可能还没跟上呢。
2.1 CUDA与cuDNN安装
CUDA安装其实没啥技术含量,但有几个坑我得提前说。
第一步:确认你的显卡
先跑一下这个命令:
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
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。
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")
跑一下,如果输出"引擎构建成功",那恭喜你,环境全部搭好了。
好了,环境搭建就到这里。下一章我们开始讲模型解析与网络定义,那才是真正有意思的部分。