2、CUDA环境搭建:NVIDIA驱动安装、CUDA Toolkit安装、cuDNN配置、环境变量设置与验证

说实话,环境搭建这事儿,看着简单,但坑是真不少。

我见过太多同学,代码写得挺溜,结果一跑就报错。查了半天,原来是驱动版本不对。嗯,咱们今天就把这事儿一次性搞定。

2.1 NVIDIA驱动安装

先说说驱动。这是CUDA能跑起来的基础。

我个人习惯,装驱动前先看看自己显卡型号。你可以在终端里敲:

lspci | grep -i nvidia

或者用Windows的话,打开设备管理器,在显示适配器里就能看到。

拿到型号后,去NVIDIA官网下载对应驱动。这里有个关键点:别装太新的,也别装太旧的。我建议选那种「稳定版」,就是官网标注了「Studio Driver」或者「Game Ready Driver」的长期支持版本。

⚠️ 避坑指南: 我曾经在Ubuntu上装驱动,直接用了系统自带的nouveau开源驱动。结果CUDA死活不认。后来才发现,必须禁用nouveau,装NVIDIA官方闭源驱动才行。

装完驱动,重启一下。然后验证:

nvidia-smi

如果能看到显卡信息、驱动版本、显存占用,那就对了。

2.2 CUDA Toolkit安装

驱动搞定了,接下来装CUDA Toolkit。

说白了,CUDA Toolkit就是一套开发工具包。里面有编译器nvcc、各种库、调试工具等等。

下载地址还是NVIDIA官网。注意选对操作系统和架构。我个人建议用runfile方式安装,别用deb包。为什么?因为runfile可以自定义安装路径,方便管理多个CUDA版本。

安装命令大概是这样:

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

安装过程中,它会问你要不要装驱动。如果你已经装好了,记得取消勾选驱动,只装Toolkit。

💡 小技巧: 我习惯把CUDA装到 /usr/local/cuda-12.1 这样的路径。然后创建一个软链接 /usr/local/cuda 指向当前使用的版本。这样切换版本时,只需要改软链接就行。

2.3 cuDNN配置

cuDNN是NVIDIA专门为深度学习优化的库。它加速了卷积、池化、归一化这些操作。

你想想看,没有cuDNN,训练一个ResNet可能要多花好几倍时间。

安装cuDNN需要先注册NVIDIA开发者账号。下载下来是一个压缩包,里面是头文件和库文件。

配置步骤很简单:

# 解压
tar -xzvf cudnn-linux-x86_64-8.9.0.131_cuda12-archive.tar.xz

# 复制文件到CUDA目录
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64/

# 设置权限
sudo chmod a+r /usr/local/cuda/include/cudnn*.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

嗯,这里要注意:cuDNN版本必须和CUDA版本匹配。比如CUDA 12.1就要用cuDNN for CUDA 12.x的版本。

📌 重要: 我在项目中遇到过,cuDNN版本不匹配导致训练时直接segmentation fault。排查了一整天,最后发现是cuDNN 8.6和CUDA 12.0的兼容性问题。所以,一定要看官方兼容性矩阵

2.4 环境变量设置

装完了,还得让系统知道这些东西在哪。这就是环境变量的作用。

打开 ~/.bashrc 或者 ~/.zshrc,在末尾添加:

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export CUDA_HOME=/usr/local/cuda

然后执行 source ~/.bashrc 让它生效。

为什么这么配?

  • PATH:让系统能找到nvcc编译器
  • LD_LIBRARY_PATH:让程序运行时能找到CUDA的动态库
  • CUDA_HOME:很多深度学习框架(比如PyTorch、TensorFlow)会读取这个变量
💡 个人习惯: 我一般还会在 /etc/profile 里也配一份,这样所有用户都能用。但如果你只是自己开发,配在 ~/.bashrc 就够了。

2.5 验证环境

最后一步,验证所有东西是否正常工作。

先检查CUDA Toolkit:

nvcc --version

应该能看到CUDA版本号,比如 Cuda compilation tools, release 12.1, V12.1.105

再检查cuDNN:

cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

能看到类似 #define CUDNN_MAJOR 8 这样的输出。

最后,写个简单的CUDA程序测试一下:

#include <stdio.h>

int main() {
    int deviceCount;
    cudaGetDeviceCount(&deviceCount);
    printf("检测到 %d 个CUDA设备\n", deviceCount);
    
    cudaDeviceProp prop;
    cudaGetDeviceProperties(&prop, 0);
    printf("设备名称: %s\n", prop.name);
    printf("计算能力: %d.%d\n", prop.major, prop.minor);
    
    return 0;
}

编译运行:

nvcc test.cu -o test
./test

如果能看到显卡信息,恭喜你,环境搭建成功了!

🎯 总结一下:
组件 验证命令 预期结果
NVIDIA驱动 nvidia-smi 显示显卡信息
CUDA Toolkit nvcc --version 显示CUDA版本
cuDNN 查看头文件 显示cuDNN版本号
整体环境 编译运行test.cu 正常输出设备信息

好了,环境搭好了,下一章咱们就开始写第一个CUDA程序。到时候你会发现,前面这些折腾都是值得的。