发布网友 发布时间:2022-12-23 20:24
共1个回答
热心网友 时间:2023-10-03 02:59
资源隔离主要采用的是虚拟化的解决思路,目前NVIDIA有两种 GPU 虚拟化的解决方案:
目前社区的GPU调度方案:
1.Nvidia 贡献的调度方案,只支持按较粗粒度的调度,按GPU块数调度。
Nvidia GPU Device Plugin
2.阿里云服务团队贡献的 GPU 共享的调度方案,其目的在于解决用户共享 GPU 调度的需求Kubernetes GPU共享实践
gpushare-scheler-extender
gpushare-device-plugin
由于资源隔离主要采用的是虚拟化技术,并且NVIDIA提供的两种GPU虚拟化解决方案都没有开源,GPU共享在资源隔离方面的实践资料相对较少,大多关注GPU资源的调度。
相关资料:Kubernetes的共享GPU集群调度
优点:
缺点:
前提条件:
实现思路:
依赖于Kubernetes的现有工作机制:
相关资料: AI 在 K8S 中的实践:云智天枢 AI 中台架构揭秘
实现思路:
相关资料: 基于 Kubernetes 的 GPU 类型调度实现
实现思路:
利用kubernetes现有的工作机制:
优点:
缺点:
1. 通过CRD(CustomResourceDefinition)定义两种资源:ExtendedResource 和 ResourceClass
ExtendedResource 描述了一种扩展资源,比如 NVIDIA GPU;
ResourceClass 定义了容器选择哪种扩展资源,它的使用方式和 Kubernetes 中的 Extended Resource类似,用户可以直接在容器中指定,就像使用 CPU 和 Memory 一样。
2. 利用 Scheler 的扩展机制扩展Scheler,负责调度容器中使用了ResourceClass资源对象的Pod
通过查询 ResourceClass 对象的定义过滤选择节点上的 ExtendedResource 资源,从而找到合适的节点并绑定,并将合适的 ExtendedResource 写到 Pod Annotation 中,供 Kubelet 组件使用。
3. 利用Nvidia Device Plugin插件,扩展NVIDIA GPU资源,负责与kubelet组件通信以及创建和维护 ExtendedResource 资源对象
ExtendedResource 资源中包含着 GPU 的频率、显存等信息,当多个容器想使用同一块 GPU 时,我们可以定义一个 ResourceClass 资源对象,在 ResourceClass 中声明使用多少显存(这里共享的是显存)。这样,应用部署时,我们只要在容器中声明使用该 ResourceClass 资源即可,之后 Scheler Extender 会过滤符合条件的 ExtendedResource 对象,绑定到合适的节点上。
如果要实现资源共享,我们可能需要在 ExtendedResource 中记录显存的用量情况,供调度参考。
相关资料: 在 Kubernetes 中使用 vGPU 实现机器学习任务共享 GPU
实现思路:
利用GPU厂家、虚拟化厂商等提供的GPU虚拟化技术,对GPU进行虚拟化,把完整的GPU进行分割。然后按照调度物理GPU一样在k8s中调度GPU。
优点:
缺点:
k8s官网对GPU调度的说明 提供了Nvidia GPU容器调度能力,但是只能将一个GPU卡分配给一个容器
从零开始入门 K8s:GPU 管理和 Device Plugin 工作机制
如何在Kubernetes实现GPU调度及共享
Kubernetes GPU使用指南
Kubernetes如何通过Device Plugins来使用NVIDIA GPU
你真的了解多个docker容器如何共享GPU么?
Kubeflow 使用 Kubernetes 进行机器学习