Skip to content

Latest commit

 

History

History
209 lines (141 loc) · 9.52 KB

README_cn.md

File metadata and controls

209 lines (141 loc) · 9.52 KB

LICENSE build status Releases OpenSSF Best Practices Go Report Card codecov FOSSA Status docker pulls slack discuss website Contact Me

Project-HAMi;异构算力虚拟化中间件

支持设备:

英伟达 GPU 寒武纪 MLU 海光 DCU 天数智芯 GPU 摩尔线程 GPU 华为昇腾 NPU

简介

HAMi,原名“k8s-vGPU-scheduler”,是管理Kubernetes中异构设备的中间件。它可以管理不同类型的异构设备(如GPU、NPU等),在Pod之间共享异构设备,根据设备的拓扑信息和调度策略做出更好的调度决策。

它旨在消除不同异构设备之间的差距,为用户提供一个统一的管理接口,且无需更改应用程序。截至 2024年6月,HAMi已广泛应用于全球互联网/云/金融/制造等多个行业,被超过40多家公司或机构采纳。他们中的许多不仅是最终用户,也是项目积极的贡献者。

cncf_logo

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可见显存

img

项目架构图

HAMi 包含以下几个组件,一个统一的mutatingwebhook,一个统一的调度器,以及针对各种不同的异构算力设备对应的设备插件和容器内的控制组件,整体的架构特性如上图所示。

快速入门

选择你的集群调度器

kube-scheduler volcano-scheduler

安装要求

  • 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

使用下列指令获取集群服务端版本

kubectl version

在安装过程中须根据集群服务端版本(上一条指令的结果)指定调度器镜像版本,例如集群服务端版本为1.16.8,则可以使用如下指令进行安装

helm install hami hami-charts/hami --set scheduler.kubeScheduler.imageTag=v1.16.8 -n kube-system

你可以修改这里的配置来定制安装

通过kubectl get pods指令看到 vgpu-device-pluginvgpu-scheduler 两个pod 状态为Running 即为安装成功

kubectl get pods -n kube-system

提交任务

任务样例

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 社区致力于营造一个开放和友好的环境,并通过多种方式与其他用户和开发人员互动。

如果您有任何问题,请随时通过以下渠道与我们联系: