您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

跑AI大模型的K8s与普通K8s有什么不同?

时间:2023-09-01 15:21:48  来源:  作者:OSC开源社区

来源 | OSCHINA 社区

作者 | 华为云开发者联盟

原文链接:https://my.oschina.NET/u/4526289/blog/10106268

本文分享自华为云社区《跑AI大模型的K8s与普通K8s有什么不同?》,作者:tsjsdbd。

得益于AI开始火的时候,云原生体系已经普及,所以当前绝大多数的AI底层都是基于Kubernetes集群进行的资源管理(不像大数据,早期大量使用Yarn进行资源管理,在云原生普及后,还得面临Spark on K8s这种云原生改造)。

都知道云原生已经是Kubernetes的天下了,各大领域(大数据、互联网,基因、制药、时空、遥感、金融、游戏等)早已纷纷采纳。那在面对大模型AI火热的当下,咱们从程序员三大件“计算、存储、网络”出发,一起看看这种跑大模型AI的K8s与普通的K8s有什么区别?有哪些底层就可以构筑AI竞争的地方。

计算

Kubernetes是一个在大量节点上管理容器的系统,其主要功能总结起来,就是在想要启动容器的时候,负责“找一个「空闲」节点,启动容器”。但是它默认考虑的启动因素(资源类)主要就是“CPU+内存”。就是容器指定“我要多少CPU+多少内存”,然后K8s找到符合这个要求的节点。

但是,当容器运行需要特殊“资源”的时候,K8s就熄火了。因为它不是认识“GPU”这种异构资源,不知道节点上面有多少“异构资源”(只统计剩余CPU+内存资源)。

K8s自己知道,异构资源千千万,每种使用方法也不一样,自己开发肯定搞不完。比如有RoCE网卡,GPU卡,NPU卡,FPGA,加密狗等等各种硬件。仅单纯的GPU管理,就可以有“每个容器挂1个GPU”,或者“几个容器共用1个GPU”,甚至“1个GPU切分成多个vGPU分别给不同容器用”多种用法。

所以,为了成为一个通用的资源调度系统,它(K8s)搞了个插件框架,来辅助自己判断节点有没有“特殊资源”,叫做 Device-plugin插件。用户需要自己完成这个Device-plugin的开发对接,来实时通知K8s节点上面GPU的使用情况,辅助K8s按需分配GPU算力。

总结就是咱们的AI集群里面,总会有一个GPU的Device-plugin用来辅助GPU调度。例如昇腾、含光等各家自研NPU,就算是最简单的整卡调度,也得带这个DP(Device-plugin)。

如果还需要MIG这样利用vGPU功能来提升GPU的利用率的话,那么Device-plugin插件的实现也会复杂很多。因为A100之前没有提供GPU虚拟化的标准实现,这个就看各家神通了。

其实目的都是大同小异的:就是增强Device-plugin插件逻辑,实现GPU资源的复用(显存+算力隔离),来提升底层GPU整体的利用率。虽然K8s新版本1.27之后,可以使用DRA(Dynamic Resource Allocation)框架实现动态切分,但是当前绝大多数的集群,依然是使用DP完成这个逻辑。

而且,K8s设置的“异构资源”调度框架中,认为资源分配必须是“整数”的,即容器可以要1个GPU卡,但是不能要 0.5个GPU卡。所以想要实现多个容器,共用1个GPU卡的话(自己控制分时用,比如白天容器1用,晚上容器2用,这种性能比vGPU切分后用更好),还得增强DP逻辑(以及调度逻辑,后面会讲)。

最后,异构硬件故障的检测,任务的快速恢复,都需要这个DP的深入参与。

存储

其实Kubernetes集群本身也不管存储,主要管理的是容器“如何接入”存储。通过引入PV和PVC概念,标准的K8s都可以做到将存储挂载至容器中,使得容器里面的程序,像使用本地文件一样的访问远端存储。

在大规模AI训练场景下,样本数据的大小还是很可观的,基本都几百T的级别。所以AI-Infrastructure对存储的要求也会比较高。

更大的区别在于:训练是多轮迭代来逼近目标范围的,因为训练数据量太大,数据无法全部放入内存,在每轮迭代结束后,需要重新从文件系统里读取数据进行下一轮迭代的训。即得重新访问样本进行一轮计算。那么如果每次都重新访问“远程”存储,性能必将大受影响(100T数据,每个epoch重新读一遍OBS桶,你想想那得多慢)。

所以如何将大量的样本数据,就近缓存,就是AI+K8s系统需要重点考虑的问题。分布式缓存加速系统,就是其中一条路线。

常见的有Juicefs,Alluxio等产品,以及各云厂商提供的自研产品。它们的特点是:利用服务器本身就带的高速存储(比如nvme高速本地盘),来缓存样本数据。并提供分布式文件系统,达到就近全量存储的目的。这样在多轮的epoch训练中,可以大幅的提升样本访问速度,加快整体训练进度。

所以建设or使用分布式缓存系统,也是AI平台建设中的重要一环。

网络

在Kubernetes的标准框架里,容器是只有1个网络平面的。即容器里面,只有1个eth0网卡。所以无论是利用overlay实现容器隧道网络,还是underlay实现容器网络直通,其目的都是解决容器网络“通与不通”的问题。

而大规模AI集群中,百亿、千亿级别参数量的大模型通常需要做分布式训练,这时参数梯度等信息要在节点间交换,就需要使用RDMA网络来传递。否则以普通以太网进行传输,其仅仅解决“通与不通”这种入门要求,参数信息传的实在太慢了。

RDMA可以绕过TCP/IP协议栈,并且不需要CPU干预,直接从网卡硬件上开始网络数据传递,网络传输性能可以大幅的提升,大大加快训练参数的交换。

所以咱们的AI集群中,必须要将RDMA网络管理起来,使得所有AI容器可以通过这条路,完成各种集合通信算法(AllReduce等)。

如上图,除了「底部」那条咱们平时看到的容器网络那条线外,顶部还有一个「参数面」网络。一般成本考虑咱们都是走RoCE方案,即用IB网卡+以太网交换机(而不是IB专用交换机)实现。而且由于RDMA协议要求网络是无损的(否则性能会受到极大的影响),而咱们要在以太网上实现无损网络,就需要引入PFC(Priority-Based Flow Control)流控逻辑。

这个就需要同时在交换机和服务器RoCE网卡上,两侧同时配置PFC策略进行流控,以实现无损网络。

可见,「参数面」网络的管理,会比普通主机网络,多一份PFC调优的复杂度。而且,由于NCCL性能直接影响训练速度,所以定位NCCL性能掉速or调优NCCL性能,也是系统必须提供的运维能力之一。

并且RoCE网卡的管理,也属于“异构资源”,也需要开发Device-plugin来告知K8s如何分配这种RoCE网卡。而且GPU和RoCE网卡是需要进行联合分配的,因为硬件连接关系,必须是靠近在一起的配对一起用,如下:

因此,除了「参数面」网络设备的管理分配以外,还得关联调度逻辑来感知这个RoCE网卡的硬件拓扑。

调度

标准K8s集群的容器调度,都是单个容器独立考虑的:即取一个容器,找到其适合的节点,然后取下个容器调度。但是分布式AI训练容器不一样,它们是一组容器。这一组容器,必须同时运行,才可以进行集合通信,即所谓的All_or_Nothing。通常也会叫「Gang Scheduling」,这个是分布式AI场景的强诉求。否则会因为多个分布式作业在资源调度层面出现争抢,导致出现资源维度的死锁,结果是谁都没法正常训练。

因此K8s自带的Scheduler调度器对这种分布式AI训练中的「pod-group」型资源调度就无能为力了。这时K8s提供的「调度插件」框架,又再次发挥作用。用户可以自己开发调度器,集成到K8s集群中,实现自己的容器调度逻辑。

于是,各家又开始整活了。什么Coscheduling,Yunikorn,Volcano,Koordinator,Katalyst等纷纷上线。目的都差不多,先补Gang Scheduling基本功能,再补些MPI等辅助功能。

这里我们以Volcano为例,它除了完成分布式AI训练中「Pod-group」这种容器组的调度,还实现了容器组之间「SSH免密登录」,MPI任务组的「Hostfile文件」这些辅助实现。

小结

Kubernetes云原生管理平台,已经成为AI数据中心的标准底座。由于AI-Infrastructure设备价格昂贵(参数面一根200Gb的网线要7000元,一台8卡的GPU服务器,超150万元),所以提升资源利用率是一个收益极大的途径。

在提升资源利用率方法上,常见有(1)调度算法的增强和(2)业务加速 2种方式。

其中(1)调度增强上,又分Volcano这种pod-group组调度,来提升分布式训练的资源利用率。以及通过Device-plugin来获得vGPU算力切分或者多容器共用GPU卡的方式。

(2)业务加速路径中,也有通过分布式缓存加速数据访问的。以及通过参数面RDMA网络来加速模型参数同步的。

以上这些就是唐老师小结的,与平常使用CPU类业务的K8s集群不太不一样的地方。可见除了Kubernetes本身的复杂性外,要做好AI平台底层的各项竞争力,还是需要投入不少人力的。对云原生AI-Infrastructure有兴趣也可以多交流。



Tags:K8s   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
我们一起聊聊K8s定时备份MySQL并发送到指定邮箱
边车容器(sidecar):边车容器就是与主容器一起在一个pod中运行的容器,为业务容器赋能,共享一个网络空间,所以可以用127.0.0.1:3306连接主容器的数据库。一、背景:一开始的初衷是,想...【详细内容】
2023-12-29  Search: K8s  点击:(72)  评论:(0)  加入收藏
升级就崩溃,K8s需要LTS版本!
Kubernetes集群不是在升级,就是在升级的路上。而对于维护K8s集群的团队来说,最担心的莫过于,系统因为K8s升级而引发了服务器大规模崩溃。想象一下,K8s升级发生在某个晚上,突然某...【详细内容】
2023-12-05  Search: K8s  点击:(215)  评论:(0)  加入收藏
k8s部署维护问题汇总
集群问题系统Error: unknown flag: --etcd-quorum-read删除service 里面的相应字段start request repeated too quickly for kube-apiserver.service查看是不是有之前的进程...【详细内容】
2023-11-30  Search: K8s  点击:(193)  评论:(0)  加入收藏
五分钟 k8s 实战-滚动更新与优雅停机
当我们在生产环境发布应用时,必须要考虑到当前系统还有用户正在使用的情况,所以尽量需要做到不停机发版。所以在发布过程中理论上之前的 v1 版本依然存在,必须得等待 v2 版本启...【详细内容】
2023-11-30  Search: K8s  点击:(237)  评论:(0)  加入收藏
五分钟 K8s 实战-应用探针
今天进入 kubernetes 的运维部分(并不是运维 kubernetes,而是运维应用),其实日常我们大部分使用 kubernetes 的功能就是以往运维的工作,现在云原生将运维和研发关系变得更紧密了...【详细内容】
2023-11-27  Search: K8s  点击:(181)  评论:(0)  加入收藏
Kubernetes创始人发声!K8s在被反噬!
Kubernetes 变得太复杂了,它需要学会克制,否则就会停止创新,直至丢失大本营。Kubernetes 联合创始人Tim Hockin 罕见发声。在今年的 KubeCon 上,他建议,Kubernetes 核心维护者应...【详细内容】
2023-11-27  Search: K8s  点击:(156)  评论:(0)  加入收藏
K8s-服务网格实战-配置 Mesh(灰度发布)
在上一篇 k8s-服务网格实战-入门Istio中分享了如何安装部署 Istio,同时可以利用 Istio 实现 gRPC 的负载均衡。今天我们更进一步,深入了解使用 Istio 的功能。从 Istio 的流量...【详细内容】
2023-11-08  Search: K8s  点击:(339)  评论:(0)  加入收藏
Wasm的野心:取代K8s,不如结合K8s
作者丨B. Cameron Gain编译丨诺亚出品 | 51CTO技术栈(微信号:blog51cto)虽然WebAssembly (Wasm)已被证明在浏览器和某些有针对性的服务器部署中可以很好地工作,但允许开发人员“...【详细内容】
2023-11-07  Search: K8s  点击:(375)  评论:(0)  加入收藏
在本地 K8s 中轻松部署自签 TLS 证书
随着互联网的飞速发展,安全性日益成为我们关注的焦点。HTTPS 已从一项奢侈的技术逐渐成为现代网络交互的标准。它不仅仅是保护信息的重要工具,更是实现信任和品质的象征...【详细内容】
2023-11-03  Search: K8s  点击:(254)  评论:(0)  加入收藏
K8s-服务网格实战-入门Istio
背景终于进入大家都比较感兴趣的服务网格系列了,在前面已经讲解了: 如何部署应用到 kubernetes 服务之间如何调用 如何通过域名访问我们的服务 如何使用 kubernetes 自带的配...【详细内容】
2023-11-01  Search: K8s  点击:(230)  评论:(0)  加入收藏
▌简易百科推荐
Docker 和传统虚拟机有什么区别?
我有一个程序员朋友,他每年情人节都要送女朋友一台服务器。他说:“谁不想在过节当天收到一台 4核8g 的服务器呢?”“万一对方不要,我还能留着自己用。” 给他一次过节的机会,他能...【详细内容】
2024-03-26  小白debug  微信公众号  Tags:Docker   点击:(12)  评论:(0)  加入收藏
掌握Docker网络驱动程序:优化容器通信
Docker为在容器内包装、交付和运行应用程序提供了一个强大的平台,从而彻底改变了容器化。网络是容器化的重要组成部分,Docker提供了各种网络驱动程序来支持容器之间的通信以...【详细内容】
2024-03-22    51CTO  Tags:Docker   点击:(10)  评论:(0)  加入收藏
Containerd容器管理
Nginx 指定容器名称 使用 ctr container create 命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。容器基本操作容器基本操作主要是 ctr image 命令,查看命令帮...【详细内容】
2024-03-20  云原生运维圈  微信公众号  Tags:容器   点击:(13)  评论:(0)  加入收藏
如何基于Docker镜像逆向生成Dockerfile
引言你是否曾经遇到过一个想要使用的 Docker 镜像,但却无法修改以适应你的特定需求?或者你可能发现了一个喜欢的 Docker 镜像,但想要了解它是如何构建的?在这两种情况下,将 Docke...【详细内容】
2024-03-07  云原生运维圈  微信公众号  Tags:Docker   点击:(22)  评论:(0)  加入收藏
Kubernetes是什么?主要特点是什么?
Kubernetes是什么?Kubernetes,也称为K8s,是一个开源的容器编排系统,由Google首次开发和维护。它允许容器化的应用程序在集群中自动部署、扩展和管理。Kubernetes提供了一种容器...【详细内容】
2024-02-01    简易百科  Tags:Kubernetes   点击:(154)  评论:(0)  加入收藏
我们一起聊聊容器资源自愈
在企业实际在使用容器这类资源的时候,除了技术本身,要考虑的其他问题也会很多。企业管理的容器有千千万万,出于效率考虑,对于有特殊需求的容器如何进行批量创建和管理呢,这就需要...【详细内容】
2024-01-30  匠心独运维妙维效  微信公众号  Tags:容器   点击:(47)  评论:(0)  加入收藏
Docker与Docker Compose入门:释放你应用部署的威力
今天给大家介绍一项强大而有趣的技能,那就是使用 Docker 和 Docker Compose 来释放你的应用部署的威力!无论你是一名开发人员还是系统管理员,掌握这个技能都将为你的工作带来巨...【详细内容】
2024-01-17  waynblog  微信公众号  Tags:Docker   点击:(65)  评论:(0)  加入收藏
Docker镜像与容器的交互及在容器内部执行代码的原理与实践
Docker作为一种流行的容器技术,已经成为现代应用程序开发和部署的重要工具。在Docker中,镜像是构建和运行容器的基础,而容器则是基于镜像创建的可执行实例。Docker镜像与容器的...【详细内容】
2024-01-10  编程技术汇  今日头条  Tags:Docker   点击:(77)  评论:(0)  加入收藏
如何在 Ubuntu 上安装 Docker
使用 Docker 意味着开启一个新的计算领域,但如果你刚刚开始使用 Docker,安装可能看起来是一项艰巨的任务。在 Ubuntu 上安装 Docker 有两种推荐的方法: 从 Ubuntu 的仓库安装 D...【详细内容】
2024-01-04    Linux中国  Tags:Docker   点击:(124)  评论:(0)  加入收藏
从Kubernetes的探针到DevOps
今天在群里又看有人问如何设置 Kubernetes 的探针,感觉要补充的话太多了,结合我们在一些 DevOps 项目中痛苦的体验,今天一劳永逸的全部说完,此外,也为大家展现一下为什么 DevOps...【详细内容】
2023-12-27  云云众生s  微信公众号  Tags:Kubernetes   点击:(114)  评论:(0)  加入收藏
站内最新
站内热门
站内头条