GPU 资源治理为什么难

草稿

GPU 资源治理的难点并非算力本身,而在于多维资源属性与平台治理之间的天然张力。理解这些根因,是实现高效共享与隔离的前提。

图 1: 为什么 GPU 资源治理难
图 1: 为什么 GPU 资源治理难

本章将从资源属性出发,系统解释 GPU 为什么天然不能“像 CPU 一样好调度”:显存成为第一约束、拓扑影响真实吞吐、共享带来不可预测干扰,尤其是在推理场景下,P99 尾延迟问题尤为突出。我们将通过一组典型事故模式建立直觉,并明确本书后续章节要解决的核心矛盾:如何把共享从“能跑”升级为“可声明、可治理、可验收”。

GPU 之难,不在“算力不够”,而在“资源形态不服从平台治理”

在 Kubernetes 平台中,CPU 和内存之所以易于调度,本质在于它们更接近“可拆分、可抢占、可度量、可隔离”的理想资源形态:

  • CPU 时间片天然可复用;
  • 内存可通过 cgroup 做硬约束,且 OOM(Out Of Memory,内存溢出)是清晰的失效方式;
  • 资源消耗与 QoS(Quality of Service,服务质量)问题在平台侧有成熟的治理语义(requests/limits、优先级、抢占、配额)。

相比之下,GPU 的核心挑战在于同时具备 强状态(stateful)强耦合(coupled)强多维(multi-dimensional) 三个特征,导致平台难以仅靠“声明式配额”获得确定性治理结果。 下图展示了 GPU 资源治理的三个核心维度及其带来的后果:

图 2: GPU 资源治理的三个核心挑战
图 2: GPU 资源治理的三个核心挑战

GPU 是多维资源:显存、算力、带宽、缓存、拓扑缺一不可

GPU 的可用性并非单一标量。实际场景中,你会遇到如下典型问题:

  • 显存先耗尽:尤其在大语言模型(LLM)推理的 KV cache(键值缓存)场景下,显存会随请求数与上下文长度动态增长。显存不仅要“够用”,还要“连续可复用”。例如,vLLM 的 PagedAttention 机制正是为了解决 KV cache 的浪费与碎片化问题,通过类似“分页”的方式降低碎片与冗余。相关论文报告显示,在相同延迟水平下可显著提升吞吐(如相较 FasterTransformer/Orca 可提升 2–4 倍)。(见 Efficient Memory Management for Large Language Model Serving with PagedAttention)

  • 算力并不等价于性能:即使分配了相同的 TFLOPS(万亿次浮点运算每秒),在不同并发、不同 kernel 组合、不同 stream 行为下,实际性能可能完全不同。

  • 拓扑决定上限:从单机 PCIe/NVLink 到多机网络(以及 NUMA, Non-Uniform Memory Access,非一致性内存访问亲和性),都会让“同样的 GPU 数量”对应完全不同的有效吞吐。

因此,GPU 资源治理不能简单地将其视为“一个整数”,而必须明确治理目标与资源单位。 以下是 GPU 多维资源属性与它们在共享时带来的核心问题:

图 3: GPU 多维资源及其共享挑战
图 3: GPU 多维资源及其共享挑战

GPU 共享的核心矛盾:利用率 vs 隔离性 vs 可预测性

在实际集群中,GPU 共享带来的挑战主要体现在利用率、隔离性和可预测性三者之间的权衡。

“共享能跑”不等于“共享可控”

许多集群采用“整卡独占”作为默认做法:每个 Pod 申请 nvidia.com/gpu: 1,调度器仅做整数匹配,设备插件负责分配设备给容器。(见 Kubernetes Device Plugin 文档)

这种方式实现简单,但会造成显著资源碎片:大量推理、小模型或轻量任务无法充分利用整卡,却被迫独占。

因此,业界自然追求 GPU 共享。但一旦共享发生,随之而来的问题包括:

  • 干扰(interference):多个工作负载在同一 GPU 上争抢 SM(Streaming Multiprocessor)、显存带宽、缓存,性能波动呈现“非线性”,尤其体现在尾延迟(P99)。
  • 可预测性缺失:难以保证“某租户获得 30% GPU 就一定能达到 X QPS / Y P99”。
  • 计量困难:CPU 可用 cgroup + 时间计量,GPU 的“算力占用”缺乏同等简单且一致的度量方式,尤其跨框架、跨运行时。

两条典型路径:强隔离的空间切分 vs 协作式共享

针对 GPU 共享,业界主要有两条典型技术路径:

MIG(Multi-Instance GPU,空间切分,强隔离)

  • 在 A100 等支持 MIG 的 GPU 上,可将一个物理 GPU 切分为多个彼此隔离的实例,每个实例拥有专属的计算与内存资源,并在系统视角表现为独立 GPU 设备。官方文档强调其“专用 compute 与 memory”,最多可切分为多个实例以供不同应用同时使用。(见 NVIDIA MIG User Guide)
  • 代价在于资源单位离散、重配置有运维成本,并且平台调度与设备形态耦合更紧。

MPS(Multi-Process Service,协作式共享,降低上下文成本)

  • NVIDIA MPS 允许多个进程共享 CUDA 上下文与调度资源,从而提升并发与利用率,并减少上下文切换成本。(见 NVIDIA Multi-Process Service)
  • 但 MPS 并非强隔离方案,更像“协作并发加速器”,对多租户 QoS、强隔离与严格配额的支撑有限。

本书后续将以这两条路径为“数据平面谱系”的关键锚点,进一步探讨更细粒度、更平台化的共享方式(如 HAMi 方向)。 下表总结了三种典型方案的权衡关系,帮助你理解为什么没有"完美方案",只有适合特定场景的选择:

图 4: GPU 共享方案的权衡关系
图 4: GPU 共享方案的权衡关系

Kubernetes 语义层面的限制:调度器看不到“GPU 的真实形态”

Kubernetes 的 device plugin 框架,旨在“将设备作为资源广告出来,并让 kubelet 能分配设备给容器”。这是扩展硬件资源的标准机制,但其资源表达天然偏向“可分配的离散资源”。

这带来如下直接后果:

  1. 资源单位倾向于整数:最典型如 nvidia.com/gpu: 1;即便引入 MIG,通常也表现为不同 profile 的离散资源(如 nvidia.com/mig-*)。
  2. 调度阶段缺少连续约束:调度器难以基于“显存剩余”“带宽压力”“推理 KV cache 形态”等连续变量做全局决策。
  3. QoS 难以端到端闭环:即使多个 Pod 被调度到同一张卡,平台仍缺乏标准化机制来保证它们的性能边界与相互影响上限。

因此,真正的平台化 GPU 管理通常需要将能力拆解为两部分:

  • 控制面(Control Plane):决定谁能用、何时用、用多少,包括排队、配额、优先级、公平性、准入等。
  • 数据平面(Data Plane):负责如何切分、隔离、计量与兑现,包括虚拟化/切分、隔离、资源分配与观测。

这正是本书结构设计的出发点。下图展示了平台化 GPU 管理的整体架构,其中控制面与数据平面通过闭环反馈协同工作:

图 5: 平台 GPU 管理的控制面与数据平面架构
图 5: 平台 GPU 管理的控制面与数据平面架构

一组“事故模式”帮助你快速识别问题本质

在真实集群中,以下事故模式频繁出现(它们往往不是偶发 bug,而是机制边界被触发):

  • 平均值很好,P99 崩溃:共享引入争用,尾延迟放大,尤其在推理服务并发上升时。
  • 显存看似够,但还是 OOM:KV cache 动态增长与碎片化导致“不可用的剩余”。
  • 同配额不同性能:所谓“30% GPU”在不同 workload 组合下对应完全不同的真实吞吐。
  • 调度成功≠可用:Pod 虽然调度成功,但实际吞吐低到不可接受,最终只能人工迁移或隔离。
  • 运维重配置触发连锁反应:如 MIG profile 调整导致设备集合变化,需要平台具备更强的“资源形态变更”承受能力。

这些现象将贯穿你对 MIG、HAMi、Volcano、Kueue 以及 vLLM/PyTorch 行为的理解。

以下是这些常见事故模式的详细分类,每一种都代表了平台治理的某个薄弱环节:

图 6: GPU 集群中的常见事故模式
图 6: GPU 集群中的常见事故模式

总结

GPU 资源治理的真正目标,不是“把 GPU 塞满”,而是实现可治理性:

  • 让共享成为一种可声明、可审计、可验收的能力;
  • 让隔离与利用率在可比较的决策轴上权衡;
  • 让控制面与数据平面协同,形成端到端闭环(准入/配额 → 分配/隔离 → 观测/计量 → 验收/迭代)。

下一章将介绍这套闭环的总框架:GPU 资源控制面地图,并以此作为后续所有项目与实验的统一归类方式。

参考文献

创建于 2025/12/30 更新于 2025/12/30 2872 字 阅读约 6 分钟