第2章:CUDA环境搭建 — 从零开始配好你的GPU开发环境
说实话,我见过太多人卡在环境搭建这一步。
明明代码写得挺好,一跑就报错。不是驱动版本不对,就是cuDNN没配好。我自己刚入行那会儿,也在这上面折腾了两三天。所以这一章,我带你一步步把环境搭稳。
2.1 先检查你的GPU
别急着装东西。先看看你手头的显卡能不能跑CUDA。
打开终端,敲一行命令:
nvidia-smi
如果能看到GPU型号、驱动版本、显存信息,说明驱动已经装好了。如果没有,先去NVIDIA官网下载对应驱动。
我建议你记下这几个信息:
- GPU型号(比如RTX 3090、A100)
- 驱动版本(比如535.129.03)
- CUDA版本号(比如12.2)
为什么要记?因为后面装CUDA Toolkit时,版本必须和驱动兼容。我踩过这个坑——装了个11.8的Toolkit,结果驱动只支持12.0,折腾半天才发现。
2.2 安装CUDA Toolkit
CUDA Toolkit是开发的核心。它包含了编译器、运行时库、调试工具等。
安装步骤:
- 去NVIDIA官网下载对应系统的CUDA Toolkit安装包
- 选择.run或.deb格式(Linux下我习惯用.run)
- 运行安装命令,按提示操作
举个例子,Ubuntu系统下:
wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run
sudo sh cuda_12.2.0_535.54.03_linux.run
小技巧:安装时选择“不安装驱动”,只装Toolkit。因为驱动你已经有了,重复装可能出问题。
装完后,配置环境变量。打开~/.bashrc,加上:
export PATH=/usr/local/cuda-12.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH
然后source一下:
source ~/.bashrc
验证是否装好:
nvcc --version
如果看到版本号,恭喜你,Toolkit装好了。
2.3 配置cuDNN
cuDNN是NVIDIA的深度学习加速库。做量化因子挖掘时,很多算子会用到它。
安装步骤:
- 去NVIDIA官网下载cuDNN(需要注册账号)
- 选择与CUDA Toolkit匹配的版本
- 解压后复制到CUDA目录
命令示例:
tar -xzvf cudnn-linux-x86_64-8.9.4.25_cuda12-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-12.2/include
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-12.2/lib64
sudo chmod a+r /usr/local/cuda-12.2/include/cudnn*.h /usr/local/cuda-12.2/lib64/libcudnn*
注意:cuDNN版本必须和CUDA版本严格对应。我曾经因为版本不匹配,训练时直接报“cuDNN error”,排查了一下午才发现是版本问题。
验证cuDNN是否生效:
cat /usr/local/cuda-12.2/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
看到版本号就对了。
2.4 开发环境验证
环境搭好了,跑个简单程序验证一下。
写一个CUDA版的向量加法:
#include <stdio.h>
__global__ void vec_add(float *a, float *b, float *c, int n) {
int idx = threadIdx.x + blockIdx.x * blockDim.x;
if (idx < n) {
c[idx] = a[idx] + b[idx];
}
}
int main() {
int n = 1024;
float *a, *b, *c;
float *d_a, *d_b, *d_c;
a = (float*)malloc(n * sizeof(float));
b = (float*)malloc(n * sizeof(float));
c = (float*)malloc(n * sizeof(float));
cudaMalloc(&d_a, n * sizeof(float));
cudaMalloc(&d_b, n * sizeof(float));
cudaMalloc(&d_c, n * sizeof(float));
for (int i = 0; i < n; i++) {
a[i] = i * 1.0f;
b[i] = i * 2.0f;
}
cudaMemcpy(d_a, a, n * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_b, b, n * sizeof(float), cudaMemcpyHostToDevice);
vec_add<<<(n + 255) / 256, 256>>>(d_a, d_b, d_c, n);
cudaMemcpy(c, d_c, n * sizeof(float), cudaMemcpyDeviceToHost);
printf("c[0] = %f, c[1023] = %f\n", c[0], c[1023]);
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);
free(a);
free(b);
free(c);
return 0;
}
编译运行:
nvcc -o vec_add vec_add.cu
./vec_add
如果输出 c[0] = 0.000000, c[1023] = 3069.000000,说明环境完全OK。
我个人习惯:每次换机器或重装系统后,都先跑这个向量加法。它虽然简单,但能快速验证CUDA编译器、运行时、内存管理、核函数调用是否都正常。
2.5 常见问题与避坑
环境搭建中,我遇到过不少问题。挑几个典型的说说:
- nvidia-smi报错:驱动没装好。重装驱动,或者检查是否被系统更新覆盖了。
- nvcc找不到:环境变量没配对。检查PATH里有没有cuda/bin。
- cuDNN报错:版本不匹配。用
cat /usr/local/cuda/include/cudnn_version.h确认版本。 - 编译时提示“cannot find -lcudart”:LD_LIBRARY_PATH没设对。检查lib64路径。
我曾经踩过的一个坑:在Docker里装CUDA,结果忘记把宿主机的驱动映射进去。折腾了两天,最后发现加个--gpus all参数就解决了。
2.6 本章知识体系
下面这张图,帮你理清环境搭建的完整流程:
说白了,环境搭建就三步:检查硬件、安装软件、验证跑通。每一步都有对应的命令和检查点。按这个流程走,基本不会出大问题。