CUDA(GPU 加速)
1. 定义
CUDA (Compute Unified Device Architecture) 是 NVIDIA 的并行计算平台 + 编程模型,让开发者用 GPU 做通用计算(不只是渲染图形)。深度学习、科学计算能”上 GPU 提速几十倍”,靠的就是 CUDA。
类比:CPU 像几个很强的全能工人(几核,擅长复杂串行任务);GPU 像成千上万个只会做简单活的小工(几千核,擅长同时干大量重复计算)。矩阵乘、卷积这种”同一套运算重复亿万次”的活,正好喂饱 GPU——CUDA 就是指挥这群小工的语言。
2. CUDA 解决了什么问题
神经网络训练的本质是海量矩阵运算,CPU 一个个算太慢。GPU 能大规模并行,但需要一套接口来调用它——CUDA 就是这套接口。
| CPU | GPU + CUDA | |
|---|---|---|
| 核心数 | 几个~几十个 | 几千个 |
| 擅长 | 复杂串行逻辑 | 大规模并行的简单运算 |
| 矩阵乘/卷积 | 慢 | 快几十倍 |
| 深度学习训练 | 能跑但慢 | 标配 |
注意:CUDA 只支持 NVIDIA 显卡。 AMD 显卡用 ROCm,Apple 芯片用 Metal/MPS,都是各自的对应方案。
3. 关键概念/名词(最容易被绕晕的部分)
| 名词 | 是什么 |
|---|---|
| GPU | 硬件,显卡本身 |
| CUDA | NVIDIA 的并行计算平台/编程模型 |
| CUDA Toolkit | 开发套件:编译器 (nvcc)、库、头文件——编译/开发 CUDA 程序时需要 |
| NVIDIA Driver | 显卡驱动,操作系统和 GPU 通信的底层——任何情况都要装 |
| CUDA Runtime | 运行 CUDA 程序需要的运行库(版本要和框架匹配) |
| cuDNN | NVIDIA 的深度学习加速库(卷积等),PyTorch/TF 底层依赖 |
| nvcc | CUDA 的编译器,编译 .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/