第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是开发的核心。它包含了编译器、运行时库、调试工具等。

安装步骤:

  1. 去NVIDIA官网下载对应系统的CUDA Toolkit安装包
  2. 选择.run或.deb格式(Linux下我习惯用.run)
  3. 运行安装命令,按提示操作

举个例子,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的深度学习加速库。做量化因子挖掘时,很多算子会用到它。

安装步骤:

  1. 去NVIDIA官网下载cuDNN(需要注册账号)
  2. 选择与CUDA Toolkit匹配的版本
  3. 解压后复制到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 本章知识体系

下面这张图,帮你理清环境搭建的完整流程:

CUDA环境搭建流程 检查GPU nvidia-smi 安装CUDA Toolkit nvcc --version 配置cuDNN 版本匹配 验证 跑demo 常见问题 驱动版本不匹配 环境变量未配置 环境就绪 先检查硬件 再装软件 最后验证

说白了,环境搭建就三步:检查硬件、安装软件、验证跑通。每一步都有对应的命令和检查点。按这个流程走,基本不会出大问题。


专注资料整理