2、CUDA环境搭建:NVIDIA驱动安装、CUDA Toolkit安装、cuDNN配置、环境变量设置与验证
说实话,环境搭建这事儿,看着简单,但坑是真不少。
我见过太多同学,代码写得挺溜,结果一跑就报错。查了半天,原来是驱动版本不对。嗯,咱们今天就把这事儿一次性搞定。
2.1 NVIDIA驱动安装
先说说驱动。这是CUDA能跑起来的基础。
我个人习惯,装驱动前先看看自己显卡型号。你可以在终端里敲:
lspci | grep -i nvidia
或者用Windows的话,打开设备管理器,在显示适配器里就能看到。
拿到型号后,去NVIDIA官网下载对应驱动。这里有个关键点:别装太新的,也别装太旧的。我建议选那种「稳定版」,就是官网标注了「Studio Driver」或者「Game Ready Driver」的长期支持版本。
装完驱动,重启一下。然后验证:
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。
/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的版本。
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程序。到时候你会发现,前面这些折腾都是值得的。