HAMi,原名“k8s-vGPU-scheduler”,是管理Kubernetes中异构设备的中间件。它可以管理不同类型的异构设备(如GPU、NPU等),在Pod之间共享异构设备,根据设备的拓扑信息和调度策略做出更好的调度决策。
它旨在消除不同异构设备之间的差距,为用户提供一个统一的管理接口,且无需更改应用程序。截至 2024年6月,HAMi已广泛应用于全球互联网/云/金融/制造等多个行业,被超过40多家公司或机构采纳。他们中的许多不仅是最终用户,也是项目积极的贡献者。
HAMi 是Cloud Native Computing Foundation(CNCF)基金会的sandbox项目和landscape项目,并且是 CNAI Landscape project.
HAMi通过支持设备共享和设备资源隔离,为包括GPU在内的多个异构设备提供设备虚拟化。有关支持设备虚拟化的设备列表,请参阅 [支持的设备](#支持设备)
- 允许通过指定显存来申请算力设备
- 算力资源的硬隔离
- 允许通过指定算力使用比例来申请算力设备
- 对已有程序零改动
HAMi支持设备资源的硬隔离 一个以NVIDIA GPU为例硬隔离的简单展示: 一个使用以下方式定义的任务提交后
resources:
limits:
nvidia.com/gpu: 1 # requesting 1 vGPU
nvidia.com/gpumem: 3000 # Each vGPU contains 3000m device memory
会只有3G可见显存
HAMi 包含以下几个组件,一个统一的mutatingwebhook,一个统一的调度器,以及针对各种不同的异构算力设备对应的设备插件和容器内的控制组件,整体的架构特性如上图所示。
- NVIDIA drivers >= 440
- nvidia-docker version > 2.0
- docker/containerd/cri-o已配置nvidia作为默认runtime
- Kubernetes version >= 1.16
- glibc >= 2.17 & glibc < 2.3.0
- kernel version >= 3.10
- helm > 3.0
首先使用helm添加我们的 repo
helm repo add hami-charts https://project-hami.github.io/HAMi/
随后,你需要将所有要使用到的GPU节点打上gpu=on标签,否则该节点不会被调度到
kubectl label nodes {nodeid} gpu=on
使用如下指令进行安装
helm install hami hami-charts/hami -n kube-system
你可以修改这里的配置来定制安装
通过kubectl get pods指令看到 vgpu-device-plugin
与 vgpu-scheduler
两个pod 状态为Running 即为安装成功
kubectl get pods -n kube-system
HAMi在2.4.0版本后支持了HAMi-WebUI
有关具体的部署方式,点击这里获取
任务样例
NVIDIA vGPUs 现在能透过资源类型nvidia.com/gpu
被容器请求:
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
containers:
- name: ubuntu-container
image: ubuntu:18.04
command: ["bash", "-c", "sleep 86400"]
resources:
limits:
nvidia.com/gpu: 2 # 请求2个vGPUs
nvidia.com/gpumem: 3000 # 每个vGPU申请3000m显存 (可选,整数类型)
nvidia.com/gpucores: 30 # 每个vGPU的算力为30%实际显卡的算力 (可选,整数类型)
如果你的任务无法运行在任何一个节点上(例如任务的nvidia.com/gpu
大于集群中任意一个GPU节点的实际GPU数量),那么任务会卡在pending
状态
现在你可以在容器执行nvidia-smi
命令,然后比较vGPU和实际GPU显存大小的不同。
注意: 1. 如果你使用privileged字段的话,本任务将不会被调度,因为它可见所有的GPU,会对其它任务造成影响.
2. 不要设置nodeName字段,类似需求请使用nodeSelector.
点击 范例
访问集群算力视图
调度器部署成功后,监控默认自动开启,你可以通过
http://{nodeip}:{monitorPort}/metrics
来获取监控数据,其中monitorPort可以在Values中进行配置,默认为31992
grafana dashboard 示例
注意 节点上的vGPU状态只有在其使用vGPU后才会被统计
- 目前仅支持计算任务,不支持视频编解码处理。
- 暂时仅支持MIG的"none"和"mixed"模式,暂时不支持single模式
- 当任务有字段“nodeName“时会出现无法调度的情况,有类似需求的请使用"nodeSelector"代替
- 我们修改了
device-plugin
组件的环境变量,从NodeName
改为NODE_NAME
, 如果使用的是镜像版本是v2.3.9
, 则可能会出现device-plugin
无法启动的情况,目前有两种修复建议:- 手动执行
kubectl edit daemonset
修改device-plugin
的环境变量从NodeName
改为NODE_NAME
。 - 使用helm升级到最新版本,最新版
device-plugin
的镜像版本是v2.3.10
,执行helm upgrade hami hami/hami -n kube-system
, 会自动修复。
- 手动执行
该项目由一组 [Maintainers and Committers](https://github.com/Project-HAMi/HAMi/blob/master/AUTHORS) 管理。我们的 [治理文件](https://github.com/Project-HAMi/community/blob/main/governance.md) 中概述了如何选择和管理它们。
如果你想成为 HAMi 的贡献者,请参考贡献者指南,里面有详细的贡献流程。
请参阅 [RoadMap](docs/develop/roadmap.md) 查看您感兴趣的任何内容。
HAMi 社区致力于营造一个开放和友好的环境,并通过多种方式与其他用户和开发人员互动。
如果您有任何问题,请随时通过以下渠道与我们联系:
- 定期社区会议:周五 16:00 UTC+8(中文)(每周). 转换为您的时区。
- 电子邮件:请参阅MAINTAINERS.md以查找所有维护者的电子邮件地址。请随时通过电子邮件与他们联系以报告任何问题或提出问题。
- 邮件列表
- slack | Join
Link | |
---|---|
中国云计算基础架构开发者大会 (Beijing 2024) | 在 Kubernetes 集群式解锁异构 AI 基础设施 Starting from 03:06:15 |
KubeDay(Japan 2024) | Unlocking Heterogeneous AI Infrastructure K8s Cluster:Leveraging the Power of HAMi |
KubeCon & AI_dev Open Source GenAI & ML Summit(China 2024) | Is Your GPU Really Working Efficiently in the Data Center?N Ways to Improve GPU Usage |
KubeCon & AI_dev Open Source GenAI & ML Summit(China 2024) | Unlocking Heterogeneous AI Infrastructure K8s Cluster |
KubeCon(EU 2024) | Cloud Native Batch Computing with Volcano: Updates and Future |
HAMi is under the Apache 2.0 license. See the LICENSE file for details.