4. GPU加速入门:CUDA、cuDNN环境配置,安装NVIDIA驱动与Docker镜像
说实话,很多人一提到GPU环境配置就开始头疼。驱动版本不对、CUDA和cuDNN不匹配、Docker跑不起来……这些坑我几乎全踩过。这一章我们就来一步步拆解,帮你把环境整得明明白白。
核心思路:先搞定硬件驱动,再装CUDA工具包,最后补齐cuDNN库。如果你喜欢隔离环境,可以用Docker一步到位。
4.1 先看显卡支持不支持
别急着装东西。先确认你手上的显卡支不支持CUDA。我遇到过有人拿着Intel集成显卡折腾半天……浪费时间。
跑这条命令就能看到GPU型号:
lspci | grep -i nvidia
如果输出里有类似 NVIDIA GeForce RTX 3080 或 NVIDIA Tesla T4 就对了。要是啥都没有,那就得先加块卡。
| GPU 系列 | CUDA 架构 | 推荐 CUDA 版本 |
|---|---|---|
| RTX 30/40 系列 | Ampere / Ada Lovelace | 11.8+ |
| GTX 16 系列 | Turing | 10.2+ |
| RTX 20 系列 | Turing | 11.0+ |
| V100 / P100 | Volta / Pascal | 11.0 |
小提示:我个人的习惯是把CUDA版本锁定在11.8,兼容性最好,PyTorch和RAPIDS都支持得很稳。
4.2 安装NVIDIA驱动
驱动是GPU和操作系统之间的桥梁。你想想看,没有驱动,CUDA连设备都找不到。
推荐从NVIDIA官网下载.run文件安装,或者用系统包管理器。我更喜欢后者,省事:
# Ubuntu / Debian
sudo apt update
sudo apt install nvidia-driver-535
# 装完重启一下
sudo reboot
# 检查驱动是否正常
nvidia-smi
如果看到类似下面的输出,说明驱动装好了:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.129.03 Driver Version: 535.129.03 CUDA Version: 12.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 NVIDIA RTX 3080 On | 00000000:01:00.0 On | N/A |
| 30% 50C P0 120W / 320W | 1024MiB / 10240MiB | 15% Default |
+-------------------------------+----------------------+----------------------+
曾经踩过的坑:驱动版本和CUDA版本不一定要完全对齐,但《驱动版本 >= CUDA版本要求的min driver》是硬条件。比如CUDA 11.8要求驱动版本 >= 520,你装个470就玩不转。
4.3 安装CUDA工具包
驱动搞定后,咱们来装CUDA。CUDA Toolkit包含编译器(nvcc)、运行时库、各种工具。我个人习惯只用runfile安装,避免污染系统包管理器。
# 下载CUDA 11.8 runfile(去官网找对应链接)
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
安装时按提示操作:
- 输入
accept接受协议 - 取消勾选“Driver”(因为已经装好了)
- 选择安装目录(默认
/usr/local/cuda-11.8)
装完后配置环境变量:
# 加进 ~/.bashrc 或者 ~/.zshrc
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
# 输出应包含 Cuda compilation tools, release 11.8
4.4 安装cuDNN
cuDNN是NVIDIA专门为深度学习优化的加速库。单细胞数据处理中很多神经网络算子会用到它,比如卷积、池化、归一化。
你需要去NVIDIA官网下载cuDNN(免费但要注册账号)。选对应CUDA 11.8的版本,推荐用Tar包手动安装:
# 解压
tar -xzvf cudnn-linux-x86_64-8.9.4.25_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
# 输出类似 #define CUDNN_MAJOR 8
4.5 用Docker一劳永逸
说实话,手动配环境真的很烦。你想想,不同项目可能需要不同CUDA版本,来回切换容易出问题。所以我现在更推荐用Docker。
nvidia-docker 容器可以直接继承宿主机的GPU驱动,不需要在容器里再装。我们只需要在宿主机装好驱动和nvidia-container-toolkit就行。
# 安装 nvidia-container-toolkit
sudo apt install nvidia-container-toolkit
# 重启 docker daemon
sudo systemctl restart docker
# 拉取一个带CUDA 11.8和cuDNN 8的镜像
docker pull nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04
启动容器并挂载你的代码:
docker run --gpus all -it --rm \
-v /path/to/your/code:/workspace \
nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04
为什么推荐Docker? 我在项目中同时做PyTorch和TensorFlow的批次校正,不同框架对cuDNN版本要求不一样。Docker让每个项目独立一套环境,互不干扰,爽得很。
4.6 本章知识结构
下面这张SVG图可以让你一口气看清整个环境搭建的流程:
4.7 咱们来验证一下
装完别急着跑事。先写个简单的CUDA程序测试一下:
cat << EOF > test.cu
#include <stdio.h>
__global__ void hello() {
printf("Hello from GPU block %d thread %d\n", blockIdx.x, threadIdx.x);
}
int main() {
hello<<<1, 4>>>();
cudaDeviceSynchronize();
return 0;
}
EOF
# 编译
nvcc test.cu -o test
# 运行
./test
如果看到4个线程分别打印出信息,说明你的GPU环境已经能跑CUDA了。要是卡在编译或者报错,八成是环境变量没配好,或者驱动没装对。
小技巧:我第一次装的时候以为装完驱动就万事大吉了,结果nvcc命令找不到。后来发现是忘记加环境变量。嗯,这一步真的容易漏。
4.8 让Python能找到GPU
单细胞我们主要用Python。为了让Python代码里能调用GPU,还需要装PyTorch或TensorFlow的GPU版本。我习惯用PyTorch:
# 安装PyTorch(CUDA 11.8版本)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
验证一下:
python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"
如果返回 True 和你的显卡名字,恭喜你,环境全线打通。
曾经踩过的坑:有一次我装PyTorch的GPU版本后,跑 torch.cuda.is_available() 返回False。折腾半天发现是系统里同时装了多个版本的libcuda.so,链接乱掉了。解决办法:用 ldconfig -p | grep cuda 检查库路径,然后把不匹配的版本卸干净。