开源 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 的部署与配置:轻松上手的实践指南
(一)部署前的准备
- 部署 GPU Operator
由于 HAMi 依赖 NVIDIA 的相关组件,推荐先部署 GPU Operator,为后续 HAMi 的部署打下坚实的基础。 - 获取 k8s 版本
在安装过程中,需要根据集群服务端版本来指定调度器镜像版本,因此要先通过kubectl version命令获取 k8s 版本信息。
(二)HAMi 的部署步骤
- 添加 repo 仓库
执行helm repo add hami-charts https://project-hami.github.io/HAMi/命令,添加 HAMi 的 Helm Chart 仓库。 - 安装 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键和值。resourceName、resourceMem、resourceMemPercentage、resourceCores、resourcePriority等:分别用于设置申请 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 资源的潜力,提升计算任务的执行效率。
相关文章:
开源 vGPU 方案 HAMi 解析
开源 vGPU 方案 HAMi 一、k8s 环境下 GPU 资源管理的现状与问题 (一)资源感知与绑定 在 k8s 中,资源与节点紧密绑定。对于 GPU 资源,我们依赖 NVIDIA 提供的 device-plugin 来进行感知,并将其上报到 kube-apiserver…...
备考蓝桥杯:顺序表详解(静态顺序表,vector用法)
目录 1.顺序表的概念 2.静态顺序表的实现 总代码 3.stl库动态顺序表vector 测试代码 1.顺序表的概念 要理解顺序表,我们要先了解一下什么是线性表 线性表是n个具有相同特征的数据元素的序列 这就是一个线性表 a1是表头 a4是表尾 a2是a3的前驱 a3是a2的后继 空…...
OA系统如何做好DDOS防护
OA系统如何做好DDOS防护?在数字化办公蔚然成风的当下,OA(办公自动化)系统作为企业内部管理与协作的神经中枢,其安全性和稳定性直接关系到企业的日常运营效率、信息流通效率以及长远发展。OA系统不仅承载着企业内部的日…...
使用 Python 的 pyttsx3 库进行文本转语音
1. 什么是 pyttsx3? 1.1 pyttsx3 是一个 Python 库,它可以将文本转换为语音。与其他文本转语音库(如 gTTS)不同,pyttsx3 不依赖于网络服务,它使用本地的 TTS(Text-to-Speech)引擎&a…...
如何在Windows上编译OpenCV4.7.0
前言 参考:Win10 下编译 OpenCV 4.7.0详细全过程,包含xfeatures2d 这里在其基础上还出现了一些问题,仅供参考。 正文 一、环境 1、win10 2、cmake-gui 3、opencv4.7.0 4、VS2019 二、编译过程 1、下载需要的文件: 通…...
【玩转全栈】----Django连接MySQL
阅前先赞,养好习惯! 目录 1、ORM框架介绍 选择建议 2、安装mysqlclient 3、创建数据库 4、修改settings,连接数据库 5、对数据库进行操作 创建表 删除表 添加数据 删除数据 修改(更新)数据: 获取数据 1、OR…...
25/1/4 算法笔记<强化学习> 生成对抗模仿学习
基于生成对抗网络的模仿学习,假设存在一个专家智能体,其策略可以看成最优策略,我们就可以通过直接模仿这个专家在环境中交互的动作数据来训练一个策略,并不需要用到环境提供的奖励信息。 生成对抗模仿学习GAIL实质上就是模仿了专家…...
Flink维表方案选型
Iceberg Iceberg 采用全量预加载数据的方式将维度表数据全部加载到内存中进行关联,虽然可以避免频繁访问外部数据库,但对计算节点的内存消耗很高,不能适用于数量很大的维度表。除此之外,当 Iceberg 维表数据更新后,可…...
Oracle Database 23ai 新特性: UPDATE 和 DELETE 语句的直接联接
Oracle Database 23c 引入了一系列令人振奋的新特性,其中一项尤为引人注目的是对 UPDATE 和 DELETE 语句支持直接联接(Direct Join)。这一新功能极大地简化了复杂数据操作的实现,提升了性能,并为数据库开发者提供了更强…...
机器学习之随机森林算法实现和特征重要性排名可视化
随机森林算法实现和特征重要性排名可视化 目录 随机森林算法实现和特征重要性排名可视化1 随机森林算法1.1 概念1.2 主要特点1.3 优缺点1.4 步骤1.5 函数及参数1.5.1 函数导入1.5.2 参数 1.6 特征重要性排名 2 实际代码测试 1 随机森林算法 1.1 概念 是一种基于树模型的集成学…...
网络安全图谱以及溯源算法
本文提出了一种网络攻击溯源框架,以及一种网络安全知识图谱,该图由六个部分组成,G <H,V,A,E,L,S,R>。 1|11.知识图 网络知识图由六个部分组成,…...
单片机-外部中断
中断是指 CPU 在处理某一事件 A 时,发生了另一事件 B,请求 CPU 迅速去处理(中断发生);CPU 暂时停止当前的工作(中断响应), 转去处理事件 B(中断服务);待 CPU 将事件 B 处理完毕后,再回到原来事件 A 被中断的…...
《解锁计算机视觉智慧:编程实现图片场景文字描述的开源宝藏》
《解锁计算机视觉智慧:编程实现图片场景文字描述的开源宝藏》 一、MiniGPT-4:小模型撬动大视觉理解(一)项目概览(二)核心亮点(三)上手体验 二、ClipCap-Chinese:中文场景…...
onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制
文章目录 1. 页面跳转方式2. 你的场景分析3. 页面生命周期4. 总结5. 建议 在微信小程序中,页面跳转时, onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制。以下是详细说明: 1. 页面跳转方式 微信小程序提供了多种页面…...
Visio 画阀门 符号 : 电动阀的画法
本篇文章介绍阀门,很多朋友在利用Visio绘画管道流程简图时,需要进行阀门符号的绘画,而Visio提供的阀门符号种类并不是很齐全。 本篇文章给出电动阀的画法: 下图是液动阀的符号: 首先,找到“更多形状”中的…...
OOM排查思路
K8S 容器的云原生生态,改变了服务的交付方式,自愈能力和自动扩缩等功能简直不要太好用。 有好的地方咱要夸,不好的地方咱也要说,真正的业务是部署于容器内部,而容器之外,又有一逻辑层 Pod 。 对于容器和…...
《Spring Framework实战》10:4.1.4.2.详细的依赖和配置
欢迎观看《Spring Framework实战》视频教程 集合 <list/>、<set/>、<map/>和<props/>元素分别设置Java集合类型list、set、map和properties的属性和参数。以下示例显示了如何使用它们: <bean id"moreComplexObject" class&qu…...
网络安全-XSS跨站脚本攻击(基础篇)
漏洞扫描的原理 1.跨站脚本攻击介绍 xss跨站脚本攻击: xSS 全称(Cross site Scripting )跨站脚本攻击,是最常见的Web应用程序安全漏洞之一,位于OWASP top 10 2013/2017年度分别为第三名和第七名,XSS是指攻…...
Git的学习和常见问题
文章目录 1.初始化配置2.新建仓库3.添加和提交文件4.git reset 回退版本5.git diff 查看差异6.git rm 删除文件7.文件 .gitigonre8.克隆远程仓库9.将已有的本地仓库关联到远程仓库10.分支的基本操作11.解决合并冲突配置问题 最近基于GeekHour的视频学习Git,记录了一…...
Flink源码解析之:Flink on k8s 客户端提交任务源码分析
Flink on k8s 客户端提交任务源码分析 当我们需要在代码中提交Flink job到kubernetes上时,需要如何做呢?要引入什么第三方依赖?需要提供什么内容?flink是如何将job提交到k8s上的?经过了什么样的流程,内部有…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
