开源 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.mzph.cn/bicheng/67938.shtml

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

相关文章

反射的底层实现原理?

Java 反射机制详解 目录 什么是反射?反射的应用反射的实现反射的底层实现原理反射的优缺点分析 一、什么是反射? 反射是 Java 编程语言中的一个强大特性,它允许程序在运行期间动态获取类和操纵类。通过反射机制,可以在运行时动…

【技术支持】安卓无线adb调试连接方式

Android 10 及更低版本,需要借助 USB 手机和电脑需连接在同一 WiFi 下;手机开启开发者选项和 USB 调试模式,并通过 USB 连接电脑(即adb devices可以查看到手机);设置手机的监听adb tcpip 5555;拔掉 USB 线…

《框架程序设计》期末复习

目录 Maven 简介 工作机制(★) 依赖配置(★) Maven命令 MyBatis 入门 单参数查询(★) 多参数查询(★★★) 自定义映射关系(★★★) 基本增删改查操…

于交错的路径间:分支结构与逻辑判断的思维协奏

大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。* 这一节内容很多,文章字数达到了史无前例的一万一,我们要来学习分支与循环结构中…

计算机图形学【绘制立方体和正六边形】

工具介绍 OpenGL:一个跨语言的图形API,用于渲染2D和3D图形。它提供了绘制图形所需的底层功能。 GLUT:OpenGL的一个工具库,简化了窗口创建、输入处理和其他与图形环境相关的任务。 使用的函数 1. glClear(GL_COLOR_BUFFER_BIT |…

探秘block原理

01 概述 在iOS开发中,block大家用的都很熟悉了,是iOS开发中闭包的一种实现方式,可以对一段代码逻辑进行封装,使其可以像数据一样被传递、存储、调用,并且可以保存相关的上下文状态。 很多block原理性的文章都比较老&am…

vue3+ts+element-plus 对话框el-dialog设置圆角

对话框el-dialog设置圆角,实现的需求效果: 目前只能通过行内样式(style"border-radius: 20px")来实现圆角效果:

机器学习算法(三):K近邻(k-nearest neighbors)

1 KNN的介绍和应用 1.1 KNN的介绍 kNN(k-nearest neighbors),中文翻译K近邻。我们常常听到一个故事:如果要了解一个人的经济水平,只需要知道他最好的5个朋友的经济能力, 对他的这五个人的经济水平求平均就是这个人的经济水平。这…

大语言模型兵马未动,数据准备粮草先行

​从OpenAI正式发布ChatGPT开始,大型语言模型(LLM)就变得风靡一时。对业界和吃瓜群众来说,这种技术最大的吸引力来自于理解、解释和生成人类语言的能力,毕竟这曾被认为是人类独有的技能。类似CoPilot这样的工具正在迅速…

Network Compression(李宏毅)机器学习 2023 Spring HW13 (Boss Baseline)

1. Introduction to Network Compression 深度学习中的网络压缩是指在保持神经网络性能的同时,减少其规模的过程。这非常重要,因为深度学习模型,尤其是用于自然语言处理或计算机视觉的大型模型,训练和部署的计算成本可能非常高。网络压缩通过降低内存占用并加快推理速度,…

UnityDots学习(二)

在一里已经概述了什么是Dots,已经如果使用它,我们要做的思维转变。 简单总结下: Dots使用了计算器多核,已经3级缓存的优势,在此基础上使用Brust编译器对各个平台实现了代码优化。从而达到了加速提升的效果。 我们要…

Linux (CentOS) 安装 Docker 和 Docker Compose

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …

c++ 预备

目录 前言 一,知识点的补充 二,c语言与c 三,面向对象的三大特点 前言 将进入c的学习,接下来是对于c的预备和c的一些预习 一,知识点的补充 1 标识符 标识符不能为关键字 标识符只能由下划线,数字&#xf…

SpringBoot项目实战(41)--Beetl网页使用自定义函数获取新闻列表

在Beetl页面中可以使用自定义的函数从后台新闻列表中获取新闻数据展示到页面上。例如我们可以从后台新闻表中获取新闻按照下面的格式展示&#xff1a; <li><a href"#">东亚非遗展即将盛妆亮相 揭起盖头先睹为快</a></li><li><a hre…

从零开始开发纯血鸿蒙应用之多签名证书管理

从零开始开发纯血鸿蒙应用 一、前言二、鸿蒙应用配置签名证书的方式1、自动获取签名证书2、手动配置签名证书 三、多签名证书配置和使用四、多证书使用 一、前言 由于手机操作系统&#xff0c;比电脑操作系统脆弱很多&#xff0c;同时&#xff0c;由于手机的便携性&#xff0c…

数据结构初阶---排序

一、排序相关概念与运用 1.排序相关概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的…

系统看门狗配置--以ubuntu为例

linux系统配置看门狗 以 ubuntu 系统配置看门狗为例 配置看门狗使用的脚本文件&#xff0c;需要使用管理员权限来执行&#xff1a; 配置是&#xff1a;系统每 30S 喂一次狗&#xff0c;超过 60S 不进行投喂&#xff0c;就会自动重启。 1. 系统脚本内容&#xff1a; #!/bin/b…

opencv的NLM去噪算法

NLM&#xff08;Non-Local Means&#xff09;去噪算法是一种基于图像块&#xff08;patch&#xff09;相似性的去噪方法。其基本原理是&#xff1a; 图像块相似性&#xff1a;算法首先定义了一个搜索窗口&#xff08;search window&#xff09;&#xff0c;然后在该窗口内寻找…

Docker运维高级容器技术知识点总结

1、虚拟机部署和容器化部署的区别是什么&#xff1f; 1、技术基础&#xff1a; <1>.虚拟化技术在物理硬件上创建虚拟机&#xff0c;每台虚拟机运行自己完整的操作系统、从而实现资源隔离。 <2>.容器化技术&#xff1a;将应用程序打包在容器内&#xff0c;在进程空间…

双模充电桩发展前景:解锁新能源汽车未来的金钥匙,市场潜力无限

随着全球能源转型的浪潮席卷而来&#xff0c;新能源汽车行业正以前所未有的速度蓬勃发展&#xff0c;而作为其坚实后盾的充电基础设施&#xff0c;特别是双模充电桩&#xff0c;正逐渐成为推动这一变革的关键力量。本文将从多维度深入剖析双模充电桩的市场现状、显著优势、驱动…