如何在K8S中使用XPU

背景

        作为推动人工智能技术进步的“三驾马车”,算法、数据和算力在过去的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的算力。

参考

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值