开源 vGPU 方案 HAMi 解析

开源 vGPU 方案 HAMi

一、k8s 环境下 GPU 资源管理的现状与问题

(一)资源感知与绑定

在 k8s 中,资源与节点紧密绑定。对于 GPU 资源,我们依赖 NVIDIA 提供的 device-plugin 来进行感知,并将其上报到 kube-apiserver。例如,通过执行 kubectl describe node gpu01|grep Capacity -A 7 命令,我们可以看到节点上的资源信息,其中包括 nvidia.com/gpu: 8,这表明该节点上有 8 个 GPU。这一机制使得 k8s 能够对 GPU 资源有一定的了解,但也带来了后续的调度问题。

(二)资源申请与调度限制

当我们创建一个 Pod 并申请 GPU 资源时,如以下示例:

apiVersion: v1
kind: Pod
metadata:name: gpu-pod
spec:containers:- name: gpu-containerimage: nvidia/cuda:11.0-baseresources:limits:nvidia.com/gpu: 1command: ["nvidia-smi"]restartPolicy: OnFailure

kube-scheduler 会根据 Pod 的资源请求将其调度到拥有足够 GPU 资源的 Node 上。但这里存在一个关键问题,一旦 GPU 资源被某个 Pod 申请,在 k8s 中就被标记为已消耗,后续创建的 Pod 可能会因为资源不足而无法调度。实际上,GPU 的性能可能足以支持多个 Pod 共同使用,但 k8s 的这种调度限制导致了资源利用率不高的情况。

二、HAMi 方案的引入:GPU 资源管理的新希望

(一)什么是 HAMi

HAMi 全称为 Heterogeneous AI Computing Virtualization Middleware,是一个异构算力虚拟化平台。它最初源自第四范式的 k8s-vgpu-scheduler,如今不仅开源,还将核心的 vCUDA 库 libvgpu.so 开放出来。当前,HAMi 在 NVIDIA GPU 的 vGPU 方案方面表现出色,为我们提供了一种有效的 GPU 资源共享和切分解决方案。

(二)HAMi 的特性:细粒度 GPU 隔离

HAMi 的一大亮点是能够实现 GPU 的细粒度隔离,可对 core 和 memory 使用 1% 级别的隔离。例如,在创建 Pod 时,我们可以通过以下方式指定 vGPU 的资源请求:

apiVersion: v1
kind: Pod
metadata:name: gpu-pod
spec:containers:- name: ubuntu-containerimage: ubuntu:18.04command: ["bash", "-c", "sleep 86400"]resources:limits:nvidia.com/gpu: 1nvidia.com/gpumem: 3000nvidia.com/gpucores: 30

在这个示例中,nvidia.com/gpu: 1 表示请求 1 个 vGPU,nvidia.com/gpumem: 3000 表示每个 vGPU 申请 3000m 显存,nvidia.com/gpucores: 30 表示每个 vGPU 的算力为 30% 实际显卡的算力。这种细粒度的资源控制能力,使得我们能够更精准地分配 GPU 资源,满足不同任务的需求。

三、HAMi 的工作原理:基于 vCUDA 方案的创新

(一)软件层面的驱动重写

HAMi 通过软件层面的 vCUDA 方案,对 NVIDIA 原生的 CUDA 驱动进行重写(libvgpu.so)。它将改写后的驱动挂载到 Pod 中进行替换,从而在自己实现的 CUDA 驱动中对 API 进行拦截。这一拦截机制是实现资源隔离和限制的关键。例如,原生的 libvgpu.so 在进行内存分配时,只有在 GPU 内存真正用完时才会提示 CUDA OOM,而 HAMi 实现的 libvgpu.so 则不同,当检测到 Pod 中使用的内存超过了 Resource 中的申请量时,就会直接返回 OOM,从而有效地限制了资源的使用。

(二)资源信息的隔离展示

在执行 nvidia-smi 命令查看 GPU 信息时,HAMi 也只会返回 Pod Resource 中申请的资源,进一步实现了资源的隔离展示。这使得用户在查看 GPU 资源使用情况时,看到的是经过隔离后的准确信息,避免了不同 Pod 之间资源信息的混淆。

四、HAMi 的部署与配置:轻松上手的实践指南

(一)部署前的准备

  1. 部署 GPU Operator
    由于 HAMi 依赖 NVIDIA 的相关组件,推荐先部署 GPU Operator,为后续 HAMi 的部署打下坚实的基础。
  2. 获取 k8s 版本
    在安装过程中,需要根据集群服务端版本来指定调度器镜像版本,因此要先通过 kubectl version 命令获取 k8s 版本信息。

(二)HAMi 的部署步骤

  1. 添加 repo 仓库
    执行 helm repo add hami-charts https://project-hami.github.io/HAMi/ 命令,添加 HAMi 的 Helm Chart 仓库。
  2. 安装 HAMi
    根据获取到的 k8s 版本,使用如下命令进行安装(假设集群服务端版本为 v1.27.4):
helm install hami hami-charts/hami --set scheduler.kubeScheduler.imageTag=v1.27.4 -n kube-system

安装完成后,可以通过 kubectl get pods -n kube-system|grep hami 命令查看 vgpu-device-plugin 与 vgpu-scheduler 两个 pod 的状态,若状态为 Running,则表示安装成功。

(三)自定义配置参数

HAMi 提供了丰富的自定义配置选项,通过在安装过程中使用 -set 参数来修改。例如:

  • devicePlugin.deviceSplitCount:整数类型,预设值是 10,用于设置 GPU 的分割数,每个 GPU 上最多可同时存在指定数量的任务。
  • devicePlugin.deviceMemoryScaling:浮点数类型,预设值是 1,可设置 NVIDIA 装置显存使用比例,大于 1 时启用虚拟显存(实验功能)。
  • devicePlugin.migStrategy:字符串类型,支持 “none” 与 “mixed” 两种工作方式,用于指定是否使用 MIG 设备。
  • devicePlugin.disablecorelimit:字符串类型,“true” 为关闭算力限制,“false” 为启动算力限制,默认为 “false”。
  • scheduler.defaultMem:整数类型,预设值为 5000,表示不配置显存时使用的默认显存大小,单位为 MB。
  • scheduler.defaultCores:整数类型(0 - 100),默认为 0,代表默认为每个任务预留的百分比算力。
  • scheduler.defaultGPUNum:整数类型,默认为 1,用于在 pod 资源中未设置 nvidia.com/gpu 时,根据其他相关资源键的值添加默认的 nvidia.com/gpu 键和值。
  • resourceNameresourceMemresourceMemPercentageresourceCoresresourcePriority 等:分别用于设置申请 vgpu 个数、显存大小、显存比例、算力、任务优先级的资源名,均有默认值。

此外,容器中也有对应配置,如 GPU_CORE_UTILIZATION_POLICY(字符串类型,“default”、“force”、“disable” 分别代表不同的容器算力限制策略)和 ACTIVE_OOM_KILLER(字符串类型,“true” 或 “false” 表示容器是否会因超用显存而被终止执行)。

五、HAMi 的验证:确保资源管理的有效性

(一)查看 Node GPU 资源

在部署 HAMi 后,虽然环境中可能只有一个物理 GPU,但 HAMi 默认会对其进行扩容。例如,通过执行 kubectl get node xxx -oyaml|grep capacity -A 7 命令,我们可以查看 Node 的资源信息,理论上能看到 nvidia.com/gpu 的数量有所增加(默认扩容 10 倍),这表明 HAMi 已经成功对 GPU 资源进行了虚拟切分。

(二)验证显存和算力限制

使用以下 YAML 文件创建一个 Pod 来验证显存和算力限制:

apiVersion: v1
kind: Pod
metadata:name: gpu-pod
spec:containers:- name: ubuntu-containerimage: ubuntu:18.04command: ["bash", "-c", "sleep 86400"]resources:limits:nvidia.com/gpu: 1nvidia.com/gpumem: 3000nvidia.com/gpucores: 30

创建完成后,通过 kubectl exec -it gpu-pod -- bash 进入 Pod,执行 nvidia-smi 命令。从输出结果中,我们可以看到 GPU 的内存使用情况和算力使用情况是否符合我们在 Pod 资源请求中设定的限制。例如,在上述示例中,我们期望看到 GPU 内存使用量不超过 3000MiB,算力使用不超过 30%。同时,注意到命令执行后的日志中会有 HAMi 的 CUDA 驱动打印信息,如 [HAMI-core Msg(16:139711087368000:multiprocess_memory_limit.c:434)]: Calling exit handler 16,这也进一步证明了 HAMi 在资源管理方面的作用。

通过以上对 HAMi 方案的全面介绍,我们可以看到它在 k8s 环境下 GPU 资源管理方面具有显著的优势和实用性。无论是解决资源利用率不高的问题,还是实现细粒度的资源隔离与限制,HAMi 都为我们提供了一种可行的解决方案。希望这篇博客能够帮助大家更好地理解和应用 HAMi,在实际工作中充分发挥 GPU 资源的潜力,提升计算任务的执行效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/640.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLMs之VDB:LanceDB的简介、安装和使用方法、案例应用之详细攻略

LLMs之VDB:LanceDB的简介、安装和使用方法、案例应用之详细攻略 目录 LanceDB的简介 1、LanceDB的主要特性 2、为何选择 LanceDB? LanceDB的安装和使用方法 1、安装方法 Javascript/Typescript Python 2、使用方法 Javascript Python LanceDB…

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(二)

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(二) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《…

Java面试核心知识4

公平锁与非公平锁 公平锁(Fair) 加锁前检查是否有排队等待的线程,优先排队等待的线程,先来先得 非公平锁(Nonfair) 加锁时不考虑排队等待问题,直接尝试获取锁,获取不到自动到队尾…

探索AGI:智能助手与自我赋能的新时代

目录 1 AGI1.1 DeepMind Levels(2023年11月)1.2 OpenAI Levels(2024年7月)1.3 对比与总结1.4 AGI可能诞生哪里 2 基于AI的智能自动化助手2.1 通用型大模型2.2 专业的Agent和模型工具开发框架2.3 编程与代码生成助手2.4 视频和多模态生成2.5 商…

python迷宫寻宝 第4关 自动寻路(找宝箱、宝石、终点、获取企鹅信息)

目录 地图 ​编辑 1、成功获取粉宝石或黄宝石。 2、获取企鹅的信息 3、获取红宝石 (1)api.get.item获取红宝石 (2)context.items获取红宝石 4、获取宝箱 (1)api.get.item获取宝箱 (2)context.items获取宝箱 5、达到终点 …

慧集通(DataLinkX)iPaaS集成平台-业务建模之业务对象(二)

3.UI模板 当我们选择一条已经建好的业务对象点击功能按钮【UI模板】进入该业务对象的UI显示配置界面。 右边填写的是UI模板的编码以及对应名称;菜单界面配置以业务对象UI模板编码获取显示界面。 3.1【列表-按钮】 展示的对应业务对象界面的功能按钮配置&#xff1…

PyCharm 引用其他路径下的文件报错 ModuleNotFound 或报红

PyCharm 中引用其他路径下的文件提示 ModuleNotFound,将被引用目录添加到系统路径: # # 获取当前目录 dir_path os.path.dirname(os.path.realpath(__file__)) # # 获取上级目录 parent_dir_path os.path.abspath(os.path.join(dir_path, os.pardir))…

mysql本地安装和pycharm链接数据库操作

MySQL本地安装和相关操作 Python相关:基础、函数、数据类型、面向、模块。 前端开发:HTML、CSS、JavaScript、jQuery。【静态页面】 Java前端; Python前端; Go前端 -> 【动态页面】直观: 静态,写死了…

单片机Day1

目录 一.什么是单片机? 二.单片机的组成 三.封装形式 四.优势 五.分类 通用型: 专用型: 按处理的二进制位可以分为: 六.应用: 七.发展趋势 1.增加CPU的数据总线宽度。 2.存储器的发展。 3.片内1/0的改进 …

spring ApplicationContextAware的使用和执行时机

实际项目开发中,会写类似如下的工具类,方便做脚本执行或者一些判断,提供一些api方法等(可阅读:https://blog.csdn.net/qq_26437925/article/details/114213391 ,ApplicationContextAware就大派用场了),如下…

Pytorch导出onnx模型并在C++环境中调用(含python和C++工程)

Pytorch导出onnx模型并在C环境中调用(含python和C工程) 工程下载链接:Pytorch导出onnx模型并在C环境中调用(python和C工程) 机器学习多层感知机MLP的Pytorch实现-以表格数据为例-含数据集和PyCharm工程中简单介绍了在…

2025新春烟花代码(二)HTML5实现孔明灯和烟花效果

效果展示 源代码 <!DOCTYPE html> <html lang"en"> <script>var _hmt _hmt || [];(function () {var hm document.createElement("script");hm.src "https://hm.baidu.com/hm.js?45f95f1bfde85c7777c3d1157e8c2d34";var …

[Transformer] The Structure of GPT, Generative Pretrained Transformer

The Structure of Generative Pretrained Transformer Reference: The Transformer architecture of GPT models How GPT Models Work

使用MATLAB正则表达式从文本文件中提取数据

使用MATLAB正则表达式从文本文件中提取数据 使用Python正则表达式从文本文件中提取数据的代码请看这篇文章使用正则表达式读取文本数据【Python】-CSDN博客 文本数据格式 需要提取 V 后面的数据, 并绘制出曲线. index 1V 0.000000W 0.000000E_theta 0.000000UINV 0.0…

电脑提示directx错误导致玩不了游戏怎么办?dx出错的解决方法

想必大家都有过这样的崩溃瞬间&#xff1a;满心欢喜打开心仪的游戏&#xff0c;准备在虚拟世界里大杀四方或者畅游冒险&#xff0c;结果屏幕上突然弹出个 DirectX 错误的提示框&#xff0c;紧接着游戏闪退&#xff0c;一切美好戛然而止。DirectX 作为 Windows 系统下游戏运行的…

python学opencv|读取图像(三十二)使用cv2.getPerspectiveTransform()函数制作透视图-变形的喵喵

【1】引言 前序已经对图像展开了平移、旋转缩放和倾斜拉伸技巧探索&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;二十八&#xff09;使用cv2.warpAffine&#xff08;&#xff09;函数平移图像-CSDN博客 python学opencv|读取图像&#xff08;二十…

初学spring 框架(了解spring框架的技术背景,核心体现,入门案例)

目录 技术背景 为什么要学习spring 框架&#xff1f; 学习spring 框架可以解决什么问题&#xff1f; 了解spring框架的核心体现 入门案例 步骤 1 导入 依赖 2 搭建三层架构体现【根据实际情况 构建】 3 添加配置文件 Test 测试类中 从 Ioc 容器 获取 Student 对象 总…

用户界面的UML建模11

然而&#xff0c;在用户界面方面&#xff0c;重要的是要了解《boundary》类是如何与这个异常分层结构进行关联的。 《exception》类的对象可以作为《control》类的对象。因此&#xff0c;《exception》类能够聚合《boundary》类。 参见图12&#xff0c;《exception》Database…

IDEA的常用设置

目录 一、显示顶部工具栏 二、设置编辑区字体按住鼠标滚轮变大变小&#xff08;看需要设置&#xff09; 三、设置自动导包和优化导入的包&#xff08;有的时候还是需要手动导包&#xff09; 四、设置导入同一个包下的类&#xff0c;超过指定个数的时候&#xff0c;合并为*&a…

STM32-笔记39-SPI-W25Q128

一、什么是SPI&#xff1f; SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且 在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同时为…