背景

作为推动人工智能技术进步的“三驾马车”,算法、数据和算力在过去的5-10年间不断创新。在算法方面,人类在机器学习的算法上实现了突破,特别是在视觉和语音技术方面的成就尤为突出。在数据方面,移动互联网时代的到来使数据量迎来了爆炸式增长。人工智能算法模型经过长期发展,目前已覆盖多个研究子领域。随着大数据技术的不断提升,人工智能赖以学习的标记数据获得成本下降,同时对数据的处理速度也大幅提升。宽带的效率不断提升、物联网和电信技术的持续迭代为人工智能技术的发展提供了基础设施。2020年,接入物联网的设备将增加至500亿台。代表电信发展里程的5G的发展将为人工智能的发展提供最快1000Mbps的信息传输速度。在算力上,得益于芯片处理能力提升和硬件价格下降,算力得到大幅提升。截至目前,全球人工智能的算力主要是以GPU芯片为主。随着技术的不断迭代,如ASIC、FPGA在内的计算单元类别也不断成为支撑人工智能技术发展的底层技术。在以容器为应用运行载体的Kubernetes平台上,运行AI训练和推理任务,已经成为AI厂商以及AI应用在企业落地的热点和首选。我们已经看到Kubernetes在AI、ML这一新型应用场景下得到快速应用的趋势。Kubernetes已经成为云原生时代编排框架的事实标准,各种资源、任务都可以使用Kubernetes进行编排和管理,当然也包括机器学习任务。基于Kubernetes,大量开发者和公司已经提供了众多开源或商业的工具(包括:Argo、Katib、KubeFlow、RiseML等),通过这些工具,AI公司可以进一步提升机器学习任务在Kubernetes上运行的效率,增强使用Kubernetes进行机器学习的能力。同时容器和Serverless将使机器学习模型作为独立的功能提供服务,从而以更低的开销运行AI应用。

kubernetes如何使用物理GPU

Kubernetes具有对机器的资源进行分配和使用的能力,比如k8s可以指定容器使用多少内存以及使用多少CPU计算资源。那么问题来了,一般来说容器就是使用CPU和内存资源,那么对于需要使用显卡的Pod,k8s也能够支持吗?答案当然是肯定的!自从k8s 1.8版本开始,官方开始推荐使用device plugin的方式来调用GPU。截至目前,NVIDIA和AMD都推出了相应的设备插件,使得k8s调用GPU变得容易起来。由于目前整个AI数据中心市场主要以NVIDIA的GPU卡为主,所以我们看下k8s是如何使用NVIDIA GPU资源。

首先,官方的 NVIDIA GPU 设备插件有以下要求:

  • Kubernetes 的节点必须预先安装了 NVIDIA 驱动
  • Kubernetes 的节点必须预先安装 NVIDIA-docker 2.0
  • Docker 的默认运行时必须设置为 NVIDIA-runtime,而不是 runc
  • NVIDIA 驱动版本 ~= 384.81

如果你的集群已经启动并且满足上述要求的话,就可以部署 NVIDIA 设备插件,部署完插件之后Kubernetes 将暴露 NVIDIA.com/GPU 为 可调度的资源。你可以通过请求 NVIDIA.com/GPU 资源来使用 GPU 设备,就像你为pod申请 CPU 和内存资源那样。不过,使用 GPU 时,在如何指定资源需求这个方面还是有一些限制的:

  • GPU只能设置在limits部分,这意味着:
  • 你可以指定 GPU 的 limits 而不指定其 requests,Kubernetes 将使用限制值作为默认的请求值;
  • 你可以同时指定 limits 和 requests,不过这两个值必须相同。
  • 你不可以仅指定 requests 而不指定 limits值。
  • 容器(以及 Pod)之间是不共享 GPU 的。
  • 每个容器可以请求一个或者多个 GPU,但是不能使用小数值来请求部分 GPU资源,比如0.2、0.7等 。
  • 如果集群内部的不同节点上有不同类型的 NVIDIA GPU,那么你可以使用 节点标签和节点选择器 来将 pod 调度到合适的节点上,并不能自动化的在申请资源的时候指定型号。

在Kubernetes 集群中使用XPU

XPU是优优工场(YOYOWORKS)推出的容器GPU虚拟化产品。XPU核心思想是将GPU在内核层进行切分,向上模拟出统一的XPU设备供容器使用,即多个容器共享一张GPU卡。XPU实现了一套框架能够很好的屏蔽异构GPU和应用(TensorFlow,PyTorch等)之间的耦合,对GPU进行故障隔离,显存隔离,算力隔离,从而实现业务的安全隔离,提高GPU硬件资源的利用率并降低使用成本。

在K8S集群中使用XPU,主要利用了K8S 1.8版本后提出的Extended Resources和Device Plugin方案。Device Plugin:K8S制定设备插件接口规范,定义异构资源的上报和分配,设备厂商只需要实现相应的API接口,无需修改kubelet源码即可实现对其他硬件设备的支持。Extended Resource(XPU定义的extended resource为yoyoworks.com/xpu-shares),K8S scheduler可以根据Pod的创建删除计算资源可用量,而不再局限于CPU和内存的资源统计,进而将有特殊资源需求的Pod调度到相应的节点上。

在K8S的使用过程中,除了安装前文所述XPU driver module 和 XPU container runtime之外,需要用到xpu-device-plugin和xpu-extend-scheduler两个插件,具体使用如下:

1. 确保Kubernetes集群已经正确安装,版本 >= 1.18;

2. 存在GPU的node上打上xpu=true的标签:

#>sudo kubectl label node <node_name>xpu=true

查询如下图所示:

3. 部署xpu-device-plugin插件:

#>sudo kubectl apply -f http://www.yoyoworks.com/release/k8s-plugin/device-plugin-rbac.yaml

#>sudo kubectl apply -f http://www.yoyoworks.com/release/k8s-plugin/device-plugin-ds.yaml

4. 部署xpu-extend-scheduler插件:

#>sudo wget http://yoyoworks.com/release/k8s-plugin/scheduler-policy-config.json

修改K8S scheduler的配置文件,/etc/kubernetes/manifests/kube-scheduler.yaml,增加:

- --policy-config-file=/etc/kubernetes/scheduler-policy-config.json

- --use-legacy-policy-config=true

- mountPath: /etc/kubernetes/scheduler-policy-config.json

name: scheduler-policy-config

readOnly: true

- hostPath:

path: /etc/kubernetes/scheduler-policy-config.json

type: FileOrCreate

name: scheduler-policy-config

应用yaml文件:

#>sudo kubectl apply -f http://www.yoyoworks.com/release/k8s-plugin/xpu-scheduler-extender.yaml

5. 检查xpu-device-plugin和xpu-extend-scheduler两个插件是否正常运行:

6. 测试,将XPU定义的extended resource写入需要调度的Pod yaml文件中:

或者直接从优优网站下载一个示例yaml文件直接应用:

#>kubectl apply -f http://www.yoyoworks.com/release/k8s-plugin/xpu-sam.yaml

在k8s中部署XPU之后,就可以实现对NVIDIA GPU进行细粒度的管理,比如申请0.5个GPU的算力。

参考

  • 全球人工智能发展白皮书
  • K8S官方文档
  • 优优工场(YOYOWORKS)XPU

如何在K8S中使用XPU相关推荐

  1. 如何在K8S中创建一个自定义Controller?

    目的 CRD资源定义 代码生成 Controller编写 目的 Custom Resource是扩展Kubernetes的一种方式(另外一种就是通过聚合层API apiserver-aggregati ...

  2. 如何在K8S上玩转TensorFlow ?

    女主宣言 该文章出自于ADDOPS团队,是关于如何在K8S上玩转tensorflow的主题,该文章深入浅出的给我们介绍了当前tensorflow的现状和架构特点等,然后介绍了让tensorflow如何 ...

  3. 如何在K8S上备份和恢复MySQL

    如何在K8S上备份和恢复MySQL 越来越多的生产系统和关键应用运行在K8S上.在生产系统运行有状态应用,并不是一件容易的事情,它需要我们仔细的计划并部署.我们之前有一篇文章专门介绍如何在K8S上运行 ...

  4. (干货)如何在k8s部署应用

    技术的本质是用来解决问题 先赞后看,养成习惯 本文章适合对如何在k8s部署应用感兴趣的小伙伴.如果你现在在为如何在k8s部署应用而烦恼,或者是你需要deployment.yaml,service.ya ...

  5. 举例说明如何在Go中使用Context | Gopher Daily (2021.09.15) ʕ◔ϖ◔ʔ

    每日一谚:Concurrency is not just for doing more things faster. It's for writing better code. Go技术生态 那些没有 ...

  6. 安全运维-如何在Kubernetes中使用注释对ingress-nginx及后端应用进行安全加固配置实践...

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 本章目录: 0x08 Kubernetes中ingress-nginx安全配置 1.配置指定的 ...

  7. 在k8s中使用gradle构建java web项目镜像Dockerfile

    在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...

  8. 如何在SharePoint2010中添加Deep Zoom Image

    如何在SharePoint2010中添加Deep Zoom Image 应用范围 SharePoint 2010 Foundation:SharePoint 2010 Standard:SharePo ...

  9. php如何对数组进行分组,如何在PHP中对数组进行分组排序

    如何在PHP中对数组进行分组排序 发布时间:2021-01-04 16:28:51 来源:亿速云 阅读:98 作者:Leah 这篇文章将为大家详细讲解有关如何在PHP中对数组进行分组排序,文章内容质量 ...

最新文章

  1. ExtJs4 笔记(5) Ext.Button 按钮
  2. Vim-复制选中内容至系统剪贴板,光标移动到指定行的行首和行尾
  3. Linux测试端口的连通性的四种方法
  4. concat特征融合_深度特征融合---理解add和concat之多层特征融合
  5. java中string 和stringbuffer的区别_Java中的String,StringBuilder,StringBuffer三者的区别...
  6. java必读书籍_必读:Java Java
  7. 对h.264压缩视频码流中i帧的提取(firstime)
  8. html5自动提交表单提交,HTML5 Form表单--提交信息
  9. Google Volley框架源码走读
  10. 嵌入式系统——流水线处理机执行时间计算
  11. Web专家周末聚会都会说点啥
  12. Eclipse自动生成返回值对象
  13. GBK编码和UTF-8编码区别各所占用字节数
  14. makefile编写模板
  15. 推荐一个app,收纳杭州最全登山地图!附亲测过的亲子徒步路线推荐
  16. 泽林主办前沿IT技术分享峰会隆重召开,深度探讨人工智能、大数据与物联网 的未来发展趋势
  17. LeetCode热门100之 无重复字符的最长子串
  18. Linux perf 1.1、perf_event内核框架
  19. 个人微信号API接口
  20. HTTP/2协议详细介绍

热门文章

  1. docker 多个mysql_docker安装多MySQL服务
  2. python爬虫(十四)selenium(select、17素材网、模拟登录豆瓣和QQ空间、获取cookie、行为链)
  3. Scut游戏引擎改造兼容Codis。
  4. 怎么在WEB页面上读取身份证信息
  5. 男人二十,男人三十。
  6. 全国计算机一级考试关于电子邮件,荐计算机等级考试题库:一级MS Office常考知识点“电子邮件、文件传输、Internet其他应用”...
  7. Acrel-EIoT能源物联网平台助力电网基础设施智能化改造和智能微电网建设-Susie 周
  8. Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type ‘application/x-ww
  9. 10万在线的web服务器架设以及程序设计
  10. 信驰达BLE 5.0低功耗蓝牙模块使用 (AT指令串口透传) RSBRS02ABR