HAMi 异构AI计算虚拟化实操指南:K8s环境GPU/NPU统一调度与vGPU共享
【免费下载链接】HAMiHeterogeneous GPU Sharing on Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ha/HAMi
K8s集群AI任务调度绕不开的"整卡独占"问题
集群里同时跑着NVIDIA A100和昇腾910B,下一个训练任务该派给谁?一个只占10GB显存的小任务把32GB整卡占住,另一半资源又归谁?原生调度器对这两个问题都答不上来。HAMi(Heterogeneous AI Computing Virtualization Middleware)就是为此设计的异构AI计算虚拟化中间件:它能把一张物理卡按显存、算力比例切分,并对不同厂商的加速卡做统一调度。
定位:单卡切分、多厂商调度、不改应用代码
HAMi是运行在Kubernetes上的开源虚拟化中间件,也是CNCF Incubating项目,核心解决四件事:设备共享、资源隔离、设备感知调度、多厂商硬件统一管理。目前覆盖NVIDIA GPU、Ascend NPU、寒武纪MLU、海光DCU、天数智芯GPU等硬件。
跟一个Pod的生命周期看HAMi怎么分配vGPU
在Pod里写下nvidia.com/gpumem: 3000(申请3GB卡显存)后提交,流程如下:Mutating Webhook先拦截请求,规范资源描述,并在此后拒绝任何人篡改调度器写下的分配结果;HAMi Scheduler(基于kube-scheduler插件机制,也兼容Volcano)用binpack、spread等策略对候选节点打分,决定任务落到哪张卡,把分配结果写进Pod的Annotations;节点上的Device Plugin读取Annotations,在容器Allocate阶段注入环境变量与挂载;容器内再由对应硬件的虚拟化组件接管——NVIDIA用HAMi CORE、寒武纪用smlu-containerd、华为用Ascend runtime——屏蔽真实设备,应用只看到分到的3GB显存和算力份额,代码零改动。调度决策核心在 pkg/scheduler/,节点侧插件逻辑在 pkg/device-plugin/。
细粒度共享:把两个任务塞进两张卡,省出另外两张
这是最直接的价值。以4张V100(32G)的节点为例:用户A要2张卡各10GB显存,用户B要2张卡各20GB。没有HAMi时,两个任务各占整卡,4张GPU全部被占用,卡利用率约50%;启用HAMi后,调度器把两个工作负载打包到同样2张卡上,另外2张卡完整可用,利用率从50%提升到100%,且两个负载之间仍有独立的显存与算力配额互不抢占。可以把它理解成"按GB租卡"而不是"整张买卡"。
实时监控:一眼看出哪个容器在吃GPU
共享之后新问题出现:谁在用哪块vGPU、用了多少?HAMi的monitor组件按容器粒度实时采集显存与核利用率,上报Prometheus,Grafana仪表盘上能看到卡温、功耗、整体利用率以及每个容器的占用明细。发现某节点利用率异常时,几十秒内就能定位是哪个训练任务占满了整卡,不用再登机器逐张查nvidia-smi。
此外还支持NVIDIA卡专属的动态MIG切分和拓扑感知调度,配置项即可开启。
4步部署HAMi到K8s集群
前置条件:K8s ≥ 1.23,NVIDIA驱动 ≥ 440,containerd已配置nvidia为默认运行时,已安装Helm > 3.0。
- 给GPU节点打标签:
kubectl label nodes <node-name> gpu=on- 获取Chart并部署调度器与设备插件:
git clone https://gitcode.com/GitHub_Trending/ha/HAMi helm dependency update HAMi/charts/hami helm install hami HAMi/charts/hami -n kube-system【免费下载链接】HAMiHeterogeneous GPU Sharing on Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ha/HAMi
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考