星途科讯 1小时前
GPU利用率低却排队?揭秘K8s资源调度真相
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_font3.html

 

核心要点

利用率误区:GPU 计算利用率仅反映硅片忙碌程度,不代表设备可用性或内存状态。5% 的利用率可能意味着设备已被完全占用。

独占机制:Kubernetes 默认将整块 GPU 独占分配给 Pod。即使工作负载空闲,其他任务也无法使用该设备。

排队根源:看似空闲 GPU 旁出现排队,通常源于独占分配、内存耗尽、放置约束或应用层瓶颈,仅第一种可通过 GPU 共享解决。

技术权衡:时间片共享、MIG 和 MPS 在内存隔离、硬件要求及可观测性上各有优劣,无万能方案。

诊断逻辑:须按 " 分配状态→内存占用→放置约束→应用瓶颈 " 顺序排查,严禁跳跃。

自动化支持:Cast AI 支持上述三种共享方法,具备自动装箱能力,且无需修改工作负载清单。

GPU 利用率的真相与盲区

"GPU 利用率 " 常被混用于指代至少四种不同指标,这是导致运维误诊的主因。大多数仪表盘显示的 " 计算利用率 ",即给定时间内活跃流式多处理器(SM)的百分比。该数据仅表明芯片繁忙程度,无法反映设备是否可接纳新工作负载。

加载至 VRAM 的模型会持续占用内存。例如,推理服务可能每分钟仅处理一个请求,计算活动维持在 5%,但设备已被分配且内存被占用。此时,Kubernetes 调度器视该 GPU 为 " 不可用 ",而监控面板却显示其近乎 " 空闲 "。

下表厘清了四项常被归为 "GPU 利用率 " 的指标及其实际含义:

指标测量内容指示内容不指示内容
计算利用率 ( %SM ) 活跃 SM 百分比芯片忙碌程度设备可用性、内存占用或分配状态
内存利用率已用 VRAM 量模型权重和 KV 缓存占用空间计算能力是否闲置
分配状态nvidia.com/gpu 资源计数调度器眼中的设备可用性设备内部实际使用情况
请求吞吐量每秒处理请求数工作负载活跃水平底层硬件资源竞争情况

Cast AI 发布的《2026 年 Kubernetes 优化报告》分析了 2025 年 1 月至 2026 年 4 月期间数万个工作集群。数据显示,在未优化前,平均 GPU 计算利用率仅为 5%。尽管某集群在 136 个 H200 GPU 上保持了 49% 的利用率,但这属于特例。5% 的平均值反映了集群范围内普遍存在的过度配置和利用不足。然而,这并不意味着 95% 的容量可立即回收。每块 GPU 均需独立诊断,方可确定其真实状态。

工作负载为何在 " 空闲 "GPU 旁排队?四大成因

Kubernetes 调度器基于节点上的 nvidia.com/gpu 资源计数判断 GPU 是否 " 可用 ",而非依据芯片活动百分比。即便计算活动低迷,以下四种情况仍会导致队列堆积。

1. 工作负载独占整个设备

NVIDIA Kubernetes Device Plugin 默认采用独占分配模式。当 Pod 请求 nvidia.com/gpu: 1 时,即在生命周期内获得物理设备的独家所有权。无论该负载实际消耗多少资源,其他 Pod 均无法介入。

这是推理集群中 " 排队伴随空闲 " 现象的最常见成因。一组模型各自持有专用 GPU,虽仅服务于低频请求,导致设备计算活动低于 10%,但新工作负载因检测到 nvidia.com/gpu: 0 可用而被迫等待。Kubernetes 集群自动扩缩容器可新增节点,却无法回收现有节点的空闲容量。解决此问题需改变设备向调度器呈现的方式,即引入 GPU 共享机制。

2. 内存被占用,而非未充分利用

低计算利用率不等于内存可用。例如,一个 70B 参数的 FP16 模型仅权重便需约 140GB VRAM,若加上 KV 缓存,需求更高,至少需两块 A100 80GB GPU。即便是一个 13B FP16 模型(约占 26GB),虽可放入单块 A100,但其持续占用 VRAM。此时计算利用率可能仅报 8%,但设备已无法接纳新负载。

在配置共享前,务必检查量化策略。INT4 量化的 7B 模型仅需约 4GB,远低于 FP16 版本的 14GB。若总内存需求超出设备容量,时间片共享将导致部署失败或不稳定,因其复用计算权限但不划分内存。

建议先通过 nvidia-smi 检查内存占用。若空闲内存接近零,瓶颈在于 VRAM 容量而非计算调度。此时,提供硬件隔离内存分区的 MIG 可能是更优解,但需兼容硬件并调整调度方式。

3. 放置规则排除可用硬件

调度失败有时并非因 GPU 全部分配,而是因节点亲和性、拓扑分布约束或污点容忍度等放置规则限制。例如,指定需要 A100 的请求不会落在空闲的 H100 节点上;若工作负载请求的时间片副本数超过单节点供给且不跨节点分布,即便集群总容量充足,调度也会失败。

诊断此类问题需运行 kubectl describe pod <pending-pod>,查看 Events 部分是否有 MatchNodeSelector、InsufficientResource 或 TaintToleration 等错误。此类故障需通过调整调度配置解决,而非采购硬件。

4. 运行中的工作负载受外部阻塞

低计算读数也可能源于 GPU 外部的瓶颈,如 CPU 预处理、数据加载、PCIe 传输或网络往返。等待慢速分词或远程 KV 缓存的 LLM 推理服务器,其 %SM 活动虽低,但 GPU 并未空闲,而是在不同层级被阻塞。

若工作负载在短突发间于 0% 和高计算值间循环,可能受 CPU 限制;若持续接收请求却保持低计算,则可能受 I/O 或网络限制。增加 GPU 数量对此类问题无效,需优化 CPU 资源、批处理配置或数据管道。

Kubernetes GPU 分配实例解析

假设一个四 GPU 节点,每个 GPU 独占分配给一个推理服务。各服务处理突发查询,峰值计算活动 15%,非高峰低于 3%。当第五个服务部署时,因节点显示 nvidia.com/gpu: 0 可用而进入 Pending 状态。

启用时间片共享后,每个 GPU 可向调度器广告四个槽位,使第五个服务得以调度。但总延迟是否改善,取决于请求重叠频率、VRAM 占用及突发 SM 活动竞争情况。唯一确定答案的方法是进行测试。

专用 GPU、时间片共享、MIG 与 MPS 对比

Kubernetes 中存在四种 GPU 分配模型,各有适用场景与限制:

时间片共享:适用于所有 NVIDIA GPU(包括 T4、V100 等旧世代)。副本间无内存或故障隔离,VRAM 耗尽或 CUDA 上下文崩溃会影响同设备所有负载。仅适用于内存足迹 comfortably 适应设备 VRAM 的场景。

MIG ( Multi-Instance GPU ) :提供最强隔离保证。每个分区拥有物理分离的内存路径(交叉开关、L2 缓存、内存控制器等)。A100 等 Ampere 架构 GPU 最多支持七个实例。缺点是配置文件固定,运行时不可动态调整,且实例间不支持 NVLink,不适用于依赖高带宽通信的多 GPU 训练作业。

MPS ( Multi-Process Service ) :允许多个 CUDA 进程并发执行。结合 SM 分区(CUDA 11.0+),可提供比时间片共享更多的隔离,且无需 MIG 兼容硬件。Volta 及以上架构支持进程级故障隔离,但物理内存仍共享。

Cast AI 支持混合使用 MIG 和时间片共享。例如,将单个 A100 划分为七个 MIG 实例,每个实例配置四个时间片副本,从而向 Kubernetes 呈现 28 个逻辑 GPU 槽位。这种高密度配置需在部署前进行详尽的工作负载分析。

购买更多 GPU 前的诊断步骤

请按以下顺序排查瓶颈,找到活跃约束后即止:

步骤 1:检查节点间分配状态

运行:kubectl get nodes -o custom-columns=NAME:.metadata.name,GPU:.status.allocatable.'nvidia.com/gpu'

若所有节点可用 GPU 为 0 且负载排队,存在分配短缺,GPU 共享是潜在方案。若有可用槽位仍排队,转入步骤 3。

步骤 2:检查已分配设备的内存占用

在低计算活动但完全分配的节点上运行 nvidia-smi。若空闲内存接近零,瓶颈为 VRAM。时间片共享无效,需考虑 MIG 或带 SM 分区的 MPS。

步骤 3:检查待处理 Pod 的放置故障

运行:kubectl describe pod <pending-pod-name>

查找 Events 中的调度失败原因。若因放置规则导致,需调整调度配置。

步骤 4:观察运行负载的计算活动

使用 nvidia-smi dmon -s u 或 DCGM 指标收集时间序列。若 %SM 在 0 和高值间循环,可能受 CPU 限制;若持续低值,可能受 I/O 或网络限制。

步骤 5:验证硬件与提供商兼容性

时间片共享通用;MIG 需 Ampere 及以上架构;Cast AI MPS 目前在 GCP GKE 上运行。选择 unsupported 方案将导致配置错误。

注意可观测性限制:启用时间片共享时,DCGM-Exporter 无法关联每个容器的 GPU 指标。需依赖推理服务器原生遥测(如 vLLM 的 /metrics 端点)监控每个请求的 GPU 内存使用和队列深度。

如何安全测试 GPU 共享

在生产环境启用 GPU 共享存在风险,如无内存隔离的时间片共享可能导致延迟尖峰。建议采用 " 先测试后提交 " 策略:

单节点起步:在非生产命名空间中,通过 ConfigMap 在单节点启用时间片共享。从两个副本开始,逐步增加。

测量尾部延迟:关注 p95 和 p99 延迟,而非平均值。若 p99 超出 SLO,说明该配置不可行。

评估 MIG/MPS:对延迟敏感负载,评估 MIG 的硬件隔离优势。在 A100 上,3g.20gb 配置文件提供确定性吞吐量。

调整 VRAM 预分配:vLLM 默认预分配 90% VRAM。在时间片共享场景中,需通过 --gpu-memory-utilisation 标志降低此比例,为邻居留出余地。

确认 VRAM 适配:确保共调度负载的总 VRAM 需求不超过设备内存,否则将引发 OOM。

GPU 共享与放置自动化的价值

手动配置的共享策略难以适应模型发布和负载变化。Cast AI 通过自动化层解决此问题:

自动化共享:共享配置位于节点模板而非工作负载清单中,现有 Pod 无需修改即可迁移至共享设备。时间片共享可将每 GPU 副本数扩展至 48。

智能放置:基于动态资源分配(DRA),Cast AI 自动选择共享配置并在共享 / 分区 GPU 间分布负载,无需手动设置节点选择器。

方法选择:根据 VRAM 约束自动选择时间片共享、MIG 或 MPS。例如,单个 A100 可呈现 28 个逻辑槽位,但需经测试确保延迟达标。

案例:ALLEN Digital 通过共享实现 71% 成本降低

ALLEN Digital 在 SageMaker 上运行七款 ML 模型,每款独占 GPU 实例,导致高昂计费。迁移至 EKS 并使用 Cast AI 的 Kimchi Inference 后,通过 GPU 时间片共享、节点装箱及 Spot 实例组合,成本较 SageMaker 降低 71%,且延迟保持不变。

其中,时间片共享贡献约 20 个百分点的成本节省,模型合并至共享实例贡献 30-40 个百分点,Spot 实例及资源调整贡献剩余部分。尽管 BGE-M3 初期遇到兼容性问题,经两天调整后,延迟甚至优于 SageMaker 基线。

结论

看似空闲 GPU 旁的排队现象,极少源于硬件短缺,多为调度、分配、内存或应用层配置问题。遵循 " 分配→内存→放置→应用 " 的诊断序列,可精准定位瓶颈。GPU 共享仅解决分配案例;VRAM 约束需 MIG 或 MPS;放置故障需调整调度配置;应用瓶颈需优化 CPU 或数据管道。跳过中间步骤直接购买 GPU,往往无法解决等待问题。

常见问题

问:为什么 GPU 工作负载在利用率低时会排队?

答:Kubernetes 默认独占分配 GPU。即使工作负载计算活动仅 5%,只要其持有设备,其他 Pod 便无法使用。低利用率不等于可用容量。

问:GPU 分配和 GPU 利用率有什么区别?

答:分配是 Kubernetes 调度状态(可用 / 不可用);利用率是运行中负载的计算活动或内存占用。设备可被完全占用(对新负载不可用)同时报告低计算利用率。

问:Kubernetes 工作负载可以共享一个 GPU 吗?

答:可以,但需更改默认配置。支持时间片共享(软件复用)、MIG(硬件隔离分区,需 Ampere+)和 MPS(并发 CUDA 进程)。每种方法均有不同的隔离属性和硬件要求。

问:MIG 与时间片共享有何不同?

答:MIG 在硬件级别划分 GPU,提供内存和故障隔离,但实例间无 NVLink,且需特定硬件。时间片共享是软件级时间复用,通用性强但无内存隔离。

问:GPU 共享会影响推理延迟吗?

答:是的。时间片共享可能在突发请求时增加尾部延迟。MIG 通过硬件隔离消除干扰,但牺牲灵活性。MPS 介于两者之间。生产环境启用前必须进行真实负载测试。

问:团队应该在什么时候添加 GPU 而不是共享现有容量?

答:仅在排除分配、内存和放置约束后。若设备内存饱和、负载无法忍受共享延迟或请求量超出共享吞吐上限,才需新增 GPU。

【星途科讯 图文丨 LCC 首发于 ZAKER 科技,转载请注明出处】

智客推

智客推

ZAKER 智客推 GEO | AI 时代的品牌认知解决方案

一起剪

一起剪

ZAKER旗下免费视频剪辑工具

相关文章
评论
没有更多评论了
取消

登录后才可以发布评论哦

打开小程序可以发布评论哦

12 我来说两句…
打开 ZAKER 参与讨论