作业帮董晓聪受邀出席2024软件技术大会并做主题
作者:[db:作者] 日期:2024/12/24 17:10 浏览:
新一轮科技反动跟工业变更迅猛开展,人工智能等新技巧蒸蒸日上,跟着年夜模子等新技巧被深刻利用到企业的多个营业场景,不只企业的数据成为了企业开展的新型主要出产因素,软件技巧的翻新利用作为新质出产力的主要构成局部,也在承当着更为主要的汗青任务,在减速本身技巧变更的同时,也赋能千行百业,为中国经济的新一轮开展助力。12月13-14日,由中科软科技股份无限公司举行的年度技巧嘉会——“2024软件技巧年夜会”在北京朗丽兹西山花圃旅店胜利召开。功课帮基本架构担任人董晓聪受邀缺席并以《云原生助力AIGC开展》为主题停止报告。董晓聪从回想功课帮云原生建立的全貌开端开展,再讲到AIGC时期下,云原生怎样助力时期开展,授与会者带来了一场极具代价的技巧盛宴。以下是经由收拾后的报告内容:各人好,很愉快加入本次技巧峰会。先做下毛遂自荐,我是董晓聪,当初在功课帮担负基本架构担任人,担任功课帮的架构研发、运维、DBA、保险相干的任务,同时也是腾讯云TVP、阿里云MVP。明天跟各人分享的主题是云原生助力AIGC的开展。本次分享会分红三个局部,第一局部来讲下CPU时期的云原生建立,一方面来看下云原生建立的全貌跟功课帮的建立过程,另一方面咱们在这个进程也总结了一些教训,为接上去AIGC时期的建立供给了助力。第二局部来讲下云原生怎样助力AIGC,从2022岁尾OpenAI推出ChatGPT以来,海内外的良多公司都在AIGC这个范畴连续发力。功课帮也不破例。这旁边除了在算法下面临一系列挑衅外,基本设备也是一样的。基本架构在这方面停止了一系列的建立,上面也会具体开展来讲。最后就是对将来的瞻望,除了云原生有更多助力AIGC的点外,AIGC的开展也会反哺云原生,告竣协同退化的后果。先来看第一局部,CPU时期的云原生建立。功课帮建立于2015年,是一家努力于用科技手腕助力普惠教导的公司。功课帮的重要技巧近况能够演绎为两点,范围化跟庞杂化。范围化是指功课帮线上的效劳数目比拟多,无数千个。这么多的效劳对应了数万的效劳实例,而这么多的效劳实例又是跑在数十万盘算中心之上,全部范围比拟年夜。庞杂化是指功课帮的技巧栈比拟多元。晚期营业以PHP为主,但java、C++、python在一些场景也有普遍的利用。厥后跟着技巧的演进,Golang、Nodejs的应用也越来越多。以后Golang已成为应用最多的编程言语。功课帮从创立之初就base在云盘算之上,厥后也因为一系列起因终极抉择了一套多云的架构。云原生实质上是用基本设备去接收营业傍边的大批非功效逻辑。在我看来,云原生是企业处理本身品质、保险、本钱、效力的最短门路。云原生架构的全貌是怎样样的?年夜的架构能够分红资本层跟利用层。资本层,包括盘算存储收集这些IaaS实体。盘算的话就是种种百般的CPU、GPU。存储的话包括块存储、文件存储、工具存储等。收集包括的实体就会更多。利用层就是种种编程言语写的效劳模块。咱们后面提到的种种成绩此中很年夜一块是由于资本层跟利用层耦合招致的。以docker+k8s为代表的容器技巧经由过程容器镜像、功课编排、功课调理、资本治理实现底层资本对下层利用的通明。下层利用想要跑得更快,还须要一层微效劳管理系统。微效劳管理系统以效劳的通讯为基本,包含效劳的注册发明、效劳感知、流量管控等。面临这么宏大的一集体系,19岁尾咱们对营业停止容器化改革,对PHP、Golang、Java、Python等言语制订尺度的镜像、编排模版,以及在框架层面做了一系列的功,以帮助营业的容器化改革,终极经由过程一年半的时光实现95%效劳的容器化改革。咱们在21年开端对功课帮APP的中心体系、检索体系停止容器化改革。检索体系是一个有状况的体系,对稳固性跟机能请求极为刻薄,咱们经由过程应用fluid+jindoRuntime实现其容器化改革。再之后咱们还对中心体系RTC实现了容器化改革。在改革的进程中咱们发明k8s原生的调理器并不智能,一方面是由于其数据源较为单一,仅为request跟limit,无奈获取更多及时的指标;另一方面调理战略也偏简略。以是咱们基于k8s插件机制做了自界说调理战略,经由过程战略的完美,实现了团体负载的晋升。功课帮跟别的互联网营业一样,也有显明的波峰波谷。咱们经由过程自界说调理将年夜数据离线任安在波谷时调理到在线集群,年夜年夜晋升了集群的均匀应用率。有了容器化跟自界说调理器这两个基本,咱们可做的事件就更多了。向下咱们开端年夜范围的应用serverless。实在serverless的利用进程也不是一挥而就的,也是一个逐渐灰度的进程,咱们也阅历了从准时义务、一般web利用,再到中心体系的进程。以后功课帮的检索体系跟RTC体系有30%-90%是跑在serverless之上。在效劳管理这块做的事件比拟多,这里就挑两个来讲下。咱们经由过程自研service mesh,年夜幅度优化了机能,进而实现了90%的效劳笼罩。以后咱们不只拦阻了入向流量,也拦阻了出向流量,不只拦阻了RPC流量,也拦阻了数据存储流量,给营业带来品质、保险才能的年夜幅度晋升。在效劳观察范畴,咱们自研了日记体系,较开源计划有较年夜的本钱优化,约为ELK计划1/10-1/20的本钱。而后基于这些才能之上,咱们建成了一套多云的架构。终极获得的收益也是很显明的,在品质方面,效劳的SLA从99.95%晋升到99.99%,之以是能有如许的晋升,重要得益于观察的笼罩以及毛病自愈才能。观察方面,各人都晓得笼罩度越高,对成绩分型跟定位的辅助就越年夜,然而困扰笼罩晋升的重要要素就是本钱。功课帮在这块做了大批技巧优化,不只是自研体系,trace中还应用Clickhoust调换ES,metric停止了超时数据的降准处置等等。终极使得本钱在一个公道范畴,实现100%的笼罩。毛病自愈方面,k8s的NPD能够主动摘出疑似毛病的呆板。Readyness接口也能够实现利用层面的毛病摘流。以及在数据库层面功课帮也实现了主动扩容等自愈手腕。本钱方面,得益于容器技巧,这多少年咱们实现累计单价70%的降落。以及每一核的CPU有更高的应用率。效力方面,咱们经由过程容器、service mesh等云原生技巧能够很好的落地。举个例子,处于保险的请求,咱们不盼望研发晓得数据库的账号、暗码,以及在效劳中恣意的拜访外部效劳。当初经由过程service mesh的流量管控能够很好的实现,运维效力也失掉年夜幅度的晋升。我记得在20年终的时间有运动,流量天天都在增添,事先还不实现容器化改革,只能天天夜里运维初始化呆板,研发安排顺序,QA验见效果,效力比拟低,以及品质也不高。而当初这个操纵只要要数分钟就能够实现。再有就是机型调换的速率,我记得在21年咱们调换容器的一款主力机型,从intel到AMD,仅须要两周就实现了。云机房的迁徙速率也失掉年夜幅度晋升。功课帮数千个效劳及对应的数据存储,咱们用三个月就能够实现迁徙。以及全部进程中基础不须要营业研发参加,仅做好功效的验收即可。最后是保险方面,得益于云原生技巧,主机、收集、数据保险方面的才能也失掉年夜幅度的晋升。上面讲下第二局部,云原生助力AIGC。进入AIGC时期后,咱们碰到的挑衅产生了很年夜的变更。起首是资本散布的成绩。之前咱们能够请求云厂商在北京的机房供应充分的CPU呆板,但AIGC时期则不是。尤其是在23年的时间,全部GPU资本的争抢非常重大,进而招致资本极端的疏散,机房数目也年夜年夜增添。第二个是推理的本钱太高了,从同等的本钱来看,1000核CPU能够效劳数百、数千个用户。然而1张A800的卡只能支撑个位数的QPS。须要连续的停止技巧优化,把推理本钱降下去,才干使得营业ROI适合。年夜模子晚期缺乏相干的Devops标准,良多时间是在呆板上手动操纵。这块也持续完美,持续一套齐备的Devops系统。年夜模子时期,算力、算法、数据是企业的中心资产,年夜模子文件更是这些的结晶,咱们须要对模子文件做好保险加固。最后一个是一个小点,但对研发效力的影响很年夜。差别于CPU代码,年夜模子文件动辄百G起,散发耗时较长。再叠加上第一个要素,天下各地的散布式机房,很有可能宣布一次,须要数个小时的同步时光。面临这么多的成绩,功课帮基本架构重要停止了这三方面的建立,同一资本调理、DevSecOps、异构算力收集。先来停止同一资本调理的先容,对营业研发而言,盼望有自力的资本池。如许能够最年夜水平保证效劳稳固,防止其余营业线的烦扰。但这个对企业而言却不是最优解,不论是资本供应仍是资本应用的方面,只有把各方放到一个同一的资本池,才干实现资本应用的最年夜化。但这个须要有一个资本切分以及强断绝的技巧,有了这个才干保障共享场景下各效劳的稳固性。对CPU而言,这个技巧就是cgroup+namespace,但GPU是缺少的。只有有了资本共享的技巧,才干进一步优化调理战略,不论是分时复用、在离线混部、应用弹性资本等,终极实现资本应用率的晋升。这所有的要害还在于GPU共享的技巧,咱们先来看年夜模子顺序是怎样运转的。最下面的是咱们年夜模子的利用顺序,上面是咱们应用的种种推理框架,如TRT、Vllm等,这些框架都是基于cuda生态的。全部cuda生态不只包括cuda类库,另有下层的runtime API、底层的driver API。Cuda层再之下就是内核驱动跟硬件层。良多GPU虚构化的技巧会抉择在cuda停止代办,经由过程对义务的调理实现相似cgroup的时光片逻辑。举个例子,一张卡上跑着A、B两个效劳,分辨应用0.8卡跟0.2卡的资本。那么A、B两个效劳在1s内就分辨被调配了800ms跟200ms的义务运转时光。假如B效劳在这个周期的义务运转时光超了,比方到210ms,那么鄙人一个周期就停止处分,只容许运转190ms。经由过程这种方法,能够在一个绝对长的周期内有较好的切分后果。但cuda这一层义务的粒度偏年夜,有些义务运转时光较长。假设B效劳有一个义务须要300ms才干运转完。那在一秒内就超越了限度,会抉择一些处分办法,如下一秒扣100ms,只让B效劳运转100ms,毛刺后果就会特殊激烈。那么该怎样来解,让咱们再往下看下,内核这一层义务粒度更小,个别在多少毫秒。在这块停止代办能够实现更为精准的时光片逻辑。各家云厂商均实现了相似后果,功课帮经由过程跟各家云厂商配合,就实现了精准的GPU共享才能。有了效劳断绝才能后,下一个就是自界说调理才能。自界说调理有两块基本,决议数据获取跟基本调理战略。决议数据这块,只经由过程request limit这些静态指标远远不敷,咱们经由过程promethues做及时指标收罗,不但有node、GPU卡的种种监控信息,还经由过程service mesh获取效劳运转信息,有了这些数据就能够停止更精准地调理。调理重要有两种战略,重叠跟平铺。平铺是将多个pod打散安排到多台node多张卡上,重要实用于单个效劳的多个实例安排,防止单卡毛病后对效劳影响过年夜。重叠是将多个pod只管安排到一台node乃至一张卡上,重要是针对差别效劳的pod实例,用于晋升资本应用率。有了这些基本才能后咱们来看下详细的利用场景。起首是在线效劳的调理,全部的营业都基于一个资本池,做种种HPA的战略。HPA战略包括手动、auto、Cron等方法。因为GPU资本很难有像CPU那样的Buffer池,更多是针对差别营业的应用时光来做cronHPA的战略。经由过程差别营业之间的复用,有千卡级其余资本节俭。固然做了差别营业的分时复用,但全部在线集群仍是有显明的波峰波谷,这时就须要在波谷时把离线义务调理到在线集群。AIGC的离线义务重要有种种离线推理义务、多模态的练习义务。差别离线义务对资本的应用情形是纷歧样的,比方一些练习义务对整台node CPU、GPU资本应用比拟机制,再调理前就须要先探测集群内资本情形,若不充足的资本,就会发动重调理,已实现全局最优的重叠后果。对应用资本未几的离线推理义务,经由过程GPU共享技巧跟在线营业复用GPU卡资本,当离线义务实现盘算后,须要将效劳从node上清退,来开释占用的显存、磁盘资本。功课帮以后有浩繁GPU在离线混部。功课帮也在踊跃应用弹性的GPU资本。Serverless有两种技巧选型,函数盘算跟虚构节点。从营业易用性角度动身,功课帮抉择了虚构节点计划,对营业效劳而言调理到一般节点仍是虚构节点,后果都是一样的。Log Trace Metric等观察信息也实现了对齐。以后功课帮弹性资本刚开端跟云厂商摸索,约有百卡级其余资本应用。经由过程这一系列操纵,年夜年夜下降了GPU推理的本钱。上面我讲下DevSecOps,聊这个之前起首要明白一个成绩,年夜模子效劳的模子文件算什么?是代码情况,仍是数据。这个成绩直接决议咱们抉择什么样的散发计划。代码情况,望文生义,像研发用Golang、PHP等编程言语写的代码、代码依附的设置、基本镜像等。走的是镜像散发的形式;数据对应的存储方法就比拟多样,既可存在专门的数据存储组件,MySQL、Redis,也能够应用共享文件体系NFS。功课帮检索体系的容器化也是将数据卸载到JindoRuntime如许的散布式缓存体系。这套计划在年夜模子练习中也普遍利用。那么年夜模子推理该抉择什么样的计划呢,从名义上看数据文件范围个别较年夜,模子文件是合乎这个特点的。然而从实质来看,模子文件不会随营业范围扩展而扩展,以及须要较强的版本治理才能,基于此咱们认定模子文件为情况的一局部,应当抉择镜像散发的流程。在全部DevOps流程中咱们应当做什么呢,从代码编写到编译、测试、定版、宣布以及线上运维这个完全周期中。全部进程中CI/CD局部比拟庞杂,前面会具体来说。这里先先容下其余局部。编码这块,基本架构供给了cg平台,可一键天生名目,此中包括基本镜像、推理框架、云原生套件。云原生套件包含尺度日记输出、readyness接口、配套的service mesh等。测试这块,GPU作为比拟昂贵的资本,不会在测试情况预留,但出产情况跟测试情况有收集保险域断绝。这里就须要应用DMZ做授信的买通,进而实现保险严厉性跟营业机动性的均衡。监控这块,各人会发明GPU的监控锯齿状显明,不像CPU监控比拟腻滑。效劳畸形时跟异样时差别不年夜,功课帮经由过程ServiceMesh能够更无效察看效劳的状况。上面来讲下CI/CD的流程。在CPU时期,当地实现代码的编写后提交到远真个Git Server。Git Server绑定了钩子,提交会触发CI Server对commit编译为镜像,而后再推送到威望镜像堆栈harbor傍边。如许就实现CI流程。当研发点击安排按钮时触发k8s集群安排。K8s集群会先从docker-registry中拉取镜像,若docker-registry中不存在,再从其上联的harbor中拉取,终极实现安排操纵。年夜模子文件归入DevOps的第一挑衅是文件太年夜,无奈上传到Git。这块应用Git LFS,Git年夜文件存储技巧来处理。模子文件直接从泉源——练习呆板上传。Git提交时候成两段提交,模子文件提交到lfs体系,指针文件提交到Git,两者之间有映射关联。实现提交后也是一样的镜像编译进程。安排假如再比及研发手动点击,就会将等候时光进一步拉长。以是这块做的第一个优化是当镜像上传到harbor后k8s集群就会运转一个job来提前拉取镜像,做到镜像文件的预热。后面提到过功课帮的推理集群散布在多个云多个region,这块给镜像散发带来了挑衅。多集群之间散发很天然会想到P2P技巧,这个可极年夜晋升传输效力。但该计划有必定庞杂性,成绩排查难度偏高。以是这块集群散发咱们应用的是工具存储的DTS,简略牢靠,也能够在较短时光内实现传输。最后咱们在镜像传输的环节也做了切分,减速全部情况。经由上述的优化,百G文件的散发咱们能够从6个小时,收缩80%,下降到45分钟阁下,年夜幅晋升了研发效力。但这所有还不停止,咱们还要在DevOps全部进程中做到端到真个加密,实现真正的DevSecOps。这块咱们鉴戒之前管理敏感数据的KMS计划,抉择对年夜模子文件也停止加密处置。详细做法是在练习呆板的pre commit阶段增加钩子,提交前先对模子文件停止切分,切分红中心文件跟非中心局部,中心文件个别多少十MB,而后对中心文件近程获取密钥停止加密,再将这加密的中心文件跟未加密的非中心文件一同提交Git,再经由编译跟安排这些阶段,终极模子文件都落到k8s集群中。此时年夜模子效劳是无奈读取此类文件的,有三种解法。第一种,是对全部的年夜模子工程停止修正,在代码逻辑中实现解密跟兼并这些逻辑,但如许的影响面过年夜。咱们一开端抉择的是第二个计划,在年夜模子顺序运转前,先履行init顺序,将加密的中心文件解密,再跟非中心文件兼并成原始的模子文件,如许年夜模子顺序就能够畸形辨认了。该计划固然处理了成绩,但存在多少个弊病。一是全部流程波及多个文件操纵,耗时较长,约30分钟。另一个是如许模子文件就会在磁盘中落地,违反了咱们端到端加密的准则。以是咱们优化到第三个计划,咱们hook了体系文件读取函数。当读取到年夜模子文件时,咱们在这一次函数挪用中先读取加密的中心文件解密后输出,再读取非中心文件停止输出。全部操纵都是内存中,既保险牢靠,耗时也收缩到11分钟。至此实现了年夜模子DevSecOps的系统。咱们来看异构算力收集。在CPU时期,功课帮出于对稳固性的极致寻求,终极建成了一套多云的架构。多云架构有浩繁技巧选型,如主备多云,只把另一个云做成存储的备份。又或许营业切分多云,将差别的营业单云安排到差别的云厂商。面临这么多选型,功课帮终极抉择了多活多云的计划。多活计划是稳固性跟本钱的最优解之一,但庞杂性也是最高的。整套架构的流程是用户的流量经由过程DNS/DoH依照必定比例指到各个云的流量进口-网关,网关再转发到详细的微效劳,再往下就是微效劳之间的彼此挪用。为了可能实现单云闭环,要在每个云厂商安排全部的效劳,以及效劳与效劳之间应用svc的挪用方法。但这个仍不克不及100%避免墒增,且在一些特别情形下仍须要停止跨云通讯。比方某种资本只在一个云独占,又比方某个效劳在单个云呈现异样,须要紧迫止损。以是须要一套既保障断绝的严厉性又有必定机动性的计划,就是如斯的抵触。功课帮经由计划,终极告竣了如许的后果。咱们在CPE装备上设置ACL,从收集层实现了强割裂,拒止差别云利用效劳的流量,做到严厉性。但经由过程货色向网关如许的基本组件,容许受权的效劳停止跨云通讯,以此就做到了机动性。当单边云机房呈现毛病时,咱们只有把流量切到另一边,就能够疾速止损。整套架构是比拟幻想的。但到了GPU时期就产生了变更,咱们的CPU效劳仍是安排在北京的差别云机房,但GPU效劳散落在天下各地,良多机房也不专线内网纵贯。营业不得不抉择应用公网域名通讯的方法,自愿把货色向通讯酿成了南北向通讯。原有的注册发明机制也被攻破了,机房观点对营业不再通明。营业须要晓得卑鄙的GPU资本详细散布在哪个机房,有几多容量,而后停止挪用。假如卑鄙呈现资本的变更,GPU云机房产生变更了,上游营业还须要共同停止调剂。以及走公网的情形下,保险跟机能等方面也每每存在成绩。保险方面,一旦营业的鉴权做的欠好,就会呈现年夜模子效劳被刷的危险。机能方面,衔接池保护欠好的情形下,每次都要从新树立TCP衔接、TLS衔接,耗时被年夜幅度增添了。基本架构发明这个成绩后,对货色向网关停止了进级,酿成了全新的集群间mesh-k8s mesh计划。要告竣的目的是从新让安排信息对营业通明,如许才干排除耦合。营业效劳拜访年夜模子效劳仍应用svc域名的方法,详细实现计划是在集群CoreDNS这块做文章,对缺省的效劳,剖析到k8s mesh。K8s mesh晓得跨集群的注册发明信息,而后会在差别集群间寻到最适合的流量门路。对有年夜模子效劳的云机房,其入向流量也是先由k8s mesh承接。由于流量的中间都是咱们可控的效劳,咱们能够自签加密方法,处理了保险性。又经由过程自界说辞书的方法,年夜幅度紧缩跨集群的数据传输包,最多可实现50%的紧缩率,年夜年夜晋升了传输机能。整套计划的基本框架就实现了,在进程中也呈现了新的变更,比方往年云厂商在咱们原有的北京region又能够供给一局部L20、H20。对年夜模子效劳能闭环在一个机房确定是更幻想的计划。但因为年夜模子效劳在以后机房不再缺省,走CoreDNS的计划就走欠亨了。这块咱们基于service mesh拦阻出向流量,在这块从新界说了流量路由规矩,优先散发到本机房内的效劳,假如无奈承接再走k8s mesh的跨集群散发。以上就是基本架构以后做的重要建立了,对于将来瞻望我是这么想的。云原生能助力AIGC的方面还远远不发掘透辟,跟着营业推理范围的停止晋升,会有更多新的技巧。在机能优化这个方面,前一段时光看到月之暗面的mooncake分别式架构,以及针对kv cache的store计划。前面功课帮也会深刻摸索下。另一方面,咱们来聊下AIGC对云原生的反哺感化。不晓得明天有几多同窗是做基本架构的,有几多同窗是做营业研发的。不晓得各人有不发明这么一个趋向,跟着云原生的深刻,营业研发越来越聚焦到营业,越来越多的非功效逻辑由基本设备来承接。分工越来越明白。但在基本架构职员稳定的情形下,单团体力支持的基本效劳也越来越多。这种情形下很轻易触发人力缺乏支持变差的恶性轮回。此前咱们应用了一些偏治理偏协同的计划,为营业线的架构师赋能等等,见效个别。而年夜模子的呈现给了咱们处理成绩新的思绪。不论是AIops 成绩的根因剖析,仍是智能客服 能主动解答一些征询成绩。盼望能再经由过程半年阁下的完美,到达一个更幻想的状况,也盼望来岁能够给各人来报告咱们新的停顿。以上就是我明天分享的全体内容,感谢各人。
申明:新浪网独家稿件,未经受权制止转载。 -->