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

说实话,很多初学者在CUDA上栽的第一个跟头,不是算法太难,而是环境没搭好。

我见过太多人花了一整天装驱动,结果黑屏了。或者CUDA Toolkit装好了,一跑代码报错说找不到设备。嗯,这些坑我都踩过。今天我就把一套稳妥的流程拆开来讲,你跟着做就行。

3.1 先搞清楚你的硬件

动手之前,先确认一件事:你的显卡支不支持CUDA?

NVIDIA官网有个列表,叫「CUDA-Enabled GPUs」。我建议你直接去查一下。我个人习惯用命令行查:

# Windows下
wmic path win32_VideoController get name

# Linux下
lspci | grep -i nvidia

看到类似「GeForce RTX 3060」、「Tesla T4」这样的型号,基本就没问题。

⚠️ 注意: 如果你用的是笔记本,而且是双显卡(集显+独显),记得在NVIDIA控制面板里把CUDA程序设为「高性能NVIDIA处理器」。我曾经在这上面浪费了半天。

3.2 NVIDIA驱动安装

驱动是基础。没有驱动,CUDA Toolkit装得再好也没用。

第一步:卸载旧驱动

如果你之前装过NVIDIA驱动,建议先清理干净。我遇到过驱动冲突导致CUDA死活认不到卡的情况。

# Windows:控制面板 → 程序和功能 → 卸载NVIDIA相关所有组件

# Linux:
sudo apt-get purge nvidia-*
sudo apt-get autoremove

第二步:下载对应驱动

去NVIDIA官网,选择你的显卡型号和操作系统。我个人建议选「Studio Driver」而不是「Game Ready Driver」。为什么?Studio驱动更稳定,适合开发环境。

第三步:安装

Windows下双击运行,一路下一步就行。Linux下稍微麻烦点:

sudo chmod +x NVIDIA-Linux-*.run
sudo ./NVIDIA-Linux-*.run

安装完重启,用 nvidia-smi 验证。看到类似下面的输出,说明驱动装好了:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.85.05    Driver Version: 525.85.05    CUDA Version: 12.0     |
+-----------------------------------------------------------------------------+
💡 小技巧: nvidia-smi 显示的CUDA Version是驱动支持的最高版本,不是你实际安装的CUDA Toolkit版本。别搞混了。

3.3 CUDA Toolkit安装

驱动装好了,接下来装CUDA Toolkit。说白了,这就是CUDA编程的「编译器+运行时库」。

版本选择

我建议你选最新的稳定版,但别追最新。比如现在CUDA 12.x是主流,那就装12.x。为什么?因为PyTorch、TensorFlow这些框架对新版CUDA的支持有滞后。

安装步骤

去NVIDIA CUDA Toolkit存档页面下载。Windows下是exe安装包,Linux下是runfile或deb包。

# Linux下用runfile安装(推荐)
sudo sh cuda_12.0.0_525.60.13_linux.run

# 注意:安装时不要勾选Driver,因为我们已经装过了

安装路径默认在 /usr/local/cuda-12.0。我个人习惯创建一个软链接:

sudo ln -s /usr/local/cuda-12.0 /usr/local/cuda

这样以后升级版本,只需要改软链接就行。

3.4 cuDNN配置

cuDNN是NVIDIA专门为深度学习优化的库。如果你只是做通用GPU计算,可以不装。但做深度学习,必须装。

下载cuDNN

需要注册NVIDIA开发者账号。下载对应CUDA版本的cuDNN。比如你装的是CUDA 12.0,就下载cuDNN for CUDA 12.x。

安装

其实cuDNN不需要安装,解压后把文件复制到CUDA目录就行:

# 解压
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 Toolkit匹配。我曾经因为cuDNN版本不对,训练模型时直接报「CUDNN_STATUS_NOT_INITIALIZED」,排查了半天。

3.5 环境变量设置

装完了,系统还不知道CUDA在哪。需要告诉它。

Linux下(~/.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 使其生效。

Windows下

系统环境变量里添加:

  • CUDA_PATHC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0
  • PATH 里追加 %CUDA_PATH%\bin%CUDA_PATH%\libnvvp
💡 我的习惯: 设置完环境变量后,打开一个新终端,用 echo $CUDA_HOME 检查一下。很多问题都是环境变量没生效导致的。

3.6 验证安装

终于到了最激动人心的环节。验证一下到底能不能用。

验证CUDA Toolkit

nvcc --version

看到类似 Cuda compilation tools, release 12.0, V12.0.76 就对了。

验证cuDNN

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

会输出类似:

#define CUDNN_MAJOR 8
#define CUDNN_MINOR 9
#define CUDNN_PATCHLEVEL 0

写个简单程序测试

我个人习惯写一个最小的CUDA程序来验证:

#include <stdio.h>

int main() {
    int deviceCount;
    cudaGetDeviceCount(&deviceCount);
    
    printf("找到 %d 个CUDA设备\n", deviceCount);
    
    for (int i = 0; i < deviceCount; i++) {
        cudaDeviceProp prop;
        cudaGetDeviceProperties(&prop, i);
        printf("设备 %d: %s\n", i, prop.name);
        printf("  计算能力: %d.%d\n", prop.major, prop.minor);
        printf("  显存大小: %.2f GB\n", prop.totalGlobalMem / 1024.0 / 1024.0 / 1024.0);
    }
    
    return 0;
}

编译运行:

nvcc test.cu -o test
./test

看到输出你的显卡信息,恭喜你,环境搭建成功了!

⚠️ 常见问题:
  • 「nvcc: command not found」→ 环境变量没配好
  • 「cudaGetDeviceCount返回0」→ 驱动问题,或者权限不够
  • 「libcudart.so找不到」→ LD_LIBRARY_PATH没设置对
别慌,大部分问题都是路径问题。检查一下环境变量,基本能解决。

3.7 我的一些建议

环境搭建这件事,说白了就是「耐心」二字。我刚开始学CUDA时,光装驱动就重装了三次系统。后来总结出一套经验:

  • 用Docker:如果你只是做开发,NVIDIA提供了官方CUDA Docker镜像。一行命令就能拉起环境,省心省力。
  • 记录版本号:把驱动版本、CUDA版本、cuDNN版本记下来。以后出问题,排查起来快很多。
  • 别用太老的版本:CUDA 10.x虽然稳定,但很多新库已经不兼容了。建议用CUDA 11.x或12.x。

好了,环境搭好了,下一章我们正式开始写CUDA代码。到时候你会发现,前面这些折腾都是值得的。