FEATURED · 精选文章

k8s-vgpu-scheduler虚拟显存原理揭秘:如何把GPU显存超分到物理容量的数倍?

发布时间 / 2026/8/28 10:40:14
来源 / 创域科博编辑部
栏目 / 资讯中心
k8s-vgpu-scheduler虚拟显存原理揭秘:如何把GPU显存超分到物理容量的数倍? k8s-vgpu-scheduler虚拟显存原理揭秘如何把GPU显存超分到物理容量的数倍【免费下载链接】k8s-vgpu-schedulerOpenAIOS vGPU device plugin for Kubernetes is originated from the OpenAIOS project to virtualize GPU device memory, in order to allow applications to access larger memory space than its physical capacity. It is designed for ease of use of extended device memory for AI workloads.项目地址: https://gitcode.com/gh_mirrors/k8s/k8s-vgpu-schedulerk8s-vgpu-scheduler现已并入 Project-HAMi是面向 Kubernetes 的 vGPU 设备插件与调度器一体化工具通过虚拟显存Virtual Device Memory技术把一块物理 GPU 的显存超分到物理容量的数倍让 AI 任务可以使用比真实显存更大的虚拟显存空间并自动完成 GPU 共享调度。为什么需要 GPU 显存超分在真实生产环境中GPU 的痛点从来不是算得不够快而是显存利用率低一块 V100 上跑 10 个推理服务每张卡的显存却大量空闲小规格实例需求大教学场景、云平台的小 GPU 实例要求一块卡切给多人用大模型显存不够用大 batch 训练、超大模型推理经常超出物理显存上限。k8s-vgpu-scheduler 给出的答案是把 GPU 拆成多个 vGPU每个 vGPU 有独立的显存配额并且允许配额总和超过物理显存——超出的部分用节点主存RAM充当交换区来承接。上图是项目整体架构以 Helm Chart 的形式部署由四个核心模块组成。四大核心模块vGPU 超分的分工模块职责通俗理解MutatingWebhook校验任务、改写 Pod 配置门卫检查你要的 vGPU 合不合规Scheduler实现 Filter/Score 调度扩展交警决定 Pod 去哪个 GPU 节点DevicePlugin按调度结果生成环境变量与挂载仓库管理员发放显存配额钥匙InContainer Control容器内硬限显存/算力司机运行时真正卡住用量调度流程的关键在于Webhook 会把调度决策哪张卡、多少显存写入 Pod 注解DevicePlugin 在节点上读取注解后再为容器注入环境变量并挂载限控库容器运行时runc拉起时一切已就绪。没有 vGPU 请求的普通 Pod 则直接走 kube-scheduler 默认调度零侵入。设备注册调度器如何看见每张 GPUDevicePlugin 会每 30 秒把每张设备的规格 patch 到节点注解上HAMi.sh/node-register-{device-type}格式为{设备UUID},{切分数},{显存上限},{算力上限},{设备型号},{NUMA},{健康状态}调度器据此掌握集群中每张卡的可分配余量。若某节点 5 分钟未握手其设备会被标记为不可用避免把任务调度到故障节点。虚拟显存是怎么实现的这是整个项目最魔法的部分原理可以拆成三层1️⃣ 配额超卖deviceMemoryScaling安装时把devicePlugin.deviceMemoryScaling设为大于 1的倍数 S物理显存 M 的 GPU 在集群中就变成了S × M的可分配显存。例如helm install vgpu vgpu-charts/vgpu --set devicePlugin.deviceMemoryScaling5 -n kube-system设为 5 后一张 16GB 的 GPU 在 Kubernetes 里可以卖出 80GB 的显存额度——这就是数倍超分的直接来源。2️⃣ 容器内拦截libvgpu.so预加载超分不只是调度器的数字游戏容器里还有真正的兜底。项目通过预加载机制lib/nvidia/ld.so.preload指向lib/nvidia/libvgpu.so即 HAMi-Core拦截 CUDA 的显存分配调用分配量 ≤ 物理剩余 → 走正常 GPU 显存分配量 物理上限 → 把超出部分换出到节点主存swap超过自身配额 → 由 OOM Killer 策略ACTIVE_OOM_KILLER决定是否终止任务。监控侧由cmd/vGPUmonitor/下的 vGPU 监控组件直接映射 CUDA 共享缓存区cudevshr实时统计每个进程在各张卡上的实际用量并通过 Prometheus/metrics暴露。3️⃣ 并发切分deviceSplitCount每张物理卡默认最多切 10 个 vGPUdeviceSplitCount配合显存/算力nvidia.com/gpucores配额一块卡可以同时承载多个轻量任务。⚠️ 官方将其标记为Experimental实验性特性换出到主存会带来性能损耗适合大 batch/大模型显存不够或低利用率任务想挤进同一张卡的场景。三步上手开启显存超分① 给 GPU 节点打标签让调度器接管kubectl label nodes {nodeid} gpuon② 用 Helm 安装并打开超分倍数helm install vgpu vgpu-charts/vgpu \ --set scheduler.kubeScheduler.imageTagv1.16.8 \ --set devicePlugin.deviceMemoryScaling3 -n kube-system③ Pod 里按显存申请 vGPU无需改业务代码resources: limits: nvidia.com/gpu: 1 # 1 张 vGPU nvidia.com/gpumem: 3000 # 3GB 显存配额MB申请超过任何单节点物理 GPU 数量时 Pod 会 pending这是预期的保护行为。性能实测超分代价有多大官方用 ai-benchmark 在 2×V100 上对比了三组方案原生 nvidia-device-plugin、vGPU关闭虚拟显存、vGPU开启虚拟显存覆盖 ResNet、VGG、LSTM、DeepLab 的推理与训练。结论比较直接不开虚拟显存时性能几乎无损开启虚拟显存后高负载训练场景有明显开销但换来的是跑得动。完整数据可参考 docs/benchmark.md 中的测试环境说明与benchmarks/ai-benchmark/下的复现 Job。常见问题 FAQQ开启超分后应用代码需要改吗不需要。Webhook 预加载库全程透明TensorFlow / PyTorch 等框架直接运行即可。Q超分的显存放在哪里节点主存RAM充当 swap性能低于物理显存建议只对确实显存吃紧的任务开启。Q除了 NVIDIA 还支持什么卡项目已扩展支持寒武纪 MLUdocs/cambricon-mlu-support.md与海光 DCUdocs/hygon-dcu-support.md。Q如何监控每张卡用量访问节点http://{nodeip}:31992/metricsGrafana 面板见docs/dashboard.md。总结k8s-vgpu-scheduler 用一套调度超卖 容器内拦截 主存换出的组合拳把 GPU 显存从独占资源变成了可自由切分、可超卖的弹性资源调度层Webhook 改写 Filter/Score 扩展自动均衡多节点 GPU 负载超分核心deviceMemoryScaling 1让显存额度突破物理上限主存兜底️运行时预加载libvgpu.so硬限配额防止任务互相踩踏可观测设备注册握手 Prometheus 指标故障节点自动剔除。对于想在一张卡上跑多个模型、或让显存不够用的大任务先跑起来的团队这套方案是目前 Kubernetes 生态中最完整的 vGPU 超分实践之一。【免费下载链接】k8s-vgpu-schedulerOpenAIOS vGPU device plugin for Kubernetes is originated from the OpenAIOS project to virtualize GPU device memory, in order to allow applications to access larger memory space than its physical capacity. It is designed for ease of use of extended device memory for AI workloads.项目地址: https://gitcode.com/gh_mirrors/k8s/k8s-vgpu-scheduler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻