K8s集群GPU时间切片配置与避坑:让多Pod共享一块显卡
在 Kubernetes 集群里,如果一台服务器只装了一块 GPU,默认情况下同一时刻只能有一个 Pod 占用它,其余 Pod 会一直处于 Pending。
GPU 时间切片(Time-Slicing)要解决的问题就是:让多个 Pod 轮流使用同一块物理 GPU,从而提高单卡利用率。
它适合开发测试、小模型推理、教学环境等对显存隔离要求不高的场景;
如果你需要严格的故障隔离或显存硬隔离,应优先考虑 MIG 而不是时间切片。
下面按准备、配置、验证和排错的顺序讲清楚,命令和路径都可以直接照着改。
动手前需要确认的前提
时间切片依赖 NVIDIA 官方组件,先把环境核对清楚,能省掉后面大量排错时间。
- 服务器已安装 NVIDIA 驱动,执行
nvidia-smi能看到显卡型号和驱动版本。 - 集群已部署 NVIDIA GPU Operator,或者已手动安装
nvidia-device-plugin。 - 节点能被集群正常调度,
kubectl get nodes状态为 Ready。 - GPU 节点最好打上标签,例如
kubectl label node 节点名 gpu=on,方便后续用nodeSelector指定。
需要提醒的是:时间切片只做时间维度的轮流调度,不隔离显存。
一个 Pod 占满显存,其他 Pod 依然会失败。
所以生产环境要配合显存限额、请求队列和监控使用。
配置时间切片的核心步骤
时间切片通过修改设备插件配置实现,常见做法是给 GPU Operator 的 device-plugin 传入一个 ConfigMap。
第一步,创建或修改配置文件。
下面这段 YAML 里,replicas 表示每块物理 GPU 被拆成几个逻辑 GPU,这里设为 4:
apiVersion: v1
kind: ConfigMap
metadata:
name: time-slicing-config
namespace: nvidia-device-plugin
data:
any: |-
version: v1
flags:
migStrategy: none
sharing:
timeSlicing:
resources:
- name: nvidia.com/gpu
replicas: 4
把文件保存为 time-slicing-config.yaml,然后执行:
kubectl apply -f time-slicing-config.yaml
第二步,让设备插件读取这份配置。
如果使用 GPU Operator,可以通过修改 ClusterPolicy 指定配置名:
kubectl edit clusterpolicy -n gpu-operator
找到 devicePlugin.config.name 字段,
填入 time-slicing-config,
保存后 Operator 会重建 device-plugin 的 Pod。
第三步,等待设备插件重启完成:
kubectl get pods -n nvidia-device-plugin -w
当 Pod 状态恢复为 Running,说明新配置已生效。
如果你的集群是手动部署的 nvidia-device-plugin,则把上面的配置写入它的 DaemonSet 挂载 ConfigMap 中,并重启 DaemonSet。
用 Pod 验证切片是否生效
先查看节点可分配的 GPU 数量,正常情况下会从 1 变成 4:
kubectl describe node 节点名 | grep nvidia.com/gpu
然后创建一个申请 GPU 的测试 Pod:
apiVersion: v1
kind: Pod
metadata:
name: gpu-slice-test
spec:
restartPolicy: Never
containers:
- name: cuda
image: nvidia/cuda:12.0.0-base-ubuntu22.04
command: ["nvidia-smi"]
resources:
limits:
nvidia.com/gpu: 1
应用后查看日志:
kubectl apply -f gpu-slice-test.yaml
kubectl logs gpu-slice-test
能打印出 GPU 信息,说明这个 Pod 成功拿到了一片逻辑 GPU。
再同时启动多个同样的 Pod,如果都能 Running,就说明时间切片在正常工作。
容易踩的坑和对应排查
- Pod 一直 Pending,提示 insufficient nvidia.com/gpu:先确认
kubectl describe node里 GPU 数量是否已变成配置的份数;没有变化通常是 device-plugin 没读到新 ConfigMap。 - 修改配置后没生效:device-plugin 的 Pod 需要重启,检查
kubectl get pods -n nvidia-device-plugin是否出现了新副本。 - 多个 Pod 报显存不足:这是时间切片的固有限制,不是配置错误。请降低并发数、限制 batch size,或改用 MIG。
- 驱动和 CUDA 版本不匹配:确认容器镜像里的 CUDA 版本不高于宿主机驱动支持的上限,否则
nvidia-smi会报错。
另外,改动 device-plugin 会影响节点上所有 GPU 工作负载,建议在维护窗口操作,并提前备份 ClusterPolicy 和 ConfigMap 的旧内容,方便回滚。
什么时候该用、什么时候不该用
时间切片的好处是配置简单、改造成本低,适合单卡多用户共享、模型调参、CI 中的 GPU 任务等场景。
它的边界也很明确:不提供显存隔离和故障隔离,一个 Pod 崩溃或占满显存会影响同卡其他任务。
如果业务对稳定性和资源隔离要求高,MIG 或直接多卡分配会更稳妥。
常见疑问
时间切片能提高单卡总吞吐吗?
它主要提升利用率,让 GPU 不那么空闲。
多个任务并发时,单任务延迟可能上升,吞吐是否提升取决于任务类型。
改成时间切片后需要重启节点吗?
通常不需要,重启 device-plugin 即可;
但驱动升级或 Operator 大版本变更时,节点重启更保险。
切片份数设多少合适?
常用值是 2 到 8。
份数越多,单任务可用算力越少,建议结合实际负载逐步调整,不要一次设得过大。
如果按本文步骤配置后仍无法调度,优先回看设备插件日志和节点可分配资源,再决定是调整切片参数还是切换到 MIG。