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 Lovelace11.8+
GTX 16 系列Turing10.2+
RTX 20 系列Turing11.0+
V100 / P100Volta / Pascal11.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图可以让你一口气看清整个环境搭建的流程:

GPU加速环境搭建流程 检查GPU型号 安装NVIDIA驱动 安装CUDA Toolkit 手动安装路线 Docker路线 安装cuDNN(手动) 配置环境变量 安装nvidia-docker 拉取CUDA+cuDNN镜像 验证环境(nvidia-smi + nvcc) 两种路线都能用。手动定制性强,Docker隔离性好。 单细胞批次校正项目推荐用Docker,方便复现。

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 检查库路径,然后把不匹配的版本卸干净。