k8s扩展调度器以支撑更灵活的GPU调度
背景
现如今,随着企业纷纷在机器学习和深度学习上加大投入,他们开始发现从头构建一个 AI 系统并非易事。
以深度学习为例。对于深度学习来说,算力是一切的根本。为了用海量数据训练性能更好的模型、加速整个流程,企业的 IT 系统需要具备快速、高效调用管理大规模 GPU 资源的能力。同时,由于算力资源十分昂贵,出于成本控制,企业也需要通过分布式训练等方式最大化 GPU 资源利用率。
面对这类新要求,基于 Kubernetes 的云原生技术为人工智能提供了一种新的工作模式。凭借其特性,Kubernetes 可以无缝将模型训练、inference 和部署扩展到多云 GPU 集群,允许数据科学家跨集群节点自动化多个 GPU 加速应用程序容器的部署、维护、调度和操作。
在 1.6 版本和 1.9 版本中,Kubernetes 先后提供了对 NVIDIA GPU、AMD GPU 容器集群管理调度的支持,进一步提高了对 GPU 等扩展资源进行统一管理和调度的能力。
但是,Kubernetes 作为新一代 AI 开发基础也存在缺陷。为训练任务分配算力资源时,它通常是随机分配容器所在节点的 GPU,而不能指定使用某类 GPU 类型。
虽然这对大部分深度学习模型训练场景来说已经足够了,但如果数据科学家希望能更灵活地使用更高性能的或某一类型的 GPU,Kubernetes 的能力就有些捉襟见肘了。
核心痛点
1、Kubernetes 作为新一代 AI 开发基础也存在缺陷。为训练任务分配算力资源时,它通常是随机分配容器所在节点的 GPU,而不能指定使用某类 GPU 类型。
2、Kubernetes 在分配GPU设备时,粒度过大,通常是以一个GPU训练卡为自愿申请最小单位,
这样显卡利用率低
解决方案:
1、扩展调度器
2、使用timeSlicing来细分显卡资源分配时间片的粒度
3、使用GPU Sharing方案细分显卡资源分配显存的粒度
一、扩展调度器
依赖以下现有 Kubernetes 工作机制:
Scheduler Extender 机制
Device Plugin 机制
API Server 扩展机制(CRD)
Admission 扩展机制(ResourceQuota)
另外的方法:带有侵入性但是改造成本低的方式
kubelet在申请设备的时候,是随机选择的,那么可以在kubelet申请设备的时候,使用一些库或者自制资源获取逻辑,获取主机上的显卡具体信息,比如:哪些是nvlink相连,哪些显存大,哪些频率高,这样的细节,将显卡的信息和显卡的ID信息的绑定关系保存起来,然后kubelet在调用nvidia-plugin的allocate的时候,显卡ID就可以在你自己的逻辑中根据pod的需要去申请最合适弟
二、使用timeSlicing来细分显卡资源分配粒度
具体细节参考上篇博文:k8s gpu时间分片
三、使用GPU Sharing方案细分显卡资源分配显存的粒度
部署参考链接:
https://developer.aliyun.com/article/690623 https://wangjunjian.com/kubernetes/2021/05/20/gpu-sharing-in-kubernetes.html https://www.jianshu.com/p/48a33e01230a
阿里巴巴开源方案源码链接: