GPU不再整块分配:CUDA 13.4给显存划硬边界,Kubernetes按份额切卡
核心概要
NVIDIA CUDA 13.4新增一种对应用透明的分时共享模式,让每个工作负载只看到并被强制限制在一部分GPU显存内,超出申请量的分配会像在小显存GPU上一样失败。KAI Scheduler 从 v0.18.0 起提供 NvFractions 共享模式,负责挑选GPU切片并把显存与计算模式写进 Pod 注解,新开源算子 gpu-fractioning 在节点上执行这些限制并统计每个份额的实际用量。
深度剖析
Kubernetes 集群现在可以按显存份额共享单块GPU,而不必把整块设备分给一个工作负载。 此前 MIG 把GPU切成硬件隔离的实例,时间切片让多个进程轮流使用但不做显存强制,MPS 让进程在各自地址空间并发运行。 CUDA 13.4 在已有的 sm-sharing 计算共享模式之外加入带显存边界的时间共享模式,申请量之上的分配会失败,工作负载只看到GPU显存的一部分。
份额的分配与执行被拆成两件事:调度器决定谁拿哪块GPU的哪一份,节点上的算子负责把限制真正落到设备上。 这套节点侧工作独立于具体调度器,任何能写入这些注解的 Kubernetes 调度器都能借助 CUDA 强制执行GPU份额。 KAI Scheduler 从 v0.18.0 起提供 NvFractions 模式,把每个容器的显存分配与计算共享模式写入 Pod 注解,gpu-fractioning 读取注解并配置被分配的GPU。
显存可以按绝对大小或GPU比例申请,并可选一个在显存空闲时向上增长的限额。 省略限额时,限额等于申请量,工作负载被严格限制在它申请的额度内。 绝对大小用 nvidia.com/container.<c>.gpu-memory.limit 这类注解,比例用 kai.scheduler/container.<c>.gpu-memory.portion.limit,比例限额须大于 gpu-fraction 且小于 1。
计算共享有两种模式,区别在于工作负载是轮流运行还是同时运行。 时间切片是串行的,每个工作负载拥有独立的错误域;sm-sharing 是并行的,流式多处理器按需分配,所有工作负载共用一个错误域。 设 n 为共享一块GPU的工作负载数,两种模式下每个工作负载都大致得到 1/n 的计算量;一块GPU同一时间只运行一种计算模式,KAI Scheduler 按GPU而非按节点跟踪这一点。
启示与展望
适用范围是运行在 Kubernetes 上的 NVIDIA GPU 节点,需要 NVIDIA GPU Operator 提供驱动与容器运行时配置,并由调度器写入每容器注解;KAI Scheduler 从 v0.18.0 起提供 NvFractions 模式,管理员按集群选择一种共享模式。
sm-sharing 下所有工作负载共用一个错误域,材料建议只把彼此信任的工作负载放在一起;时间切片下每个工作负载有独立错误域。一块GPU同一时间只能运行一种计算模式,调度器必须避免在同一块GPU上混用两种模式。
