CUDA学习之路1——速通环境配置

1967 字
10 分钟
CUDA学习之路1——速通环境配置

在开始学习CUDA之前,环境配置是所有入门者的一大门槛。

在构建开发环境之前,我们需要理清几个核心组件的关系与定位:

Fuck You Nvidia!
Fuck You Nvidia!

核心组件定位
  1. Nvidia显卡驱动:安装在操作系统层面,全局唯一。
  2. CUDA Toolkit:安装在全局路径,可能有多个版本,需要切换。
  3. Pytorch/TensorFlow:安装在隔离的虚拟环境中,提供高层API。
  4. CUDA Runtime:随框架自动部署在虚拟环境中,无需手动单独配置。
操作系统版本

未来所有的实验我都会在Ubuntu24.04上进行,如果操作系统不一致的同学,可以自行修改其中的某些命令

Nvidia驱动配置#

打开终端,检查显卡是否被识别:

检查显卡是否被识别
检查显卡是否被识别

使用Ubuntu自带的驱动来进行安装。

  1. 更新软件源列表:
bash
sudo apt update
  1. 让系统自动推荐并安装最合适的驱动:
bash
sudo ubuntu-drivers devices

找到有推荐的那一栏
找到有推荐的那一栏

  1. 安装必要的依赖包
bash
sudo apt install -y alsa-utils
sudo apt install -y pciutils ubuntu-drivers-common
  1. 安装推荐的Nvidia驱动
bash
sudo apt install nvidia-driver-580-open
  1. 重启设备并验证安装
bash
sudo reboot
## 验证是否安装成功
nvidia-smi

如果一切正常,你会看到类似的输出:主要显示驱动版本和GPU信息:

成功安装驱动标识
成功安装驱动标识

CUDA工具套件配置#

安装驱动#

访问CUDA Toolkit Archive 选择一个稳定的版本,其中使用最多的为CUDA 11.8或者CUDA 12.6,目前最新的为13.2,为了演示,我安装13.2的最新版本,但是由于我的驱动是580,会不兼容,仅做演示

找到对应的版本后,选择相对应的套件:

找到对应的系统版本后,一般选择runfile(local)
找到对应的系统版本后,一般选择runfile(local)

bash
# 一定要找到对应的runfile,在nvidia官方网站去拷贝
wget https://developer.download.nvidia.com/compute/cuda/13.2.0/local_installers/cuda_13.2.0_595.45.04_linux.run
sudo sh cuda_13.2.0_595.45.04_linux.run
重点避坑操作!!
  1. 选择continue继续安装;
  2. 按回车键取消勾选驱动安装,因为我们已经装过驱动了
  3. 不要设置软连接,选择No
选择continue
选择continue
输入accept
输入accept
按回车取消勾选驱动安装
按回车取消勾选驱动安装
选择NO,稍后解释
选择NO,稍后解释

如果安装成功,你可以在/usr/local/路径下看到对应的版本:

为了不冲突,我选择安装最新版本的CUDA
为了不冲突,我选择安装最新版本的CUDA

我们直接使用绝对路径分别查看一下对应的nvcc版本:

同时加在cuda13.0和cuda13.2
同时加在cuda13.0和cuda13.2

到此为止我们已经成功安装了,但是如果我们直接输入nvcc --version,会发现环境还是没有切换。

仍然是我之前安装的nvcc13
仍然是我之前安装的nvcc13

因此我们需要在~/.bashrc或者~/.zshrc中告诉系统应该使用哪一个版本的CUDA:

bash
vim ~/.zshrc
# 或者是bashrc

如果你之前已经安装过一个版本的CUDA,则直接找到对应的两行:

使用底部模式:/cuda
使用底部模式:/cuda
找到之后修改cuda版本号:
只需要修改对应版本即可
只需要修改对应版本即可

:wq,保存vim并退出。

重新更新环境变量:

bash
source ~/.zshrc

成功更换版本
成功更换版本

Toolkit安装成功。

如果以后要版本切换,只需要改bashrc的两行版本号即可,前提是你多下载几个版本。
实际上580最高只支持13,我安装13.2会报错
到此为止已经可以写纯CUDA程序了

编写第一个CUDA程序#

我们写一个最基础的CUDA向量加法程序,利用GPU并行计算两个浮点数组的和,主要包括:

分配内存、数据传输、启动核函数、同步、传回结果、验证、释放资源这几个主要步骤。
#include <iostream>
#include <cuda_runtime.h>
// CUDA 核函数
__global__ void vectorAdd(const float* A, const float* B, float* C, int n) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < n) {
C[idx] = A[idx] + B[idx];
}
}
// 错误检查宏
#define CUDA_CHECK(call) \
do { \
cudaError_t err = call; \
if (err != cudaSuccess) { \
std::cerr << "CUDA 错误:" << cudaGetErrorString(err) \
<< " 在 " << __FILE__ << ":" << __LINE__ << std::endl; \
exit(1); \
} \
} while(0)
int main() {
// 1. 检查设备
int deviceCount;
CUDA_CHECK(cudaGetDeviceCount(&deviceCount));
if (deviceCount == 0) {
std::cerr << "没有找到支持 CUDA 的设备!" << std::endl;
return 1;
}
std::cout << "找到 " << deviceCount << " 个 CUDA 设备" << std::endl;
// 2. 数据大小
int n = 1 << 20;
size_t size = n * sizeof(float);
// 3. 主机内存分配与初始化
float* h_A = new float[n];
float* h_B = new float[n];
float* h_C = new float[n];
for (int i = 0; i < n; ++i) {
h_A[i] = static_cast<float>(i);
h_B[i] = static_cast<float>(i * 2.0f);
}
// 4. 设备内存分配
float *d_A, *d_B, *d_C;
CUDA_CHECK(cudaMalloc(&d_A, size));
CUDA_CHECK(cudaMalloc(&d_B, size));
CUDA_CHECK(cudaMalloc(&d_C, size));
// 5. 拷贝数据到设备
CUDA_CHECK(cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice));
CUDA_CHECK(cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice));
// 6. 配置核函数
int threadsPerBlock = 256;
int blocksPerGrid = (n + threadsPerBlock - 1) / threadsPerBlock;
// 7. 启动核函数
vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, n);
// 检查核函数启动错误
CUDA_CHECK(cudaGetLastError());
// 等待核函数完成
CUDA_CHECK(cudaDeviceSynchronize());
// 8. 拷贝结果回主机
CUDA_CHECK(cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost));
// 9. 输出前10个结果验证
std::cout << "计算结果示例(前10个元素):" << std::endl;
for (int i = 0; i < 10 && i < n; ++i) {
std::cout << "C[" << i << "] = " << h_C[i]
<< " (期望 " << h_A[i] + h_B[i] << ")" << std::endl;
}
// 10. 释放内存
CUDA_CHECK(cudaFree(d_A));
CUDA_CHECK(cudaFree(d_B));
CUDA_CHECK(cudaFree(d_C));
delete[] h_A;
delete[] h_B;
delete[] h_C;
return 0;
}

之后使用nvcc进行编译:

Terminal window
nvcc hello.cu -o hello
./hello

结果如上
结果如上

至此,CUDA的基础开发环境已经配置完成。

Pytorch和Triton配置#

包管理工具配置#

根据我先前提到的,关于Pytorch,一般来说都是要单独隔离的。

现在市面上有太多关于Conda的配置文章了,实际上Conda慢得要死,特别是安装Pytorch这种大库时,真的不知道是卡住了还是在加载。

而pip又没有环境隔离功能,因此我选择使用uv

uv的解析和下载都非常直观,并且几乎没有环境冲突,我们可以全程使用uv pip来安装任何东西。

哦对!更令人可恶的是,conda还非常大!!!! 它一个垃圾环境吃掉我电脑几十个G,把我的硬盘都塞满了。

话不多说,我们现在开始继续安装:

  1. 安装uv
bash
curl -LsSf https://astral.sh/uv/install.sh | sh
  1. 同样,让它能够被系统识别:
Terminal window
source $HOME/.cargo/env
  1. 验证是否安装成功:
Terminal window
uv --version

如果有版本号输出,说明安装成功。

由于我们伟大的Great Firewall,我们不得不配置国内的镜像源。

bash
export UV_INDEX_URL="https://pypi.tuna.tsinghua.edu.cn/simple"
或者配一个梯子更加省心,至于配梯子的教程,按下不表。

快速安装pytorch和Triton#

这里是uv最爽的一步,因为uv会自动处理cuda版本匹配。

先在你的项目目录下创建一个uv环境,然后激活它:

Terminal window
# 创建环境
uv venv --python=3.14
# 激活环境
source .venv/bin/activate

之后再终端前面会出现(项目名)的这种格式。

这表明我们成功激活环境。

之后安装Pytorch,uv有一个专门的参数,它非常智能,能够自动检测系统的CUDA版本并安装对应的Pytorch。

Terminal window
uv pip install torch torchvision torchaudio --torch-backend=auto

这一步实际上非常快,因为uv是并发下载的。

安装好pytorch之后,那么再安装Triton。

因为Triton已经发布在PyPI上了,直接装就行。

Terminal window
uv pip install triton

最终我们进入Python的交互模式,效果如下图所示:

成功安装!
成功安装!

每次新建项目时,只需创建并激活虚拟环境,即可通过 uv pip 安装所需的包。

Nvidia Docker配置#

如果你会使用Docker,并且linux命令操作比较熟悉,那可以考虑使用Nvidia Docker来做配置。

它是一个让容器能够直接使用宿主机GPU的工具,会自动挂在Nvidia驱动、设备文件和必要的库,让容器内部的应用无需再次安装驱动。

我没用过,感兴趣的可以试试 Nvidia Container Toolkit

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

CUDA学习之路1——速通环境配置
https://dlog.com.cn/posts/cuda01/环境配置/
作者
杜子源
发布于
2026-03-25
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
杜子源
都是风景,幸会
公告
如果需要原图,请私信联系我。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
6
分类
3
标签
4
总字数
4,036
运行时长
0
最后活动
0 天前

目录