GPU 基础:从架构到关键参数
在搭建 AI 算力集群之前,必须先理解手中的“算力”到底是什么。GPU(图形处理器)最初为图形渲染设计,但其大规模并行计算能力恰好契合深度学习中的矩阵运算需求。本章从硬件视角拆解 GPU 的核心组成,帮助你建立对算力、显存、带宽等关键参数的直觉判断。
2.1 GPU 整体架构:从 SM 到 CUDA Core
现代 NVIDIA GPU(如 A100、H100、L40S)的内部结构可以抽象为三层:GPU 芯片 → GPC(图形处理簇)→ SM(流式多处理器)。每个 GPC 包含多个 SM,而 SM 才是真正执行计算的基本单元。
以 A100 为例,其 GA100 芯片包含 108 个 SM(实际启用 108 个),每个 SM 内部包含:
- 64 个 FP32 CUDA Core:用于单精度浮点计算,是深度学习推理和训练的主力。
- 32 个 FP64 Core:双精度计算单元,科学计算(如分子动力学)依赖它。
- 4 个 Tensor Core(第三代):专为矩阵乘加运算设计,支持 FP16、BF16、INT8 等混合精度,AI 训练吞吐量的核心来源。
- 4 个纹理单元:负责纹理采样,在 AI 推理中用于图像预处理加速。
- 共享内存(Shared Memory):每个 SM 最多 164KB,可配置为 L1 缓存或显式管理的暂存器。
CUDA Core 与 CPU 核心的本质区别在于:CPU 核心是“重核”,擅长复杂逻辑分支;CUDA Core 是“轻核”,数量庞大(A100 总计 6912 个),依赖大规模线程并行掩盖延迟。当你运行一个 PyTorch 模型时,torch.matmul 操作会被编译为大量线程块(Thread Block),每个线程块映射到一个 SM 上执行。
关键理解:GPU 性能不是由单个核心频率决定,而是由“核心数量 × 频率 × 指令效率”共同决定。A100 的 Boost 频率仅 1.41 GHz,远低于 CPU 的 3-4 GHz,但其 6912 个核心同时工作,峰值 FP32 算力可达 19.5 TFLOPS。
2.2 显存体系:容量、带宽与延迟
显存(VRAM)是 GPU 的“工作台”,存放模型权重、中间激活值、优化器状态和训练数据批次。显存参数直接影响你能训练多大的模型、多快的吞吐量。
| 参数 | 含义 | 典型值(A100 80GB) | 对 AI 负载的影响 |
|---|---|---|---|
| 显存容量 | 可同时驻留的数据总量 | 80 GB HBM2e | 决定最大模型规模(如 175B 参数模型需多卡) |
| 显存带宽 | 每秒读写显存的数据量 | 2,039 GB/s | 影响数据搬运速度,带宽不足会“饿死”计算单元 |
| 显存位宽 | 一次读写的数据通道宽度 | 5,120 bit | 带宽 = 位宽 × 频率 / 8,位宽越大带宽越高 |
| 延迟 | 单次访问显存的等待时间 | 约 400-600 ns | 对随机小数据访问敏感,但 AI 负载多为顺序大块读写 |
带宽的计算公式为:带宽 = 显存频率 × 位宽 / 8。例如 A100 的 HBM2e 频率为 2.4 Gbps,位宽 5120 bit,则理论带宽 = 2.4 × 10⁹ × 5120 / 8 = 1,536 GB/s(实际标称 2,039 GB/s 因采用双倍数据速率计算)。
在集群环境中,显存带宽比显存容量更常成为瓶颈。当使用数据并行训练时,每个 GPU 需要从显存读取完整的模型权重和梯度;若带宽不足,计算单元会频繁等待数据,导致 GPU 利用率(DCGM 指标中的 sm_occupancy)下降。
2.3 算力指标:TFLOPS 与 Tensor Core
算力是 GPU 最直观的性能标尺,但必须区分精度类型。NVIDIA 官方规格表通常给出以下数值:
- FP32(单精度):A100 为 19.5 TFLOPS,适用于传统 HPC 和部分推理。
- TF32(Tensor Core 加速):A100 为 156 TFLOPS,用于混合精度训练中的矩阵运算。
- FP16(半精度):A100 为 312 TFLOPS,深度学习训练最常用的精度。
- INT8(整数):A100 为 624 TOPS,用于推理量化。
Tensor Core 是这些高算力的来源。它在一个时钟周期内可完成 4×4 矩阵乘法,而普通 CUDA Core 需要多个周期。PyTorch 中启用混合精度训练(AMP)时,torch.cuda.amp.GradScaler 会自动将部分计算转为 FP16,从而利用 Tensor Core 加速。
# 查看 GPU 算力与显存参数(Linux 环境)
nvidia-smi --query-gpu=name,memory.total,memory.free,compute_cap \
--format=csv
# 输出示例
# A100-SXM4-80GB, 81920 MiB, 81234 MiB, 8.0
compute_cap 表示计算能力版本(如 8.0 对应 Ampere 架构),它决定了 CUDA 版本兼容性和某些硬件特性(如 BF16 支持)。
2.4 实际场景:从参数到集群选型
假设你要部署一个 7B 参数的 Llama-2 模型进行微调。我们来估算显存需求:
- 模型权重:7B × 2 字节(FP16)= 14 GB
- 梯度:与权重相同大小 = 14 GB
- 优化器状态(AdamW):每个参数需 4 字节(FP32 主权重)+ 4 字节(动量)+ 4 字节(方差)= 12 字节,即 7B × 12 = 84 GB
- 中间激活值:取决于批次大小和序列长度,通常 2-8 GB
总计约 114-120 GB,单张 A100 80GB 无法容纳。此时需要采用 ZeRO Stage 2 或 模型并行 将优化器状态分片到多张 GPU。若使用 2 张 A100,每张需承载约 60 GB,勉强可行;若使用 4 张,则每张约 30 GB,留有充足余量。
选型经验:训练场景优先看显存容量和 Tensor Core FP16 算力;推理场景(尤其是批量小、延迟敏感)更关注显存带宽和 INT8 算力。例如,7B 模型推理用 L40S(48GB,FP16 算力 91 TFLOPS)比 A100 更经济。
2.5 常见误区与排查思路
在集群运维中,对 GPU 参数的误解常导致性能问题。以下是三个高频误区:
误区一:显存越大,训练越快。 显存容量只决定“能不能装下”,训练速度由算力和带宽决定。若模型已能装入显存,增加容量不会提升速度;反而可能因多卡通信开销导致性能下降。
误区二:TFLOPS 越高,实际性能越好。 规格表上的 TFLOPS 是理论峰值,实际利用率(MFU,Model FLOPs Utilization)通常只有 40%-60%。影响利用率的因素包括:数据加载是否成为瓶颈、通信是否重叠计算、算子是否融合。使用 ncu(NVIDIA Nsight Compute)可以分析 kernel 的 SM 占用率和内存吞吐。
误区三:忽略 PCIe 与 NVLink 的带宽差异。 多卡通信时,NVLink(A100 为 600 GB/s)比 PCIe 4.0(32 GB/s)快近 20 倍。若使用数据并行,梯度同步依赖通信;若误用 PCIe 连接多卡,训练效率会急剧下降。检查 nvidia-smi topo -m 可确认 GPU 互联拓扑。
# 检查 GPU 间通信拓扑
nvidia-smi topo -m
# 输出示例(部分)
# GPU0 GPU1 GPU2 GPU3
# GPU0 X NV2 NV2 SYS
# GPU1 NV2 X NV2 SYS
# GPU2 NV2 NV2 X SYS
# GPU3 SYS SYS SYS X
其中 NV2 表示 NVLink 2.0 连接,SYS 表示 PCIe 连接。若训练任务中 GPU0 与 GPU3 频繁通信,而它们仅通过 PCIe 连接,则通信延迟会显著拉长。