HAMi Kubernetes GPU 共享调度完整指南:从零部署到快速上手
【免费下载链接】HAMiHeterogeneous GPU Sharing on Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ha/HAMi
HAMi 是面向 Kubernetes 的 GPU 共享与异构设备调度组件,让一块物理 GPU 按显存和算力百分比切分给多个 Pod,应用代码无需任何修改。跟着本教程完成环境核对、节点容器运行时配置、Helm 一键安装与验证,最后掌握升级与回滚操作。
它是什么、值不值得装
HAMi(Heterogeneous AI Computing Virtualization Middleware)是一个 CNCF 孵化项目,主仓库 charts/hami/ 提供标准 Helm Chart,调度器、Webhook 与 device plugin 均由 Go 语言实现。它解决的典型问题是:小任务独占整卡导致 GPU 闲置、多团队争抢同一块卡、不同厂商设备各用一套调度逻辑。
它的工作链路是:Mutating Webhook 拦截带 GPU 请求的 Pod,调度器扩展程序完成设备感知的 filter 与 score,device plugin 把设备以nvidia.com/gpu、nvidia.com/gpumem等扩展资源注册给 kubelet,容器内的 HAMi-core 组件再在 CUDA 层真正执行显存与算力上限。
适合它的场景:共享推理集群、多租户 Notebook/训练平台、需要按卡型或 UUID 定向调度的混合卡池。如果你只是独占整卡跑训练,原生 device plugin 已够用;HAMi 的价值在"切片、限额、定向调度"。
动手前:环境核对清单
逐项打勾后再动手,缺一项都会让 device plugin 起不来或 Pod 拉不起。
| 组件 | 最低版本 | 说明 |
|---|---|---|
| NVIDIA 驱动 | 440 | 每个 GPU 节点都要装好 |
| NVIDIA Container Toolkit | 1.x | 提供容器内的 nvidia 运行时 |
| Kubernetes | 1.18 | Chart 要求的 kubeVersion 下限 |
| Helm | 3.0 | 安装入口 |
| glibc | 2.17 | HAMi-core 运行库依赖 |
| Linux 内核 | 3.10 | 节点内核下限 |
节点环境配置
目标只有一个:让容器运行时能注入 NVIDIA 驱动。改错位置,Pod 里就会报找不到libcuda。
Docker 节点:用 nvidia-ctk 重写运行时配置
- 改什么:
/etc/docker/daemon.json,把默认运行时指向 nvidia。 - 为什么:HAMi 只负责"分卡",驱动注入仍依赖容器运行时。
- 操作:
nvidia-ctk runtime configure --runtime docker sudo systemctl restart docker- 如何确认:
docker info | grep -i runtime输出中出现nvidia运行时即生效。
containerd 节点:改 config.toml 后重启
- 改什么:
/etc/containerd/config.toml的[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]段。 - 为什么:kubelet 走 CRI 创建容器,nvidia 运行时必须在这里注册。
- 操作:
nvidia-ctk runtime configure --runtime containerd sudo systemctl restart containerd- 如何确认:
containerd config dump | grep -A5 nvidia看到nvidiaruntime 配置段即通过。两种运行时二选一,按你集群实际使用的那个配置即可。
安装与验证
节点就绪后,按编号步骤执行,每步都有对应的成功标志。
1. 给 GPU 节点打标
Chart 中 device plugin 的nvidiaNodeSelector默认是gpu=on,没打标的节点不会跑 vGPU 组件。
kubectl label nodes <节点名> gpu=on预期输出:node/<节点名> labeled。🔖
2. 添加 HAMi Helm 仓库
helm repo add hami-charts https://project-hami.github.io/HAMi/ helm repo update预期输出:"hami-charts" has been added to your repositories。
3. Helm 一键安装
helm install hami hami-charts/hami -n kube-system旧版本集群可加--set scheduler.kubeScheduler.imageTag=v1.16.8让 kube-scheduler 镜像与集群版本对齐。预期输出:NAME: hami、STATUS: deployed。
4. 验证组件状态
kubectl get pods -n kube-system看到hami-scheduler-*与hami-device-plugin-*均为Running才算通过。🔖
5. 验证 GPU 资源上报
kubectl describe node <节点名> | grep -A1 "nvidia.com"nvidia.com/gpu应显示为"物理卡数 × 切分数"(默认 10),例如 4 卡节点显示 40。
6. 提交切片 Pod 做端到端验证
仓库自带示例 examples/nvidia/default_use.yaml,申请 1 块物理 GPU、3000Mi 显存:
kubectl apply -f examples/nvidia/default_use.yamlPod 状态变为Running,且kubectl describe pod gpu-pod的 limits 里同时出现nvidia.com/gpu与nvidia.com/gpumem: 3000,即完成安装闭环。之后可通过节点端口31993的/metrics或 WebUI 面板观察各容器显存占用:
升级、回滚与卸载
- 升级:
helm upgrade hami hami-charts/hami -n kube-system(先执行helm repo update) - 回滚:
helm rollback hami <上一版本号> -n kube-system - 卸载:
helm uninstall hami -n kube-system
注意:卸载只清理集群内资源,节点上的daemon.json、config.toml改动和节点标签不会回退,需要自行保留或恢复。
更多行为细节可以看仓库内的 charts/hami/values.yaml 逐项注释(如deviceSplitCount、migStrategy、scheduler.defaultSchedulerPolicy),MIG 动态生命周期说明在 docs/develop/dynamic-mig-lifecycle.md,完整配置项参考 charts/hami/README.md。装好之后,建议先在一台节点上用切片 Pod 压一轮显存上限,再扩到整个 GPU 池。
【免费下载链接】HAMiHeterogeneous GPU Sharing on Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ha/HAMi
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考