第一章: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为例):
- 下载
cudnn-linux-x86_64-8.x.x.x_cudaX.Y-archive.tar.xz - 解压:
tar -xvf cudnn-linux-x86_64-8.x.x.x_cudaX.Y-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 /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时折腾了一整天,后来把步骤记下来,现在十分钟就能搞定。你也试试看?