第二章 开发环境搭建:GPU驱动安装、CUDA Toolkit配置、cuDNN与NCCL安装
别小看环境搭建这一步。很多跑单细胞分析的朋友,拿到 GPU 服务器第一件事就是装个 conda 然后 pip install 一路到底,结果跑一个晚上出个「CUDA driver version is insufficient」—— 那种挫败感,我懂。其实环境搭对了,后面可以省一半的 debug 时间。
这一章我们就从底层到上层,把 GPU 计算栈的每一层都理清楚。你会看到驱动、CUDA 工具包、cuDNN 和 NCCL 各自扮演什么角色,它们之间怎么依赖,我自己踩过哪些坑。
核心原则:版本匹配 —— 驱动要支持 CUDA 版本,CUDA 版本要配套 cuDNN 和 NCCL。少一个版本对不上,就会报奇奇怪怪的错误。
2.1 GPU 驱动安装
先说驱动。驱动是 GPU 和操作系统之间的桥梁。没有驱动,CUDA 再牛也调不动 GPU。
我个人习惯用 NVIDIA 官方提供的 runfile 安装,比包管理器里的版本新,而且能手动指定内核模块参数。不过第一次装的同学,用包管理器也完全 OK。
2.1.1 检查当前硬件和驱动
# 查看 GPU 型号,确认有 NVIDIA 显卡
lspci | grep -i nvidia
# 如果已经装了驱动,看版本
nvidia-smi
nvidia-smi 输出里,第一行就是 driver version。比如 Driver Version: 535.129.03。这个版本号决定了你能装哪个 CUDA Toolkit(后面会讲)。
2.1.2 安装驱动(推荐 runfile 方式)
# 1. 卸载旧驱动(如果存在)
sudo apt-get purge nvidia-* -y
# 2. 禁用 nouveau 驱动(开源版,会冲突)
echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nvidia-nouveau.conf
sudo update-initramfs -u
# 3. 重启后,下载对应驱动 runfile
wget https://us.download.nvidia.com/XFree86/Linux-x86_64/535.129.03/NVIDIA-Linux-x86_64-535.129.03.run
# 4. 给执行权限,然后运行
chmod +x NVIDIA-Linux-x86_64-535.129.03.run
sudo ./NVIDIA-Linux-x86_64-535.129.03.run
我曾经在安装过程中选了「Install 32-bit compatibility libraries」,结果后面编译某些库时符号冲突。建议不勾这个,除非你明确需要。
2.1.3 验证驱动
nvidia-smi
如果能正常显示 GPU 温度、功耗和进程信息,驱动就装好了。
2.2 CUDA Toolkit 配置
CUDA Toolkit 提供编译器 nvcc、CUDA 运行时库和数学库。它不是驱动,但依赖驱动的版本支持。
2.2.1 选择 CUDA 版本
这里有个经验法则:先查你的项目(比如 scvi-tools、rapids-singlecell)要求的 CUDA 版本。我建议选次新稳定版(比如现在 CUDA 12.x 已经很稳,但有些包还在 11.8 上跑)。
| 项目 / 框架 | 建议 CUDA 版本 | 驱动最低版本 |
|---|---|---|
| PyTorch 2.x + cuDNN | 12.1 / 11.8 | 530.30+ |
| RAPIDS (cuDF/cuML) | 11.8 | 520.61+ |
| TensorFlow 2.15+ | 11.8 | 520.61+ |
| Spark + GPU 加速 | 12.0 | 525.60+ |
2.2.2 安装 CUDA Toolkit
NVIDIA 官方提供了 network installer 和 local installer。我推荐 local runfile,一次下载后可以在多台机器复用。
# 以 CUDA 12.1 为例
wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run
sudo sh cuda_12.1.0_530.30.02_linux.run
# 安装时注意:不要勾选 Driver(我们已经装过),只选 Toolkit 和 Samples
安装完成后,把 CUDA 的 bin 和 lib64 添加进环境变量:
# 在 ~/.bashrc 或 ~/.zshrc 里添加
export PATH=/usr/local/cuda-12.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH
一个小技巧: 用 update-alternatives 管理多个 CUDA 版本,方便切换。具体命令:sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-12.1 121
2.2.3 验证 CUDA 环境
nvcc --version
# 编译个 sample 测试
cd /usr/local/cuda-12.1/samples/1_Utilities/deviceQuery
make
./deviceQuery
看到 Result = PASS 就说明 CUDA Toolkit 工作正常。
2.3 cuDNN 与 NCCL 安装
cuDNN 是深度神经网络的加速库,NCCL 是多 GPU 通信的优化库。空间单细胞分析中,cuDNN 用在神经网络模型(如 scVI)里计算卷积或全连接层,NCCL 用在多卡并行训练时做梯度同步。
2.3.1 cuDNN 安装
cuDNN 现在从 NVIDIA 官网下载需要注册账号。下载后是一个 tar 包,解压后复制头文件和库到 CUDA 目录就行。
# 以 cuDNN for CUDA 12.x 为例
tar -xzvf cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz
# 复制到 CUDA 目录
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-12.1/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-12.1/lib64/
# 给权限
sudo chmod a+r /usr/local/cuda-12.1/include/cudnn*.h /usr/local/cuda-12.1/lib64/libcudnn*
验证 cuDNN 版本:
cat /usr/local/cuda-12.1/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
2.3.2 NCCL 安装
NCCL 可以从 NVIDIA 官方仓库 apt 安装,也可以源码编译。我建议用 deb 包,简单快捷。
# 添加 NVIDIA 仓库密钥
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/3bf863cc.pub
# 添加仓库
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/"
# 安装 NCCL
sudo apt update
sudo apt install libnccl2 libnccl-dev
注意: NCCL 版本也要和 CUDA 版本对应。运行 dpkg -l | grep nccl 可以查看已安装版本。我之前遇到过 NCCL 版本高了,结果 cuDF 报段错误,退回 2.18.3 才解决。
2.4 整体验证:一个简单的 GPU 计算范例
最后,我们写一个小程序,确认驱动、CUDA、cuDNN 和 NCCL 全部衔接正常。
#include <cuda_runtime.h>
#include <cudnn.h>
#include <nccl.h>
#include <stdio.h>
int main() {
int driverVersion = 0;
cudaDriverGetVersion(&driverVersion);
printf("CUDA Driver Version: %d\n", driverVersion);
cudnnHandle_t cudnn;
cudnnCreate(&cudnn);
printf("cuDNN handle created successfully.\n");
ncclComm_t comm;
ncclUniqueId id;
ncclGetUniqueId(&id);
printf("NCCL unique ID generated.\n");
cudnnDestroy(cudnn);
return 0;
}
# 编译命令(需要 nvcc)
nvcc -o env_test env_test.cu -lcudnn -lnccl
./env_test
如果所有库都能正常加载,控制台会输出三行信息,没有任何错误。
至此,你的 GPU 计算栈就完整了。 驱动 → CUDA Toolkit → cuDNN → NCCL,每一层都经过验证。后续安装任何单细胞分析工具(比如 rapids-singlecell、scvi-tools)时,只要环境变量指向同一个 CUDA 目录,就不会有兼容性问题。
我的个人习惯: 每次装完环境,都会保留一个 env_test.cu 文件在 ~/cuda_checks 目录下。配新机器时直接编译运行,十分钟就能确认全部组件是否就绪。别等到跑任务报错了才排查环境问题,能省不少时间。