第一章:CUDA开发环境搭建

说实话,我见过太多同学卡在环境搭建这一步了。明明代码写得没问题,结果一跑就报错——驱动版本不对、CUDA Toolkit没配好、cuDNN找不到库文件……这些坑我当年都踩过。今天咱们就把这套环境彻底捋清楚。

1.1 安装NVIDIA驱动

先说说驱动。这是最基础的一层,没有它,GPU就是个摆设。

我个人习惯用 nvidia-smi 来检查驱动状态。你打开终端,敲下这个命令,如果能看到GPU型号、驱动版本、显存信息,那就说明驱动装好了。

验证命令:

nvidia-smi

输出示例:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.85.05    Driver Version: 525.85.05    CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla T4            Off  | 00000000:00:1E.0 Off |                    0 |
| N/A   34C    P8     9W /  70W |      0MiB / 15360MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

嗯,这里要注意:驱动版本和CUDA版本是绑定的。比如驱动525.85.05最高支持CUDA 12.0,你装CUDA 12.1可能就识别不了。我在项目中遇到过有人装了最新驱动,结果CUDA Toolkit死活不认,最后发现是驱动太新、Toolkit太旧,不兼容。

小技巧:去NVIDIA官网下载驱动时,选「Game Ready Driver」或「Studio Driver」都行。但如果你做深度学习,我建议用Studio Driver,稳定性更好。

1.2 安装CUDA Toolkit

驱动装好了,接下来是CUDA Toolkit。这东西包含了编译器、库文件、调试工具等。

下载地址:https://developer.nvidia.com/cuda-downloads

选你的操作系统和架构,然后按官方指引安装。Linux下我习惯用runfile方式,Windows下用exe安装包。

安装完成后,验证一下:

验证命令:

nvcc --version

输出示例:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Wed_Nov_22_10:17:15_PST_2023
Cuda compilation tools, release 12.3, V12.3.107
Build cuda_12.3.r12.3/compiler.33567101_0

如果看到版本号,说明CUDA Toolkit装好了。但别高兴太早——环境变量配了吗?

我曾经帮一个同事调试,他nvcc能跑,但编译出来的程序运行时说找不到cudart库。一查,LD_LIBRARY_PATH没设。所以建议你把下面这几行加到 .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 让它生效。

注意:如果你装了多个CUDA版本,/usr/local/cuda 是一个软链接,指向你当前使用的版本。切换版本时,只需要改这个软链接就行。

1.3 安装cuDNN

cuDNN是NVIDIA针对深度神经网络的加速库。说白了,就是帮你把卷积、池化、归一化这些操作跑得更快。

下载cuDNN需要注册NVIDIA开发者账号,然后去 https://developer.nvidia.com/cudnn 下载对应CUDA版本的包。

安装步骤(以Linux为例):

  1. 下载 cudnn-linux-x86_64-8.x.x.x_cudaX.Y-archive.tar.xz
  2. 解压:tar -xvf cudnn-linux-x86_64-8.x.x.x_cudaX.Y-archive.tar.xz
  3. 复制文件到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 /usr/local/cuda/lib64/libcudnn*

验证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

看到版本号就对了。如果没输出,检查一下路径对不对。

避坑指南:我曾经遇到过cuDNN版本和CUDA版本不匹配,结果训练时直接报 cudnnStatusNotInitialized。后来查了官方兼容性表才发现,cuDNN 8.9只支持CUDA 11.x和12.x,我用的CUDA 10.2就不行。所以下载前一定先看兼容性。

1.4 验证安装成功

最后一步,写个简单的CUDA程序跑一下,看看整个链路通不通。

创建一个文件 test.cu

#include <stdio.h>

__global__ void hello_cuda() {
    printf("Hello from GPU block %d, thread %d\n", blockIdx.x, threadIdx.x);
}

int main() {
    printf("Hello from CPU\n");
    hello_cuda<<<2, 3>>>();
    cudaDeviceSynchronize();
    return 0;
}

编译运行:

nvcc test.cu -o test
./test

输出应该是:

Hello from CPU
Hello from GPU block 0, thread 0
Hello from GPU block 0, thread 1
Hello from GPU block 0, thread 2
Hello from GPU block 1, thread 0
Hello from GPU block 1, thread 1
Hello from GPU block 1, thread 2

看到这个,说明你的CUDA环境完全OK了。

注意:如果编译时报错 fatal error: cuda_runtime.h: No such file or directory,说明nvcc没找到头文件路径。检查一下 CUDA_HOME 环境变量是否设置正确。

1.5 常见问题与解决

问题 可能原因 解决方法
nvidia-smi 报错 驱动未安装或内核模块未加载 重新安装驱动,或 modprobe nvidia
nvcc --version 找不到命令 PATH环境变量未设置 添加 /usr/local/cuda/bin 到PATH
运行时找不到cudart库 LD_LIBRARY_PATH未设置 添加 /usr/local/cuda/lib64 到LD_LIBRARY_PATH
cuDNN版本不匹配 cuDNN与CUDA版本不兼容 查阅官方兼容性表,下载对应版本

嗯,基本上就这些了。环境搭建虽然繁琐,但一次配好,后面能省很多事。我记得第一次配CUDA时折腾了一整天,后来把步骤记下来,现在十分钟就能搞定。你也试试看?