2. 深度学习环境搭建:CUDA、cuDNN、PyTorch安装与验证、Docker环境配置
说实话,环境搭建这事儿,看着简单,但坑是真不少。我见过太多同学模型写好了,结果跑不起来,最后发现是CUDA版本和PyTorch对不上。这一章,咱们就把这事彻底理清楚。
2.1 环境概览:你到底需要什么?
先看一张整体流程图,搞清楚每个组件的位置:
每一层都依赖下一层。你想想看,如果驱动没装好,CUDA Toolkit装得再漂亮也没用。PyTorch调用cuDNN时,底层一报错,整个训练就崩了。
2.2 NVIDIA驱动安装
这是第一步,也是最容易忽略的一步。我个人习惯是,拿到新机器第一件事就是查驱动版本。
检查当前驱动:
nvidia-smi
如果显示GPU信息,说明驱动已装。如果报错,去NVIDIA官网下载对应驱动。
这里有个关键点:驱动版本决定了你能装多高的CUDA。比如驱动版本是470.x,那CUDA最高只能到11.4。我曾在项目中遇到过,客户服务器驱动太老,死活装不上CUDA 11.8,最后只能降级PyTorch版本。
| 驱动版本 | 支持的最高CUDA | 推荐场景 |
|---|---|---|
| 470.x | CUDA 11.4 | 老旧服务器、T4显卡 |
| 510.x | CUDA 11.6 | 一般工作站 |
| 525.x | CUDA 12.0 | RTX 30/40系列 |
| 535.x | CUDA 12.2 | 最新显卡、H100 |
注意:不要装最新的驱动!除非你确定你的PyTorch支持。我建议装「推荐/认证」版本,稳定第一。
2.3 CUDA Toolkit安装
驱动搞定后,装CUDA Toolkit。说白了,它就是给开发者用的工具包,包含了编译器、库文件等。
安装步骤:
- 去NVIDIA官网下载CUDA Toolkit(我推荐11.8,兼容性最好)
- 选择对应操作系统和架构
- 用runfile或deb包安装
我的习惯:用runfile安装,可以自定义安装路径。这样一台机器可以装多个CUDA版本,通过修改环境变量切换。
验证安装:
nvcc --version
如果显示版本号,说明CUDA Toolkit装好了。
2.4 cuDNN安装
cuDNN是NVIDIA专门为深度学习优化的加速库。PyTorch底层大量调用它来做卷积、池化等操作。
安装其实很简单:
- 去NVIDIA官网下载cuDNN(需要注册账号)
- 选择与CUDA版本匹配的cuDNN
- 解压后把文件复制到CUDA安装目录
# 示例:将cuDNN文件复制到CUDA目录
sudo cp cudnn-linux-x86_64-8.9.0.131_cuda11-archive/include/cudnn*.h /usr/local/cuda/include/
sudo cp cudnn-linux-x86_64-8.9.0.131_cuda11-archive/lib/libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
我曾经踩过的坑:cuDNN版本和CUDA版本不匹配,训练时直接报「cuDNN error」。后来我养成了习惯,每次装完都跑一下cuDNN的sample程序验证。
2.5 PyTorch安装与验证
终于到框架层了。PyTorch的安装其实是最简单的,但版本选择有讲究。
安装命令(以CUDA 11.8为例):
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
为什么推荐用官网命令?因为PyTorch的wheel包已经编译好了cuDNN,你不需要手动再装一遍。但前提是,你的CUDA版本必须和PyTorch要求的匹配。
| PyTorch版本 | 对应CUDA | 稳定程度 |
|---|---|---|
| 1.13.x | CUDA 11.7 | 非常稳定,推荐 |
| 2.0.x | CUDA 11.8 | 稳定,新特性多 |
| 2.1.x | CUDA 12.1 | 较新,部分库兼容性待验证 |
验证PyTorch是否能用GPU:
import torch
print(torch.__version__)
print(torch.cuda.is_available())
print(torch.cuda.get_device_name(0))
如果输出True和你的显卡型号,恭喜你,环境搭好了。
快速验证脚本:
import torch
x = torch.randn(3, 3).cuda()
print(x)
print("GPU is working!")
2.6 Docker环境配置
说实话,前面那些步骤,每换一台机器就要重来一遍,烦不烦?我反正是烦了。所以后来我全面转向Docker。
Docker的好处:
- 环境隔离,一个容器一个项目
- 一键部署,不用重复装驱动
- 版本管理,想换CUDA就换镜像
安装Docker:
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
安装NVIDIA Container Toolkit:
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 update
sudo apt install nvidia-container-toolkit
sudo systemctl restart docker
拉取PyTorch镜像并运行:
docker pull pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime
docker run --gpus all -it --rm pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime python -c "import torch; print(torch.cuda.is_available())"
如果输出True,说明Docker环境也搞定了。
我的Dockerfile模板:
FROM pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime
RUN pip install opencv-python matplotlib tqdm
WORKDIR /workspace
COPY . .
CMD ["python", "train.py"]
这样每次换机器,只需要 docker build -t my-yolo . 然后 docker run --gpus all -it my-yolo,环境一模一样。
2.7 常见问题与避坑指南
- nvidia-smi报错:驱动没装好,或者内核模块没加载。重启试试。
- torch.cuda.is_available()返回False:PyTorch版本和CUDA版本不匹配。我建议用官网的pip命令重装。
- Docker里找不到GPU:没装nvidia-container-toolkit,或者没加
--gpus all参数。 - cuDNN报错:版本不匹配,或者没复制到正确目录。用
ldconfig刷新库缓存。
我曾经犯过的错:在一台机器上装了CUDA 11.8,但PyTorch是2.1版本默认支持CUDA 12.1,结果训练时各种诡异报错。后来我统一用PyTorch官网推荐的CUDA版本,再也没出过问题。
环境搭建这事,说白了就是「版本对齐」。驱动、CUDA、cuDNN、PyTorch,四者必须匹配。用Docker可以省去很多重复劳动,我强烈推荐。