尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

k8s-vgpu-scheduler设备插件内核解读:从NVML到自定义分配策略的完整实现

k8s-vgpu-scheduler设备插件内核解读:从NVML到自定义分配策略的完整实现 k8s-vgpu-scheduler设备插件内核解读从NVML到自定义分配策略的完整实现【免费下载链接】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在 Kubernetes 集群里做 GPU 共享核心组件就是k8s-vgpu-schedulerHAMi的 vGPU 设备插件Device Plugin。它负责把一张物理 GPU 切分成多个 vGPU按显存和算力比例分配给不同 Pod并通过 NVML 感知设备状态、通过自定义的Allocate逻辑实现软限制。本文从源码层面拆解这条链路NVML 设备发现 → Kubelet 注册 → 基于 Annotation 的自定义分配策略帮助新手快速建立完整认知。一、设备插件解决什么问题官方的 NVIDIA 设备插件只能按整卡分配 GPU。而 k8s-vgpu-scheduler 的设备插件允许一个 Pod 只申请 3000MB 显存 50% 算力多个任务共享同一张卡。上图对比了有无 HAMi 两种情况没有设备插件时两个用户各占整卡利用率 50%使用 HAMi 设备插件做 vGPU 切分后两任务共享 2 张卡利用率可达 100%。二、整体架构中的位置设备插件是 HAMi 三大组件Webhook、调度器、Device Plugin之一运行在每个 GPU 节点的 DaemonSet 中是调度决策的最后一公里。各组件职责详见 docs/develop/design.md组件职责Mutating Webhook校验任务改写schedulerNameHAMi SchedulerFilter Score把调度结果写入 Pod AnnotationDevice Plugin按 Annotation 生成环境变量与挂载完成实际分配注意HAMi 的设备插件是定制版本替换官方插件后行为才有保证。三、启动链路NVML 探测与 Kubelet 注册1. 入口与配置加载入口在 cmd/device-plugin/nvidia/main.go启动流程是创建kubelet socket 文件监听器fsnotifykubelet 重启时自动重连加载命令行参数与/config/config.json配置文件循环等待信号SIGHUP触发插件重启SIGTERM等触发退出。HAMi 在 NVIDIA 官方插件参数之上扩展了 vGPU 专属参数定义于 cmd/device-plugin/nvidia/vgpucfg.go参数默认值含义device-split-count2每张卡切分的 vGPU 数量device-memory-scaling1.0显存超分比例1 启用虚拟显存device-cores-scaling1.0算力超分比例disable-core-limitfalse关闭算力限制resource-namenvidia.com/gpu上报给 Kubelet 的资源名支持按节点粒度在config.json中覆盖见 vgpucfg.go 的 readFromConfigFile。2. NVML 初始化与运行模式选择plugin-manager.go 中NewPluginManager会创建 NVML 句柄按mig-strategy参数构造管理器并准备 CDI 处理器。真正的模式判定在 manager/factory.go 的resolveModeNVML 可用→ 走nvmlmanager常规数据中心 GPU 节点Tegra 系统→ 走tegramanager嵌入式设备两者都没有→ 降级为null管理器若设置fail-on-init-errortrue默认则直接退出。NVML 是 NVIDIA Management Library设备插件正是通过它枚举卡、查询显存/算力/温度并做健康检查。3. 注册与 ListAndWatch每个资源对应一个NvidiaDevicePlugin实例其 gRPC 服务实现于 pkg/device-plugin/nvidiadevice/nvinternal/plugin/server.goServe()在/var/lib/kubelet/device-plugins/下创建nvidia-resource.sock并启动 gRPCRegister()通过 Kubelet 的 registration socket 注册资源名ListAndWatch()向 Kubelet 推送设备健康状态设备异常时标记为Unhealthy后台启动CheckHealth健康检查协程。资源管理层定义在 rm/rm.goResourceManager接口屏蔽了 NVML/Tegra 差异NVML 具体实现在 nvml_manager.go它初始化 NVML 后构建deviceMap把物理卡映射为可上报的资源。四、核心自定义分配策略Allocate这是 HAMi 与官方插件最本质的区别。官方插件的Allocate只返回给哪些卡HAMi 的Allocate则要结合调度器写入的 Pod Annotation 决定给多少显存、多少算力并注入容器内硬限制。关键逻辑在 server.go 的 Allocate 方法分四步① 取出本节点待分配 Podutil.GetPendingPod(nodeName)根据节点名找到由 HAMi 调度器选中的目标 Pod并从其 Annotation 解码出调度结果pkg/util/util.go 的GetNextDeviceRequest得到每个容器的设备 UUID、显存量Usedmem与算力量Usedcores。② 校验请求一致性若 Annotation 中的设备数与 Kubelet 请求的DevicesIDs不匹配直接报device allocate number not matched错误保证调度决策不被绕过。③ 注入 vGPU 环境变量软限制的关键环境变量作用NVIDIA_VISIBLE_DEVICES容器可见的 GPU UUID 列表CUDA_DEVICE_MEMORY_LIMIT_0该容器每卡显存上限单位 MBCUDA_DEVICE_SM_LIMITSM算力占用上限CUDA_DEVICE_MEMORY_SHARED_CACHE显存超分时宿主机交换缓存文件CUDA_OVERSUBSCRIBE显存超分开关memory-scaling1 时置 trueCUDA_DISABLE_CONTROL关闭算力限制④ 挂载容器内硬限制组件设备插件会把宿主机上的libvgpu.soLD_PRELOAD 方式拦截 CUDA 调用实现显存/算力硬限制、ld.so.preload、按 Pod UID 创建的 vgpu 目录挂载进容器保证即使容器内程序试图越界申请显存也会被拦截。分配完成后调用EraseNextDeviceTypeFromAnnotation把该容器的设备请求从 Annotation 中划掉供多容器 Pod 的下一个Allocate调用继续消费。五、快速上手部署与验证GPU 节点安装nvidia-container-toolkit并将nvidia设为默认 runtime配置参考 README.md 的 Quick Start给节点打标签kubectl label nodes {nodeid} gpuon用 Helm 安装设备插件随 chart 部署为 DaemonSethelm install vgpu vgpu-charts/vgpu --set scheduler.kubeScheduler.imageTagv1.16.8 -n kube-system验证kubectl get pods -n kube-system | grep device-plugin kubectl describe node {nodeid} | grep nvidia.com设备插件的 Helm 模板位于 charts/vgpu/templates/device-plugin/其中 daemonsetnvidia.yaml 即 NVIDIA 版本 DaemonSet自定义资源名、显存比例等配置项详见 docs/config.md。六、源码地图速查模块路径说明插件入口cmd/device-plugin/nvidia/main.go启动、监听、重启循环vGPU 参数cmd/device-plugin/nvidia/vgpucfg.gosplit-count / scaling 等参数管理器工厂pkg/device-plugin/nvidiadevice/nvinternal/plugin/manager/NVML/Tegra/Null 三种模式选择资源管理pkg/device-plugin/nvidiadevice/nvinternal/rm/设备枚举、健康检查gRPC 服务pkg/device-plugin/nvidiadevice/nvinternal/plugin/server.go注册、ListAndWatch、AllocateAnnotation 工具pkg/util/util.go解析/擦除调度结果协议文档docs/develop/protocol.md调度器与设备插件的 Annotation 协议七、小结k8s-vgpu-scheduler 的设备插件 NVIDIA 官方插件的骨架NVML 发现 gRPC 注册 健康检查 HAMi 的分配灵魂Annotation 驱动的显存/算力切分 libvgpu.so 硬限制。理解了Allocate中读 Annotation → 校验 → 注入环境变量 → 挂载限制库这四步就掌握了 vGPU 设备插件实现 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-scheduler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表