2. GPU硬件与算力基础
要理解云原生环境中的 GPU 算力治理,第一步不是学调度器,而是把一块 GPU 从"芯片内部"到"集群互联"看清楚。GPU 之所以能承担大模型训练与推理,核心在于它把大量算力组织成层次化的并行结构,并用一套专门的存储与互联体系把数据持续喂给计算单元。本节按"计算单元 → 存储层次 → 卡间互联 → 性能指标"的顺序展开,帮助你在后续做资源切分、拓扑感知调度和性能排障时,知道每个数字背后对应的是哪一层硬件。
一、GPU 架构:从 SM 到 Warp 的执行组织
以 NVIDIA 的通用 GPU 为例,整块芯片由若干 GPC(图形处理集群)组成,每个 GPC 内含多个 SM(Streaming Multiprocessor,流式多处理器)。SM 是 GPU 真正执行指令的基本单元,也是资源分配与占用率(Occupancy)计算的对象。一个 SM 内部包含:
- CUDA Core(FP32/INT32 单元):执行标量浮点与整数运算,是通用并行计算的主力。
- Tensor Core:执行矩阵乘加(如 D = A×B + C)的专用单元,是深度学习训练与推理算力的主要来源。
- 寄存器文件与共享内存/L1:SM 内的高速存储,决定线程块能驻留多少。
- Warp Scheduler 与 Dispatch Unit:以 32 个线程为一个 Warp 进行调度,通过多 Warp 切换隐藏访存延迟。
关键概念是 SIMT(单指令多线程):一个 Warp 内 32 个线程执行同一条指令,但各自操作不同数据。当 Warp 内线程因条件分支走向不同路径时会发生"分支发散",两条路径被串行执行,有效并行度下降。因此写 kernel 时让同一 Warp 内线程走相同分支,是提升效率的基本功。
二、显存层次:为什么"算得快"还要"喂得上"
GPU 的存储是一个明显的金字塔结构,越靠近计算单元越快、越小、越贵:
| 层级 | 典型容量/带宽(示例量级) | 作用 |
|---|---|---|
| 寄存器 | 每 SM 数十 KB,单线程最多 255 个 | 线程私有,零延迟访问 |
| 共享内存 / L1 | 每 SM 约 100–256 KB | 线程块内共享,需显式管理 |
| L2 缓存 | 数 MB 至数十 MB | 全芯片共享,缓存全局访存 |
| HBM 显存 | 如 40/80 GB,带宽约 1.5–3 TB/s | 存放模型权重、激活、KV Cache |
这里有一个常被忽视的工程事实:大模型推理往往是显存带宽受限而非算力受限。以自回归解码为例,每生成一个 token 都要把全部权重从 HBM 读一遍,理论吞吐上限约等于"显存带宽 ÷ 模型字节数"。一块 80 GB、带宽 2 TB/s 的卡跑 FP16 的 70B 模型(约 140 GB 权重,需多卡),单卡每 token 至少读 140 GB 量级数据,这就是为什么推理优化里量化、KV Cache 管理、批处理如此重要。判断一个负载是"算力瓶颈"还是"带宽瓶颈",可用算术强度(Arithmetic Intensity,FLOPs/Byte)与硬件的"算力/带宽比"对比:低于该比值即为带宽受限。
三、CUDA Core 与 Tensor Core:两种算力的分工
CUDA Core 擅长逐元素运算、归约、控制逻辑和精度要求特殊的计算;Tensor Core 则专为矩阵乘加设计,在 FP16/BF16/FP8/INT8 等低精度下提供数倍到数十倍于 CUDA Core 的吞吐。以示例量级说明:某代数据中心 GPU 的 FP32 约 60 TFLOPS,而 FP16 Tensor Core 可达约 1000 TFLOPS(含稀疏),差距接近一个数量级。这解释了为什么现代训练框架都尽量把计算映射到矩阵乘,并启用 TF32/BF16 混合精度。
但 Tensor Core 有使用门槛:矩阵维度需满足对齐要求(如 16 的倍数),否则会走回退路径导致性能骤降。实践中若发现某个 GEMM 层异常慢,先检查 shape 是否对齐,再检查是否被框架自动降级。
四、NVLink 与 PCIe:拓扑决定多卡效率
单卡算力再强,大模型也必须多卡协同。卡间通信走哪条路,直接决定扩展效率:
- PCIe:通用总线,PCIe 4.0 x16 单向约 32 GB/s,5.0 约 64 GB/s。跨节点、跨设备通信默认走它,延迟高、带宽低。
- NVLink:GPU 间专用高速链路,单链路可达数百 GB/s,是张量并行(TP)和专家并行(EP)的通信基础。
- NVSwitch:把多张卡做成全互联,避免"某些卡对之间绕路",让 AllReduce、AllToAll 等集合通信更均衡。
这带来一个重要的调度原则:拓扑感知调度。如果一次训练任务需要 8 卡 TP,而调度器把 8 张卡分散到不同节点、只靠 PCIe 通信,通信时间可能超过计算时间,扩展效率断崖式下跌。因此云原生平台在做 GPU 分配时,应尽量把同一任务的卡放在同一 NVLink 域内,并优先选择同型号、同拓扑的节点。这也是为什么 Kubernetes 生态里出现了拓扑感知的 GPU 调度插件。
五、算力单位与性能指标:把数字读成结论
常见指标及其含义:
| 指标 | 含义 | 使用场景 |
|---|---|---|
| TFLOPS | 每秒万亿次浮点运算 | 衡量峰值算力,注意精度前缀 |
| 显存带宽 GB/s | HBM 每秒可搬运数据量 | 判断推理/大 batch 是否带宽受限 |
| 算术强度 | FLOPs / Byte | 与硬件算力带宽比对比,定位瓶颈 |
| Occupancy | 活跃 Warp 占最大 Warp 比例 | 判断延迟隐藏能力 |
| MFU | 实测算力 / 峰值算力 | 训练效率核心指标,通常 30%–55% |
举例说明如何用这些指标做判断:假设某卡 FP16 峰值 1000 TFLOPS、HBM 带宽 2 TB/s,则算力带宽比约 500 FLOPs/Byte。若某算子的算术强度只有 50 FLOPs/Byte,它必然带宽受限,此时优化方向是提高数据复用(分块、融合算子),而不是继续堆算力。反之,若算术强度远高于 500,则应关注 Tensor Core 利用率、shape 对齐和占用率。
nvidia-smi 看显存占用与利用率,用 nvidia-smi topo -m 查看卡间拓扑(NVLink 还是 PCIe),用 Nsight Compute 看 SM 占用率、Tensor Core 活跃度和内存吞吐,三者结合即可快速判断是算力、带宽还是通信瓶颈。把这一节收束成一句话:GPU 的性能不是单一数字,而是"计算单元能力 × 存储供给能力 × 互联扩展能力"三者共同决定的结果。后续做资源切分、拓扑调度和可靠性治理时,你面对的每一个性能问题,几乎都能在这张层次图上找到对应的那一层。