2、环境搭建:CUDA与cuDNN安装、PyTorch环境配置、ONNX与ONNX Runtime安装、TensorRT安装、Docker环境搭建

说实话,环境搭建是很多同学入门YOLO部署的第一道坎。我见过太多人在这一步卡了两三天,最后发现是CUDA版本和PyTorch没对齐。这一章,咱们就把这些坑一个个填平。

我的习惯是:先搭好底层驱动,再往上装框架,最后用Docker把环境固化。这样不管换机器还是重装系统,都能快速恢复。

核心原则:版本对齐

CUDA、cuDNN、PyTorch、TensorRT这四个东西,版本必须严格匹配。差一个小版本,可能就报错给你看。

2.1 CUDA与cuDNN安装

CUDA是NVIDIA的并行计算平台,cuDNN是它的深度学习加速库。说白了,CUDA是发动机,cuDNN是涡轮增压器。

2.1.1 检查硬件兼容性

先确认你的显卡支持什么版本的CUDA。用这个命令:

nvidia-smi

输出里会显示Driver Version和CUDA Version。注意,这个CUDA Version是驱动支持的最高版本,不是你已经装了的版本。

显卡架构 计算能力 推荐CUDA版本
Ampere (RTX 30系列) 8.0+ CUDA 11.x / 12.x
Turing (RTX 20系列) 7.5 CUDA 10.x / 11.x
Volta (V100) 7.0 CUDA 10.x / 11.x
Maxwell/Pascal (GTX 10系列) 5.x / 6.x CUDA 10.x

2.1.2 安装CUDA

我推荐用runfile方式安装,这样能自己选择安装路径,方便管理多个版本。

# 下载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

安装时注意:不要勾选Driver,除非你的驱动版本太旧。我只装CUDA Toolkit本身。

我的经验:装完CUDA后,一定要配环境变量。我习惯把多个CUDA版本放在/usr/local/cuda-11.8、/usr/local/cuda-12.1这样的目录下,然后用软链接切换。

# 配置环境变量(加到~/.bashrc)
export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH

# 验证安装
nvcc --version

2.1.3 安装cuDNN

cuDNN需要去NVIDIA官网下载,要注册账号。下载后解压,把文件复制到CUDA目录就行。

# 解压cuDNN
tar -xzvf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz

# 复制到CUDA目录
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
sudo chmod a+r /usr/local/cuda-11.8/lib64/libcudnn*

# 验证
cat /usr/local/cuda-11.8/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

注意:cuDNN版本必须和CUDA版本对应。比如CUDA 11.8就用cuDNN 8.9.x for CUDA 11.x。我曾经因为cuDNN版本不对,训练时直接报"undefined symbol"错误,排查了半天。

2.2 PyTorch环境配置

PyTorch的安装其实是最简单的,但也是最容易出错的——因为版本匹配问题。

2.2.1 创建虚拟环境

我强烈建议用conda管理环境。每个项目一个环境,互不干扰。

# 创建Python 3.10环境
conda create -n yolo_deploy python=3.10
conda activate yolo_deploy

2.2.2 安装PyTorch

去PyTorch官网用版本匹配器生成安装命令。比如CUDA 11.8对应:

pip install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 --index-url https://download.pytorch.org/whl/cu118

装完后验证:

python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"

如果输出True,说明CUDA可用。如果False,检查一下是不是装了CPU版本的PyTorch。

避坑指南:我曾经用pip install torch直接装,结果装成了CPU版。后来养成习惯,每次都指定--index-url参数。

2.3 ONNX与ONNX Runtime安装

ONNX是模型交换格式,ONNX Runtime是推理引擎。YOLO模型转ONNX后,可以用ONNX Runtime做快速验证。

2.3.1 安装ONNX

pip install onnx==1.15.0

2.3.2 安装ONNX Runtime

ONNX Runtime分CPU版和GPU版。做YOLO部署,肯定用GPU版。

# GPU版(CUDA 11.x)
pip install onnxruntime-gpu==1.17.0

# 验证
python -c "import onnxruntime; print(onnxruntime.get_device())"

输出应该是"GPU"。如果是"CPU",检查一下CUDA环境变量有没有配好。

组件 推荐版本 说明
ONNX 1.15.x 用于模型导出和检查
ONNX Runtime GPU 1.17.x GPU推理,依赖CUDA
ONNX Runtime CPU 1.17.x CPU推理,调试用

2.4 TensorRT安装

TensorRT是NVIDIA的推理优化引擎。YOLO模型转TensorRT后,推理速度能提升2-5倍。

2.4.1 下载TensorRT

去NVIDIA官网下载TensorRT。注意选对CUDA版本和系统架构。

# 下载TensorRT 8.6.1 for CUDA 11.8
wget https://developer.nvidia.com/downloads/compute/machine-learning/tensorrt/8.6.1/TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz

# 解压
tar -xzvf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz
sudo mv TensorRT-8.6.1.6 /usr/local/

2.4.2 配置环境变量

# 加到~/.bashrc
export LD_LIBRARY_PATH=/usr/local/TensorRT-8.6.1.6/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/TensorRT-8.6.1.6/bin:$PATH

2.4.3 安装Python包

# 进入TensorRT的Python目录
cd /usr/local/TensorRT-8.6.1.6/python

# 安装对应Python版本的wheel
pip install tensorrt-8.6.1-cp310-none-linux_x86_64.whl

# 验证
python -c "import tensorrt; print(tensorrt.__version__)"

注意:TensorRT的Python包版本必须和你的Python版本匹配。cp310就是Python 3.10。我见过有人装了cp39的包,Python是3.10,结果import就报错。

2.5 Docker环境搭建

Docker是环境管理的终极方案。一次配置,到处运行。

2.5.1 安装Docker

# Ubuntu安装Docker
sudo apt-get update
sudo apt-get install docker.io

# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker

# 验证
docker --version

2.5.2 安装NVIDIA Container Toolkit

这个工具让Docker容器能访问GPU。

# 添加NVIDIA仓库
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

# 安装
sudo apt-get update
sudo apt-get install -y nvidia-docker2

# 重启Docker
sudo systemctl restart docker

# 验证GPU是否可用
docker run --rm --gpus all nvidia/cuda:11.8.0-base nvidia-smi

2.5.3 构建YOLO部署镜像

我习惯用Dockerfile把环境固化下来。

# Dockerfile
FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04

# 安装Python和pip
RUN apt-get update && apt-get install -y python3 python3-pip

# 安装PyTorch
RUN pip3 install torch==2.1.0 torchvision==0.16.0 --index-url https://download.pytorch.org/whl/cu118

# 安装ONNX和ONNX Runtime
RUN pip3 install onnx==1.15.0 onnxruntime-gpu==1.17.0

# 安装TensorRT
COPY TensorRT-8.6.1.6 /opt/TensorRT-8.6.1.6
ENV LD_LIBRARY_PATH=/opt/TensorRT-8.6.1.6/lib:$LD_LIBRARY_PATH
RUN pip3 install /opt/TensorRT-8.6.1.6/python/tensorrt-8.6.1-cp38-none-linux_x86_64.whl

# 设置工作目录
WORKDIR /workspace

构建镜像:

docker build -t yolo-deploy:1.0 .

我的习惯:Docker镜像打好后,我会push到私有仓库。这样团队里其他人直接pull就能用,不用重复装环境。有一次服务器重装系统,我花了10分钟拉镜像,环境就全回来了。

2.6 环境验证与知识图谱

所有组件装完后,跑一个完整的验证脚本:

python -c "
import torch
import onnx
import onnxruntime
import tensorrt

print(f'PyTorch: {torch.__version__}')
print(f'CUDA可用: {torch.cuda.is_available()}')
print(f'ONNX: {onnx.__version__}')
print(f'ONNX Runtime: {onnxruntime.__version__}')
print(f'TensorRT: {tensorrt.__version__}')
"

下面这张图,帮你理清整个环境搭建的知识体系:

YOLO部署环境搭建知识图谱 底层:硬件与驱动 NVIDIA GPU → 驱动(nvidia-smi验证) → CUDA Toolkit → cuDNN 版本匹配:驱动支持CUDA版本 ≥ 实际安装CUDA版本 ≥ cuDNN版本 深度学习框架 PyTorch + torchvision 版本对齐:CUDA 11.8 → PyTorch 2.1.0 模型转换与推理 ONNX(模型导出) + ONNX Runtime(验证) TensorRT(优化推理引擎) 环境管理 Conda虚拟环境(项目隔离) + Docker容器(环境固化) Dockerfile + NVIDIA Container Toolkit → 一次构建,到处运行 验证:统一验证脚本 → 所有组件版本输出 → GPU可用性确认 核心原则:版本对齐是环境搭建的第一要务,差一个小版本都可能报错

环境搭好了,后面的事情就顺了。记住:版本对齐是环境搭建的第一要务。我每次搭环境都会列一个版本清单,逐个核对,从不跳过这一步。