Project-HAMi 深度阅读笔记

对 GitHub 仓库 README、中文文档、设计文档、协议、配置、调度策略、动态 MIG、ResourceQuota、benchmark 与核心代码结构进行综合阅读后整理。

来源:Project-HAMi/HAMi 许可证:Apache-2.0 最新 release:v2.8.2 阅读日期:2026-05-08

一页结论

HAMi 是面向 Kubernetes 的异构 AI 计算虚拟化中间件。它的价值不是“让一个 Pod 看见一张 GPU”这么简单,而是把 GPU、NPU、MLU、DCU 等异构加速器抽象成统一的可调度资源,并在 Pod 之间实现共享、隔离、拓扑感知和策略化调度。

如果用一句工程化语言概括:HAMi 在 Kubernetes 调度链路中插入了准入变更、调度扩展器、定制 device plugin 和容器内控制层,使用户仍然通过原生 Pod 资源声明表达需求,而平台可以在后台完成设备选择、份额切分、显存/算力限制和节点注解协议同步。

3,407GitHub Stars,API 读取于 2026-05-08
548Forks,说明生态关注度较高
v2.8.2GitHub latest release
50+README 称已有 50+ 企业/机构参与使用或贡献
我的判断:HAMi 更像“AI 基础设施层的 Kubernetes 设备虚拟化与调度控制面”,不是单一厂商设备插件。真正值得研究的是它如何用注解协议和调度扩展机制把异构设备统一进 K8s 工作流。

解决什么问题

不是什么

核心架构

HAMi 的架构可以按 Pod 生命周期理解:准入阶段识别资源,调度阶段选择节点与设备,绑定后由节点侧插件根据注解配置容器运行环境,最后由容器内控制机制执行显存/算力限制。

1. Mutating Webhook

检查 Pod 是否声明 HAMi 支持的设备资源;如果识别到资源请求,则设置调度器名称,并补齐或校验资源字段。

2. Scheduler Extender

对可共享设备实现 Filter 和 Score。Filter 找可用节点,Score 根据策略对节点和设备排序。

3. Device Plugin

节点侧周期上报设备信息到 Node 注解,并在调度结果确定后为容器生成环境变量、挂载和设备可见性。

4. In-container Control

不同设备使用不同容器内限额机制。例如 NVIDIA 侧由 HAMi-Core 负责硬限制,其他厂商有各自控制库或插件。

关键前提:设计文档明确提醒,大多数官方 device plugin 不能直接替代 HAMi 的定制插件,否则可能出现非预期行为。

资源声明模型

用户通常仍然用 Kubernetes Pod 的 resources.limits 声明资源。以 NVIDIA 为例,最常见的资源键包括:

资源键含义
nvidia.com/gpu请求多少个物理 GPU 份额。安装后节点上注册值默认表示 vGPU 数量。
nvidia.com/gpumem每个请求 GPU 对应的显存,单位 MB 或 MiB 语义在文档中按场景表述。
nvidia.com/gpumem-percentage按百分比申请显存。
nvidia.com/gpucores申请 GPU 核心算力比例,范围通常按 0-100 表达。
nvidia.com/priority任务优先级资源名,可通过配置覆盖。
resources:
  limits:
    nvidia.com/gpu: 1
    nvidia.com/gpumem: 3000
    nvidia.com/gpucores: 30

Pod 注解能力

资源键表达“要多少”,注解表达“怎么调度、能用哪些卡、不能用哪些卡、使用哪种 vGPU 模式”。

注解用途
nvidia.com/use-gpuuuid限制只能使用指定 GPU UUID。
nvidia.com/nouse-gpuuuid排除指定 GPU UUID。
nvidia.com/use-gputype限制可用 GPU 型号。
nvidia.com/nouse-gputype排除某些 GPU 型号。
hami.io/node-scheduler-policy覆盖节点层调度策略:binpackspread
hami.io/gpu-scheduler-policy设计文档中用于覆盖 GPU 层策略;正式文档提示 GPU 层主要通过全局配置。
nvidia.com/vgpu-mode指定 hami-coremig

调度逻辑:Filter 与 Score

HAMi 作为 scheduler extender 工作,核心接口是 Kubernetes 调度扩展器协议中的过滤和打分。过滤阶段判断节点是否有满足请求的设备组合;打分阶段对节点和卡进行排序。

默认策略

binpack 与 spread 的实际含义

层级binpackspread
Node尽量填满同一 GPU 节点。尽量分散到不同 GPU 节点。
GPU尽量把份额放到已使用的同一张卡,减少碎片。尽量把份额分散到不同卡,降低局部争用。
工程含义:binpack 适合节省资源、方便空出整节点/整卡;spread 适合提高单任务稳定性和降低局部热点。AI 平台不应固定一种策略,而应按任务类型切换。

节点注解协议

HAMi 用 Node 注解作为调度器和 device plugin 的协议层。device plugin 需要周期性上报设备规格,调度器据此构建全局设备视图。

这个协议的优点是实现简单、贴近 Kubernetes 对象模型;代价是注解内容必须保持一致,时间戳、健康状态和插件上报逻辑会直接影响调度正确性。

Pod 调度结果协议

调度器把最终设备分配结果写回 Pod 注解,节点侧 device plugin 再据此完成容器设备暴露。

这使调度决策成为 Kubernetes 对象的一部分,便于插件协作、监控和故障排查。

支持的设备生态

HAMi 的定位是异构 AI 设备池化,因此代码和文档都围绕多厂商设备扩展。仓库中可以看到 NVIDIA、Cambricon、Hygon、Iluvatar、Moore Threads、Ascend、MetaX、Enflame、Kunlun、VastAI、AWS Neuron、AMD 等设备包或示例。

设备/厂商文档或代码线索关注点
NVIDIA GPUpkg/device/nvidia、动态 MIG、HAMi-CorevGPU、显存/核心限制、MIG、拓扑打分。
Cambricon MLUpkg/device/cambricon国产 AI 加速器共享与调度。
Hygon DCUpkg/device/hygonDCU 资源声明与打分。
Iluvatar / Mthreads / MetaX各自支持文档与设备包多厂商 GPU 虚拟化资源模型。
Ascend NPUAscend 支持文档与独立 device plugin 链接NPU 资源接入与 Volcano 场景。
AWS Neuron / Kunlun / Enflame / VastAIexamples 与 pkg/device 下实现将云端或国产异构设备纳入统一调度面。

动态 MIG

动态 MIG 是 HAMi 2.5 之后的重要能力:用户无需提前在节点上创建 MIG 实例,HAMi 可以根据任务需求创建实例、切换 MIG 模板,并把 MIG 与 hami-core 统一到同一资源池。

已知风险:如果同一 GPU 节点混跑非 HAMi 的 NVIDIA 原生组件,可能因为设备被占用导致 MIG 切分失败。

多租户配额

虚拟设备数量本身不能准确代表真实显存消耗,因此 HAMi 支持通过 Kubernetes ResourceQuota 对 namespace 级 GPU 显存做限制。

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-resources
spec:
  hard:
    limits.nvidia.com/gpumem: 30000

这类能力适合平台团队限制团队/租户的显存总量,避免某个 namespace 因为大量小 vGPU 任务挤占整个集群。

安装与运维要点

事项笔记
节点标记GPU 节点需要标记 gpu=on,否则不会被 HAMi 管理。
安装方式官方推荐 Helm:添加 https://project-hami.github.io/HAMi/ chart repo 后安装到 kube-system
NVIDIA 前置条件文档列出驱动、nvidia-docker、默认 runtime、Kubernetes 版本、glibc、内核和 Helm 要求。
配置入口全局设备配置主要在 hami-scheduler-device ConfigMap;节点级插件行为在 hami-device-plugin ConfigMap。
Webhook 过滤支持 namespaceSelector 和 objectSelector;默认排除带 hami.io/webhook: ignore 标签的命名空间/Pod。
TLS可使用 Helm job 生成自签证书,或启用 cert-manager。
监控安装后自动启用 metrics,默认监控端口文档中给出为 31993,并提供 Grafana dashboard 示例。

Benchmark 解读

仓库 benchmark 文档使用 vLLM 对 Qwen3-8B 推理场景做对比,环境为 A100-SXM4-40GB 双卡。文档中的关键指标显示,新版本 HAMi 相比旧版本更接近原生 NVIDIA device plugin。

指标Nativev2.8.0v2.9.0
TTFT p500.0621s0.0670s0.0629s
TTFT p950.0642s0.0713s0.0650s
每 token 延迟均值0.0285s0.0310s0.0291s

这个 benchmark 的重点不是证明“虚拟化零损耗”,而是说明 HAMi 的共享/隔离机制可以在典型推理负载中做到接近原生的延迟表现。

代码结构速记

优点、代价与适用场景

维度观察
优点统一异构设备入口;减少整卡浪费;支持按显存/核心共享;可以策略化处理碎片;与 Kubernetes 原生 Pod、ResourceQuota、Webhook、Scheduler Extender 协同。
工程代价部署链路更复杂;依赖定制 device plugin;不同厂商隔离能力不完全一致;节点注解协议和插件健康上报成为关键可靠性点。
适合AI 平台、多租户推理、开发/实验集群、资源利用率优化、国产异构设备混合集群。
谨慎使用强隔离安全场景、极致稳定延迟任务、大规模分布式训练、已有复杂 NVIDIA 原生 MIG/DCGM 体系的集群。
采用建议:先从推理、开发和小模型训练队列试点;为任务类型定义默认 node/gpu 策略;对生产租户启用显存 ResourceQuota;把 metrics、事件和调度注解纳入可观测体系。

我会继续追的点

  1. 各设备实现之间的隔离语义是否一致,尤其是“核心限制”和“显存限制”的硬度。
  2. 动态 MIG 在繁忙节点上的切换代价、失败恢复和与外部 NVIDIA 组件的兼容性。
  3. Scheduler extender 在大规模集群中的缓存一致性、leader election、节点锁和事件可观测性。
  4. ResourceQuota 对多容器、多设备、多 namespace 场景的边界行为。
  5. 和 Volcano、Kubeflow、KServe、Ray、vLLM 平台化栈的集成实践。

快速阅读路线

来源与版本信息

原始仓库:https://github.com/Project-HAMi/HAMi

本次阅读的浅克隆提交:b830c49843059652eccbe4979ed88902de6289df,提交时间 2026-05-08T02:02:05+00:00

GitHub API 元数据读取时间:2026-05-08;latest release 为 v2.8.2,仓库内 VERSION 文件和 Helm chart 文档中仍可见 v2.8.0 相关默认值,实际部署前应以 release notes 和 chart 版本为准。

Kubernetes GPU virtualization Scheduler extender Device plugin MIG ResourceQuota CNCF Sandbox