百度智能云于3月9日对外宣布落地新一代高性能AI计算集群,可提供EFLOPS级算力支持,并发布新一代GPU服务器实例GPU-H5-8NA100-IB01。
3月16日,智东西公开课联合百度智能云、英伟达,策划推出「百度智能云&英伟达新一代高性能AI计算集群」线上分享会,并在B站企业号“百度智能云的朋友们”和“百度智能云”视频号,以及“智猩猩”视频号上成功进行同步直播。
百度智能云的异构计算产品经理玄凌博、资深研发工程师孙鹏、资深系统工程师武正辉,以及英伟达解决方案架构师程帅四位技术专家参与了本次线上分享会,并围绕新一代高性能AI计算集群中的技术方案和应用进行了深入剖析。
2、2006年以后,随着企业上云的大趋势,迎来了云计算的时代,并随着云服务器、弹性裸金属等产品的爆发,能够弹性按需的满足企业对IT资源的使用诉求;
3、2017年以后,随着云原生技术的成熟,像容器、微服务等技术不断的商业化落地,能够为企业提供极致弹性,云原生应用的开发架构;
企业需要极强的AI算力,来满足各个AI应用相关的开发及训练。在这个时代,云服务器厂商需要提供极致弹性且高性能AI算力,是适用于AI应用开发的云架构。
随着计算架构的不断发展,异构计算加速器通常会包含多种计算核心,来更有效率的加速特殊数据格式的计算。以NVIDIA GPU为例,通常CUDA Core是面向通用计算的计算核,能够计算几乎所有的数据格式。RT Core则是面向渲染里做光线追踪的加速单元,而Tensor Core则是面向人工智能或深度学习里做矩阵向量乘加的核心。近年来,很多国产的AI芯片也采取了类似的思路和策略,例如昆仑芯,包含拥有大量的面向矩阵做加速的处理单元。
异构计算是AI原生时代重要的算力底座。百度内部拥有大量的AI应用场景,多年的AI算力建设经验和技术积累,通过百度智能云对外提供的异构计算云服务,能够赋能千行百业。
云上的异构计算服务主要分为两种:一种是以BCC异构计算云服务器的形态,提供极致弹性、灵活、高性价比的算力规格。而搭配BBC异构计算的弹性裸金属服务器,能够做到算力的零虚拟化损失、百分百服务于客户业务,提供极高性能的算力,且满足部分客户对安全隔离性的要求。
百度智能云支持丰富的异构加速卡的型号,支持英伟达最新的安培架构计算卡,也提供自研的加速芯片昆仑芯。在高性能的异构计算上,用户可以在分钟级创建以往可能花费需要数月来构建的InfiniBand集群环境。
在产品命名上,主力产品的实例规格族和异构卡类型是一一对应的,比如GN5通常会支持英伟达安培架构的卡,GN3会支持上一代的架构,像V100、T4等。在实例规格的搭配方面,实例根据GPU的一些物理规格,例如显存、SM等,经过了合理CPU、内存配比。针对部分的异构计算卡也提供了像vGPU的实例,能够提供更具性价比的计算算力和渲染算力服务。
在面向AI应用爆发的时代,异构计算产品也在不断打磨,推出新的产品特性。除了业界对云服务的一些通用要求,像运维及弹性按需之外,百度智能云也深耕GPU虚拟化技术,通过透传、GPU分片以及多容器共享等技术,能够更好的提高客户对资源的利用率。在硬件层面上,也是百度智能云投入的重点,陆续推出了自研的AI芯片、AI架构服务器,即X-MAN,以及云上高性能的网络组网方式,目的是能够不断提高AI全栈的负载计算效率。
不同GPU的型号都有不同的定位,面向计算的GPU,比如AI推理、训练或者HPC的型号,通常会在双精度浮点FP64以及半精度FP 16上做一些特殊的加强。有些GPU则会支持更多的应用场景,例如A10,有更多的CUDA Core和RT Core,在渲染场景也有很好的性能,提供更强的单精度算力。
除了计算单元,显存也是一个很重要的参数。A100和A30都是支持HBM的。对于一些访问密集型的计算,HBM显存会有更强的性能表现。此外一点是GPU的P2P能力,PCle这一代在双向带宽上可以做到64GB,而支持NVLink的计算卡,比如A100、V100,能够在GPU P2P上有进一步的能力提升,像最新的NVLink 3.0,可以做到双向600GB的量级。
除了英伟达的卡,昆仑芯也来迎来了第二代。第二代的昆仑芯在性能上都有了全方位、大幅度的提升,比如在通用性以及各个规格的算力,工艺也从13纳米到了7纳米。除了性能的提升,也集成了ARM核,可以更好的适用于一些边缘计算场景。此外,也考虑到了分布式的典型AI应用场景,昆仑芯也可以支持K-Link这种高速P2P能力。如果客户在云上突然对虚拟化有一些诉求,昆仑芯可以在物理上支持虚拟化。在软件的适配性上,提供了更友好的开发环境,支持C和C++编程。
本次讲解的重点话题是云上的高性能计算集群,以往企业搭建一套高性能计算集群,需要投入极高的人力成本和数月的时间成本。而大部分客户使用高性能计算,追求的是极高的业务时效性。使用百度智能云可以分钟级获取到一套高性能的异构计算实例,也就是利用最新发布的高性能H5系列,来组建高性能集群,这套实体也是基于X-MAN架构来对外提供服务。
在计算效率上,数据的访问效率及通信效率都进行了硬件层面的升级与增强;在配置上,标配了业界最高规格的配置,比如英特尔铂金系列CPU,全闪存的本地盘,还有和GPU 1:1配比的InfiniBand网卡;I/O设备可以直连A 100 GPU,这样可以通过GDR、GDS加速GPU读取I/O设备的访问效率。
在集群分布式的AI训练中,往往会有一半的时间用于GPU节点之间做梯度交换,而在交换时则会造成计算资源的闲置或浪费,影响了整个模型的收敛效率。那RDMA的高性能网络,可以极大的降低节点之间的时延,而InfiniBand作为天然支持RDMA的通信协议,有极强的性能表现。InfiniBand对比传统TCP IP协议,对时延有极大的提升。
从实际模型的训练表现来看,以BERT的训练为例子,高性能计算H5对比云上普通的A100,在单节点上差距并不明显,但在整个集群训练中,即便是4节点的小规模计算集群,高性能计算H5也可以带来近2倍的吞吐性能。更高的吞吐意味着模型收敛时间可以进一步降低,一个小时的训练任务可以缩短到接近半个小时,成本可以节约近50%。
那么如何更有效率的发挥硬件的性能?百度在去年推出了百度百舸AI异构计算平台,除了高性能H5这些计算实例外,也推出了AI容器、AI存储,进一步能提高GPU工作效率和作业效率,像AI存储可以提供百万级IOPS和百万GB吞吐的能力,可以进一步的提高训练数据读取效率;AI容器则提供多种调度以及GPU增强能力,比如AI作业调度、集群管理能力,并且提供GPU容器虚拟共享。
最近,业界有一个很大的趋势是训练规模越来越大的模型。从GPT-3开始,模型已经被推到了千亿参数量的维度。从2020年到现在,各个厂商也在不断推出更大参数量的模型,比如OpenAI的GPT-3、Google的Switch Transformer,百度去年也先后推出了多个大模型,像ERNIE 3.0 Titan,它是全球最大的中文单体模型。
现阶段大模型还会成为一个逐渐演进趋势,比如可以类比人脑,通常认为人脑中有861亿个神经元,每个神经元大概有7000多个突触,近似的做一个类比或代换,大概有60万亿的参数规模,约是GPT-3模型参数量的300多倍。现在的模型规模离人脑的通用智能还有很大差距,这会是一个值得持续投入和研究的领域。
文心大模型可以在NLP领域支持多个任务,包括歌词续写、旅行问问、剧本生成、对联续写等。举个简单例子,输入文本“7月11日准备去青海,该准备怎么样的服装”,文心大模型会根据训练过的模型数据自动生成一段对话:“如果是自己去,要准备好衣服、雨衣、帽子、墨镜、手机、相机,还有一些生活必需品,如手表、相机、雨衣、防晒霜、太阳伞、洗发液等。这些是在青海的基本必需品。”,结果看起来比较符合真实场景,也比较符合人类智能,这就是用大模型的实际感受。
同时,大模型不仅业务效果好,而且对业务还会产生很多的收益,比如随着模型规模越来越大,业务训练过程中的损失会越来越低,而且呈Power-law的趋势。并随着参数规模的倍数增长,Test Loss会线性下降,这也带来了一个启发:可以用大模型的方式提升整体业务的训练效果,或整体业务在线上的效果。
除此之外,研究人员还发现大模型可以通过小样本在其他领域取得很好的效果,不需要像原来一样,对每个业务场景都重新训练一遍,而是先拿一个大参数的预训练模型,结合特定领域的小样本做finetune,可以很快完成业务的迭代。而从一定程度上也反映,它其实是一种更接近通用智能的方式。
虽然大模型有很多好处,但大模型训练会很难,那究竟多难呢?比如有3000亿条词语,需要1750亿的参数,这样的模型计算量大概是420ZFLOPS,其中1 ZFLOPS是1024 EFLOPS,1 EFLOPS又是1024 PFLOPS,这是一个非常大的数量级。也有论文分析,对于这么大的参数、这么多的样本,用1024张A100卡,也需要月级别才能完成训练,这对整个训练和技术架构的挑战都是非常大的。
百度智能云现在做的就是如何在大规模参数情况下完成高效稳定的持续训练。模型训练需要这么多的参数,也需要很多的计算资源,因此需要搭建一个集群来支撑整个训练。
有集群建设经验的同学可能知道,搭建一个集群并非易事,这个过程会有很多不同的选择,比如单机该如何选,训练卡是什么样,训练卡内部的互联方式是什么样,多机之间又应该如何架设网络保证它们之间能高效通信,网络规模又需要是什么样的,这些都是在集群建设中很关键的问题。
要解答这些问题,必须深入整个理解大模型训练的过程和模式。所以接下来会结合现在业界比较主流的几种大模型训练方式,对它进行展开和剖析,看看完整的训练一个大模型需要什么样的计算、通信和过程。
先来看下业界比较主流的混合并行的模式,混合并行是指什么?先来做一个简单的数学计算题,在当前的大模型下,假设以1000亿参数为例,每个参数需要占4个字节,是FP 32的数据类型,因此仅对于这个参数来说,就需要400G左右的存储空间。对比市面上最大的计算卡,一张卡可能只有80G,像NVIDIA A100,在400G到80G之间存在一个很大的GAP,尤其是包含了其他的一些梯度等中间变量之外,GAP会变得越来越明显,所以无法简单粗暴的像以前一样把一个模型塞到一张卡里,然后通过纵向扩展数据卡来提升训练效率,而是一定要把模型做切分。
目前,大模型通常都是BERT类模型,BERT类模型的特点是不断的堆叠Transformer层,这种堆叠天然的带来一些切分的策略和方式。业界通常有几种切分策略,如BERT模型中的两个Transformer层,这两个Transformer层之间会有前后的依赖关系,即在第一层计算完之后,把计算结果传送到第二层再开始计算,这就带来了一种切分的可能性,就是按层切分,
把这种每层切分的方式叫做流水线并行,因为层与层之间可以认为是流水线的过程,先把第一层计算完,然后再流水的计算第二层。
除此之外,再观察每一层内部,在大模型的环境下,MatMul参数会特别大,导致其中的矩阵张量都会很大,在一张卡上计算会比较慢,那如何加速这个过程呢?可以把模型中的张量一分为二,一部分卡负责其中的一部分计算,它们之间的额外代价需要进行一些通信操作,这种切分由于是把一个张量一分为。