CUDA(GPU 加速)

1. 定义

CUDA (Compute Unified Device Architecture) 是 NVIDIA 的并行计算平台 + 编程模型,让开发者用 GPU 做通用计算(不只是渲染图形)。深度学习、科学计算能”上 GPU 提速几十倍”,靠的就是 CUDA。

类比:CPU 像几个很强的全能工人(几核,擅长复杂串行任务);GPU 像成千上万个只会做简单活的小工(几千核,擅长同时干大量重复计算)。矩阵乘、卷积这种”同一套运算重复亿万次”的活,正好喂饱 GPU——CUDA 就是指挥这群小工的语言。

2. CUDA 解决了什么问题

神经网络训练的本质是海量矩阵运算,CPU 一个个算太慢。GPU 能大规模并行,但需要一套接口来调用它——CUDA 就是这套接口。

CPUGPU + CUDA
核心数几个~几十个几千个
擅长复杂串行逻辑大规模并行的简单运算
矩阵乘/卷积快几十倍
深度学习训练能跑但慢标配

注意:CUDA 只支持 NVIDIA 显卡。 AMD 显卡用 ROCm,Apple 芯片用 Metal/MPS,都是各自的对应方案。

3. 关键概念/名词(最容易被绕晕的部分)

名词是什么
GPU硬件,显卡本身
CUDANVIDIA 的并行计算平台/编程模型
CUDA Toolkit开发套件:编译器 (nvcc)、库、头文件——编译/开发 CUDA 程序时需要
NVIDIA Driver显卡驱动,操作系统和 GPU 通信的底层——任何情况都要装
CUDA Runtime运行 CUDA 程序需要的运行库(版本要和框架匹配)
cuDNNNVIDIA 的深度学习加速库(卷积等),PyTorch/TF 底层依赖
nvccCUDA 的编译器,编译 .cu 代码
计算能力 (Compute Capability)GPU 架构版本号(如 8.6),决定支持哪些特性

核心区分:Driver 版本 ≠ CUDA Toolkit 版本 ≠ 框架自带的 CUDA 版本。这三者的混淆是所有 CUDA 报错的根源,见第 6 节。

4. 最常用命令(查状态/排错)

nvidia-smi                    # 查 GPU 状态、显存占用、驱动版本、进程(最常用!)
nvcc --version                # 查 CUDA Toolkit(编译器)版本
nvidia-smi -l 1               # 每秒刷新一次,实时监控显存/利用率
watch -n 1 nvidia-smi         # 同上,Linux 常用写法

nvidia-smi 右上角显示的 “CUDA Version” 是驱动支持的最高 CUDA 版本,不是你实际装的 Toolkit 版本——这点极易误解(见第 6 节)。

5. 在 PyTorch 里用 CUDA(最常见场景)

大多数人不直接写 CUDA 代码,而是通过 PyTorch/TensorFlow 间接用:

import torch
 
torch.cuda.is_available()          # True = CUDA 能用(装对了)
torch.cuda.device_count()          # GPU 数量
torch.cuda.get_device_name(0)      # GPU 型号
torch.version.cuda                 # torch 编译时用的 CUDA 版本
 
x = torch.randn(3, 3).cuda()       # 张量搬到 GPU(等价 .to("cuda"))
model = model.to("cuda")           # 模型搬到 GPU

装 PyTorch 时不需要单独装 CUDA Toolkit——pip/conda 装的 GPU 版 torch 自带了配套的 CUDA 运行库。你只要装对的显卡驱动即可。见第 7 节。

6. 版本关系(新手最大的坑,务必搞清)

三个”CUDA 版本”经常打架:

① NVIDIA 驱动        → 决定"最高能支持到 CUDA 几"
       │  向下兼容
② CUDA Toolkit       → 你手动装的开发套件(写/编译 CUDA 才需要)
       │
③ torch 自带的 CUDA  → pip 装 torch 时选的版本(如 cu121 = CUDA 12.1)

关键事实:

  • nvidia-smi 里的 CUDA Version = 驱动支持的最高版本,不代表你装了那个 Toolkit
  • 驱动向下兼容:驱动支持 CUDA 12.4,那 torch 用 cu118 / cu121 都能跑
  • 用 PyTorch 通常不用装 Toolkit:pip 的 GPU 版 torch 自带运行库,只需驱动够新
  • 要匹配的是:torch 的 CUDA 版本 ≤ 驱动支持的最高 CUDA 版本

7. 装对 GPU 版 PyTorch(实战)

PyTorch 安装选择器 生成命令。本仓库统一用 pnpm 管 JS,但 Python 包用 uv / pip(见 ../command/uv.md):

# 先看驱动支持到 CUDA 几
nvidia-smi
 
# 装对应 CUDA 版本的 torch(cu121 = CUDA 12.1)
pip install torch --index-url https://download.pytorch.org/whl/cu121
# 或用 uv
uv pip install torch --index-url https://download.pytorch.org/whl/cu121
 
# 验证
python -c "import torch; print(torch.cuda.is_available())"   # 要 True

装成了 CPU-only 版本(is_available() 返回 False)是最常见的失败——多半是没加 --index-url 或选错了 CUDA 版本。

8. 常见坑

  • torch.cuda.is_available() 返回 False:①装成了 CPU 版 torch;②驱动没装/太旧;③CUDA 版本和驱动不匹配
  • nvidia-smi 的 CUDA Version 当成已装 Toolkit 版本:它是驱动支持的上限,不是实际安装的
  • 驱动太旧撑不起新 torch:升级 NVIDIA 驱动(通常不用动 Toolkit)
  • CUDA out of memory:显存不够,nvidia-smi 看占用;减小 batch、关掉其他占卡进程、torch.cuda.empty_cache()
  • Mac 上找 CUDA:Apple 芯片没有 NVIDIA GPU,用不了 CUDA,改用 mps 后端(torch.backends.mps.is_available()
  • 多卡时进程乱占卡:用环境变量 CUDA_VISIBLE_DEVICES=0 指定只用某张卡
  • 版本地狱:不同项目要不同 CUDA/torch 版本 → 用虚拟环境隔离(见 venv.md / ../command/uv.md

9. 延伸阅读 / 关联概念

  • PyTorch — 最常见的 CUDA 使用入口,.to("cuda") 一句话上 GPU;见 torch.md
  • cuDNN — 深度学习专用加速库,框架底层依赖
  • MPS (Metal Performance Shaders) — Apple 芯片的 GPU 加速后端,Mac 上代替 CUDA
  • ROCm — AMD 显卡的对应方案
  • 虚拟环境隔离 — 不同项目 CUDA/torch 版本冲突时的解法;见 venv.md../command/uv.md
  • 官方:CUDA Toolkit https://developer.nvidia.com/cuda-toolkit | PyTorch 安装器 https://pytorch.org/get-started/locally/