十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Volcano vGPU 调度实战:HAMI-core 与 Dynamic MIG 双模式 GPU 共享方案详解

Volcano vGPU 调度实战:HAMI-core 与 Dynamic MIG 双模式 GPU 共享方案详解 Volcano vGPU 调度实战HAMI-core 与 Dynamic MIG 双模式 GPU 共享方案详解【免费下载链接】volcanoA Cloud Native Batch System (Project under CNCF)项目地址: https://gitcode.com/GitHub_Trending/vol/volcano本文以 Volcano 官方用户指南docs/user-guide/how_to_use_volcano_vgpu.md为核心系统讲解 Volcano vGPU虚拟 GPU调度的两种共享模式——HAMI-core 软件切片与 Dynamic MIG 硬件切片的完整落地方案。读完后你将掌握vGPU 调度环境的安装与校验方法、deviceshare调度插件的全部关键参数、volcano.sh/vgpu-*系列资源与注解的使用方式以及 PodGroup 设备打散、按 UUID 选卡、GPU 独占等进阶策略在调度器源码中的真实实现机制。两种 vGPU 共享模式HAMI-core 与 Dynamic MIGVolcano 为虚拟 GPUvGPU调度提供两种 GPU 共享模式两者在隔离层级与适用场景上差异明显1. HAMI-core软件级 vGPU通过VCUDACUDA API 劫持技术强制限制 GPU 核心与显存用量实现软件层面的虚拟 GPU 切片。适用于需要细粒度 GPU 共享的环境兼容所有 GPU 型号。2. Dynamic MIG硬件级 GPU 切片利用 NVIDIAMIGMulti-Instance GPU技术将物理 GPU 切分为多个隔离实例提供硬件级的性能保障。适用于性能敏感型负载要求 GPU 支持 MIG如 A100、H100。GPU 共享模式是节点级配置。Volcano 支持异构集群——即一部分节点使用 HAMI-core另一部分节点使用 Dynamic MIG。节点模式的声明与 MIG geometry 配置由外部组件volcano-vgpu-device-pluginProject-HAMi 生态项目负责本文聚焦 Volcano 调度器侧的实现。从源码结构看调度器通过注册表机制为不同模式装配不同的“共享处理器”sharing_factory.go 定义了SharingFactory接口TryAddPod/AddPod/SubPod各模式通过init()中的RegisterFactory(mode, factory)注册模式常量hami-core、mig、mps定义在 type.go 中。安装与部署通用前提条件启用 vGPU 调度需满足以下环境前提以官方文档为准NVIDIA 驱动 440nvidia-docker 2.0Docker 配置nvidia为默认 runtimeKubernetes 1.16Volcano 1.9部署步骤按照 Volcano 安装指南部署 Volcano 各组件部署volcano-vgpu-device-pluginDevice Plugin——该组件的 YAML 同时包含Node GPU 模式与MIG geometry的配置项配置细节见该项目的 config 文档校验节点可分配资源kubectl get node {node-name} -o yaml节点 Allocatable 中应出现如下 vGPU 资源volcano.sh/vgpu-memory: 89424 volcano.sh/vgpu-number: 8源码佐证调度器侧 device_info.go 的NewGPUDevices正是依赖这两个信号识别节点——它首先检查节点注解volcano.sh/node-vgpu-register设备信息注册数据然后要求volcano.sh/vgpu-number、volcano.sh/vgpu-cores、volcano.sh/vgpu-memory三类可分配资源均存在且非零任一缺失则该节点不注册 vGPU 设备。资源名常量集中定义在 config/vgpu.go。更新调度器配置编辑volcano-scheduler-configmap启用deviceshare插件的 vGPU 能力kind: ConfigMap apiVersion: v1 metadata: name: volcano-scheduler-configmap namespace: volcano-system data: volcano-scheduler.conf: | actions: enqueue, allocate, backfill tiers: - plugins: - name: predicates - name: deviceshare arguments: deviceshare.VGPUEnable: true # 启用 vgpu 插件 deviceshare.SchedulePolicy: binpack # 调度策略binpack / spreaddeviceshare插件支持的全部 arguments 在 deviceshare.go 中定义整理如下参数类型说明deviceshare.VGPUEnablebool启用 vGPUHAMi vGPU调度本文主题参数deviceshare.SchedulePolicystring设备级调度策略binpack或spreaddeviceshare.ScheduleWeightint设备打分在节点排序中的权重0 时生效deviceshare.GPUExclusiveRules[]labelsGPU 独占规则见后文“GPU 独占”一节deviceshare.KnownGeometriesCMNamestringMIG geometry ConfigMap 名默认volcano-vgpu-device-configdeviceshare.KnownGeometriesCMNamespacestring该 ConfigMap 所在命名空间默认kube-systemdeviceshare.GPUSharingEnable/deviceshare.GPUNumberEnable/deviceshare.NodeLockEnablebool与旧版 GPU 共享、GPU 整卡模式或节点锁相关的开关源码中的关键校验逻辑deviceshare.go 的enablePredicate若同时启用GPUSharingEnable与GPUNumberEnable调度器直接klog.Fatal——两者互斥若GPUSharingEnable/GPUNumberEnable与VGPUEnable同时为 true调度器同样直接退出gpushare旧版整卡共享与 vgpu 不能混用升级 vGPU 方案前务必清理旧配置VGPUEnable为 true 时注册设备名为hamivgpu的设备type.go 中DeviceName hamivgpuMIG geometry 默认从kube-system命名空间的volcano-vgpu-device-configConfigMap 读取该 ConfigMap 由 volcano-vgpu-device-plugin 生成初始值可自定义。HAMI-core 模式使用在 Pod 中通过注解显式声明 HAMI-core 模式并在resources.limits中申请 vGPU 资源metadata: name: hami-pod annotations: volcano.sh/vgpu-mode: hami-core spec: schedulerName: volcano containers: - name: cuda-container image: nvidia/cuda:9.0-devel resources: limits: volcano.sh/vgpu-number: 1 # 申请 1 张虚拟GPU 卡 volcano.sh/vgpu-cores: 50 # 可选每块 vGPU 使用 50% 算力 volcano.sh/vgpu-memory: 3000 # 可选每块 vGPU 使用 3GB 显存vGPU 资源项语义常量见 config/vgpu.go资源名含义说明volcano.sh/vgpu-number虚拟 GPU 卡数量必选volcano.sh/vgpu-memory每张 vGPU 的显存上限MB可选不指定时按设备插件配置中的defaultMemory处理volcano.sh/vgpu-cores每张 vGPU 的算力百分比0–100可选volcano.sh/vgpu-memory-percentage显存百分比形式源码中另支持的百分比写法分配成功后调度器会向 Pod 注入一组绑定注解device_info.go 的Allocatevolcano.sh/vgpu-ids-new实际分配的设备 UUID 列表、volcano.sh/vgpu-node、volcano.sh/vgpu-time、volcano.sh/devices-to-allocate、volcano.sh/bind-phase等。这些注解随 Binding 请求由 apiserver 与节点分配原子合并供设备插件在 bind 阶段完成容器级注入回滚路径UnAllocate时Release会清理这些注解但若bind-phase已为success则交给设备插件接管调度器不再重复清理。Dynamic MIG 模式使用启用 MIG在 GPU 节点上执行sudo nvidia-smi -mig 1Geometry 配置可选volcano-vgpu-device-plugin会自动生成初始 MIG 配置写入kube-system命名空间的volcano-vgpu-device-configConfigMap可按需修改。该 ConfigMap 中的数据结构在调度器侧对应 config/vgpu.goAllowedMigGeometries按 GPU 型号列出allowedGeometries、Geometry一个分组内的geometries实例列表、MigTemplate如1g.10gb及其显存与数量。Pod 示例metadata: name: mig-pod annotations: volcano.sh/vgpu-mode: mig spec: schedulerName: volcano containers: - name: cuda-container image: nvidia/cuda:9.0-devel resources: limits: volcano.sh/vgpu-number: 1 volcano.sh/vgpu-memory: 3000注意实际分配的显存取决于 best-fit 命中的 MIG 切片规格例如申请 3GB 可能命中 5GB 的切片。源码佐证MIG 模式由 mig.go 中的MIGFactory实现。TryAddPod先按GPUMemoryFactor放大请求显存默认 1 时不放大再调用findMatch在该卡的MigTemplate/MigUsage中做 best-fit 匹配命中后按切片实际显存更新UsedNum/UsedMem。这与文档“3GB 请求 → 5GB 切片”的行为完全对应。进阶调度策略PodGroup 设备打散Spread为防止同一 PodGroup 内的两个 Pod 挤在同一块 vGPU 上可为 Pod 添加注解volcano.sh/vgpu-podgroup-policy: spread未加注解的 Pod 仍走默认 binpack 行为。metadata: name: spread-pod annotations: volcano.sh/vgpu-podgroup-policy: spread注解常量定义在 type.go判断逻辑在 utils.go当注解值等于spread时启用组内打散集成测试见 spread_integration_test.go。按 UUID 选择物理 GPUvolcano.sh/vgpu-use-gpuuuid物理 GPU UUID 的白名单逗号分隔volcano.sh/vgpu-nouse-gpuuuid黑名单。metadata: annotations: volcano.sh/vgpu-use-gpuuuid: GPU-03f69c50-207a-2038-9b45-23cac89cb67dmetadata: annotations: volcano.sh/vgpu-nouse-gpuuuid: GPU-03f69c50-207a-2038-9b45-23cac89cb67d匹配语义utils.go 的parseGPUUUIDListUUID 去除首尾空白后精确匹配若白名单中没有任何设备能满足请求Pod 将保持不可调度同一 UUID 同时出现在两个注解中时黑名单优先。边界行为空串、连续逗号、非法 UUID 报错等由 utils_test.go 的单测覆盖。GPU 独占仅 HAMI-core 节点GPU 独占保证匹配配置标签规则的 Pod 获得独占的物理 GPU——其他匹配规则的 Pod 不能与其共享同一块卡不匹配规则的 Pod 仍可正常共享 GPU。该特性仅作用于 hami-core 节点Dynamic MIG 节点本身已有硬件隔离源码会直接跳过gpuexclusive.go 中仅当Mode为空或hami-core时才包装。它与spread调度策略正交可以叠加使用spread是跨节点的负载均衡把 Pod 分散到不同节点而 GPU 独占是单节点内 GPU 设备粒度的互斥。若某节点所有 GPU 均被其他规则匹配 Pod 预留该 Pod 会在此节点FilterNode 失败并保持 Pending直到出现有空闲独占 GPU 的节点。配置方式——在 deviceshare 插件参数中加入deviceshare.GPUExclusiveRules- name: deviceshare arguments: deviceshare.VGPUEnable: true deviceshare.GPUExclusiveRules: - workloadType: training - workloadType: batch priority: high每条规则是一组 label 键值对Pod 必须同时匹配规则内全部标签才获得独占权独占性只在同一条规则内部强制——匹配不同规则的 Pod 之间仍可共享 GPU。Pod 示例metadata: name: training-job labels: workloadType: training spec: schedulerName: volcano containers: - name: trainer image: nvidia/cuda:12.0-base resources: limits: volcano.sh/vgpu-number: 4 volcano.sh/vgpu-memory: 16384源码机制gpuexclusive.goloadGPUExclusiveConfigparseExclusiveRules将 YAML 规则解析为exclusiveRule{labels}切片matchingRules按“全标签匹配”返回命中的规则下标每个调度会话开始时wrapGPUDevicesForExclusivity把各节点的*vgpu.GPUDevices包装为exclusiveGPUDevices并从三个来源重建“规则 → 已占 GPU”映射设备 PodMap、Pod 的分配注解、上一调度周期的持久化状态persistedGPUs/persistedPodRules跨会话保存保证独占状态不因调度轮次结束丢失核心手法是capGPUs临时将被规则预留的 GPU 的Number置为UsedNum即“剩余虚拟卡数为 0”使底层 vGPU 分配器自然跳过这些卡调用结束后再由restoreGPUs还原——FilterNode与Allocate两个阶段均采用该机制从而在不改动底层分配器的前提下实现设备级互斥。调度器模式选择与调用链显式模式与自动模式显式模式通过注解volcano.sh/vgpu-mode取值hami-core/mig强制指定模式自动模式注解缺省时调度器基于资源适配度与策略自动选择模式调度策略binpack倾向“剩余显存越少越好”聚合碎片spread倾向“空闲卡优先于共享卡”两者均影响节点/设备打分策略常量与语义见 type.go。调度器侧调用链从 deviceshare.go 的OnSessionOpen可以还原完整调用链wrapGPUDevicesForExclusivity若配置了独占规则先对节点设备做独占包装必须早于后续注册保证整轮调度使用包装后的设备注册PredicateFn对每个请求了 vGPU 的 Task 调用dev.FilterNode(task.Pod, schedulePolicy)内部即 device_info.go 的checkNodeGPUSharingPredicateAndScore不满足设备容量/模式/UUID 约束的节点直接淘汰注册NodeOrderFn当deviceshare.ScheduleWeight 0时用 Filter 阶段缓存的设备打分ScoreNode直接返回缓存值以避免重复计算参与节点排序Allocate阶段再次执行设备校验并写分配注解随 Binding 下发。模式对比与监控模式对比总表模式隔离级别是否要求 MIG GPU是否需要注解核心/显存控制推荐场景HAMI-core软件VCUDA否否可选是通用负载Dynamic MIG硬件是是由 MIG 切片决定性能敏感型作业监控调度器指标curl http://volcano-scheduler-ip:8080/metrics设备插件指标curl http://plugin-pod-ip:9394/metrics指标涵盖 GPU 利用率、Pod 显存用量与上限等调度器侧的指标埋点在 metrics.go 中随AddPod/SubPod逐卡更新。延伸阅读插件实现入口deviceshare.go、GPU 独占gpuexclusive.govGPU 设备模型device_info.go、资源与注解常量type.go、MIG 分配逻辑mig.goMIG geometry 配置结构config/vgpu.go相关测试deviceshare_test.go、gpuexclusive_test.go、spread_integration_test.go、mig_test.go设备插件侧节点模式与 MIG geometry 配置请参考volcano-vgpu-device-plugin项目的安装与配置文档【免费下载链接】volcanoA Cloud Native Batch System (Project under CNCF)项目地址: https://gitcode.com/GitHub_Trending/vol/volcano创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表