2023年7月5日,阿里云弹性计算团队与智东西公开课联合出品的系列课程【阿里云弹性计算技术公开课】正式播出,当前系列课程共分为七节,阿里云高级开发工程师于子淇作为第三位课程主讲人,带来了主题为《如何利用GPU云服务器加速AIGC训练》的课程分享,本次课程同步在阿里云官网、钉钉视频号、阿里云微信视频号、阿里云开发者微信视频号、阿里云创新中心直播平台&视频号等多平台同步播出。
阿里云GPU云服务器提供GPU加速计算能力,能够实现GPU计算资源的即开即用和弹性伸缩。同时,配备阿里云自研的弹性RDMA网络,可以实现秒级的大规模RDMA组网,满足大模型计算过程中海量数据的高效传输需求。面向开发者,阿里云还推出了AI计算部署工具FastGPU,使开发者无需关注计算、存储、网络等资源的部署操作,即可达到简单适配、一键部署、随处运行的效果。
【完整课程直播】
本篇文章根据于子淇的课程整理而成,供读者阅览:
大家好,我是来自阿里云弹性计算团队的高级开发工程师于子淇,本次给大家分享的内容的主题是:如何利用GPU云服务器加速AIGC训练,这个分享比较偏向于实践,重点会讲一下神龙AI训练加速套件AIACC 2.0在大模型上的优化案例。
一、LLM模型的实现原理以及典型模型
现如今大模型和AIGC是比较火的话题,拥有较大的使用场景,比如通义千问、ChatGPT、智能对话机器人等等,这些是能够产生实际落地价值的,更贴进大众的生活,所以大模型会是未来AI发展的一个主航道。
提到AIGC,全称是AI Generated Content,是指AI内容生成,本质上是一种生成式AI。它所覆盖的范围比较广,包括LLM,即大语言模型。从广义上来讲,大语言模型就是从大规模数据集上进行自监督训练,参数量级在10亿、百亿甚至更多。这种语言模型训练任务可以分为以下两个部分:
· Pretrain:大量数据提取共性特征,作为不同场景的基础模型,它的定位是通用性,对训练资源要求比较高,也是各大公司想要实现通用基础模型的必要途径;
· Finetune:少量数据适应特定领域模型,它面向的是下游任务,定位在于特定性,这个在目前这种大语言模型场景下对训练要求也很高,也是各个公司希望基于自己已有的基础模型和特有数据集,做定制化产业升级和创新应用开发的实现方式。
LLM模型实现的架构包括encoder和decoder,由上图右侧结构图所示,这是目前主流的大语言模型的发展方向。左边子图是encoder only的结构,比如传统的bert模型;中间子图的是encoder-decoder,也就是最原始的transform base的模型,比如T5模型;右侧子图是decoder only的结构,这个模型结构应用比较多的场景,比如Open AI始终坚持的GPT、ChatGPT以及Meta实现的LLaMA等等。从上图右侧树图能够看出,主流的架构趋势是decoder-only。
说到大语言模型,不可避免的话题就是扩展性的问题。这个扩展性可能会有多个维度,包含数据集和模型的参数量。横坐标是模型的参数量规模,纵坐标是模型的精度、表现能力,按照之前的扩展定律来看是近似线性的,这个也好理解,参数量越大,模型越准确,但最新的研究表明,在有一些任务上,模型在没有达到阈值规模之前,效果接近于随机,而达到阈值之后,性能大幅提高,也就是规模越大,才真正解锁了大语言模型的潜在能力,比如具体在10B-100B提升最明显。到此为止,我们总结为,大模型参数在10B+的参数量级,也就是百亿以上。
接下来我们来看下具体的训练细节。
模型的实现,主流是基于transformer-base的decoder-only架构。如上图右侧所示,这个是Google提出的标准transformer-base模型,即encoder-decoder,但前面提到大多都采用decoder-only架构,也就是红色框部分。
因为训练效率上来看decoder-only只有一半的模型架构,所以在效率和工程实现上都是较优的,比如encoder-decoder还需要做复杂的数据切分,无法满足通用的大语言模型训练;在任务效果表现上zero-shot的自监督训练(即无任何tuning数据)decoder-only也是表现最好,并且数学推导来看decoder-only一般为三角阵,三角阵是满秩的,表达能力更强。
在并行策略上往往是我们做训练重点关心的地方,有多种并行方式,比如数据并行DP、DDP、DeepSpeed-zero123,张量并行TP、流水并行PP,不同的切分会决定不同的通信方式,比如DDP主要是allreduce;主流框架包括DS、FSDP/megatron、colossalAI等。
开源的模型有很多,LLAMA、chatGLM、GPT3等,比较火的当属LLaMA了,下面是Llama-13B+zero3的训练方式,多个GPU之间不在是传统的单个allreduce集合通信了,而是换成了allgather和reduce-scatter,因为本质上这两个算子的组合就是等价于一个allreduce算子,因为zero3的并行切分,拆解为2个通信算子之后,中间冗余的parameter、gradient、optimizer-states等buffer的冗余占用就可以释放,从而达到降低显存的效果,满足中大模型的承载能力,提高整体的吞吐性能。
当然,虽然看起来zero主要是做了显存的优化,但变相提高了计算效率,这就带来较大的通信压力,通信占比在2机场景下达到30%以上,对于传统的TCP/IP的网络来说压力会很大,容易成为性能瓶颈,降低GPU利用率。
这就是大语言模型其中一个痛点,那么如何降低这种通信瓶颈呢?下面将介绍阿里云eRDMA的GPU实例。
二、基于阿里云eRDMA的GPU云服务器
eRDMA也就是elastic(弹性)RDMA。通过下图我们看一下RDMA的技术演进。
如左侧图所示,传统TCP/IP涉及到多层数据包的解析,需要走CPU进行数据搬移,这个会带来较大延迟,降低带宽表现。传统TCP/IP网络较慢,可能影响不大,但现在网络提速之后,CPU的overhead就不可忽略了。
中间的图是RDMA的实现方式,应用层可以通过网卡直接完成数据搬移,bypass了用户态和内核态的切换以及CPU搬移,只需要CPU发起数据通信的请求,由RDMA的engine来完成数据通信,CPU只是被告知完成,从而大幅提高通信性能。
eRDMA特性包括:
· RDMA的生态兼容,无需修改任何代码,二进制兼容,通过标准的verbs API即可调用;
· 超大规模组网能力,支持10万级别VM组网以及跨AZ组网;
· 基于ECS的VPC网络,能够满足极致的弹性和多租户隔离。
从硬件角度的一些指标来看,带宽200Gbps、时延最低8µs、吞吐30M message/s。
硬件架构上,为了满足大模型transformer-base对计算和承载能力的要求,GPU采用80GB的8卡A100,单机内部为nvlink600GB/s的高速带宽,节点间走eRDMA互联,能够提供最大2x100G带宽,并且实现跨socket均衡,即单机内部每4张GPU卡共用100G带宽;当然200G是EBS/VPC/ERDMA融合后共享带宽,所以实际分到的数据流带宽会小一些。
上图是AI训练场景的典型架构,eRDMA位于底层通信链路,对上层应用提供无感加速能力,比如在nccl的场景下,无需任何修改,自动适配eRDMA通信协议。
下图是eRDMA实例相比传统64G VPC机型的性能提升,可以看到性能提升是比较明显的。整体带宽提升了一倍,延迟降低了80%。
右边的数据图是ebmgn7ex相比ebmgn7e 4机训练性能提升比例,提升比例也很明显。
三、FastGPU一键部署LLaMA流程以及finetune原理解析
这部分将介绍一键部署LLaMA流程,也就是前面提到的大语言模型及finetune原理解析。
FastGPU是一款针对阿里云IaaS资源的快速管理工具,可以将环境部署时间大幅缩短,变相节省了GPU资源的费用,面向各类开发者提供IaaS资源的易用性,可以提高开发者的效率。具体的细节就是从用户使用角度,通过FastGPU管理集群,或是控制当前集群的一些资源创建和释放等等,感兴趣的话可以在阿里云官网上查看了解。
上图为一键部署的流程。通过FastGPU一行命令,完成集群的创建、环境部署、LLaMA模型训练以及推理服务构建的流程,这里是演示作用,因为A100资源较为紧缺,所以使用的是V100实例。两张图分别是baseline性能以及使用了AIACC之后的性能,从吞吐量来看AIACC性能提升40%,具体AIACC是什么我们后面再展开。
访问推理服务,只需要打开浏览器输入本地的某个端口服务即可,因为FastGPU已经内部实现了IP白名单+端口转发到本地的功能,通过快速试用方式来大幅降低大模型的使用门槛。
下面分享LLaMA流程细节。
LLaMA是META提出的对标OpenAI的ChatGPT的开源版本,提出的背景就是通过模型的性价比去降维打击。所谓模型性价比就是参数量和训练tokens的关系,右边这个图是实验验证扩展性的特点。汇总下来LLAMA提出的2个角度:
· 一个是训练质量保证,需要通过匹配最佳的数据集和模型大小来满足scaling扩展定律;
· 另外一个容易忽略的点,就是推理效率,降低模型参数量,通过更大的训练时间来保证相同的精度效果,从而推理时候可以在更小的模型上来降低推理部署的成本。
LLaMA的模型结构,其实是基于transformer-base的实现,吸取了不同模型实现的优化点,比如RMS预先归一化(即在norm的输入层进行归一化而非输出层)、swiglu激活、RoPE旋转嵌入替代绝对编码。
所以LLaMA模型核心部分可能是通过完备的扩展性去实现模型效果的提升,最终LLaMA的效果上是比较惊人的,相比GPT3的175B模型,LLaMA-13B基本持平GPT3的效果,而参数量只有不到十分之一,即便是7B也不会比GPT3差太多。
那么具体finetune是如何进行呢?
Finetune主要是一种小样本训练,在zero-shot、few-shot场景下进行的,本质上就是减少人工标注的语料,简单理解为自监督或无监督训练,下游任务有常识推理、问答、阅读理解、数学推理、代码生成等等。
finetune有多种类别,比如prompt-tuning为每个任务拼接emb层来训练emb;prefix-tuning利用MLP多层感知机来训练;p-tuning引入LSTM训练等等。
上图主要以LLaMA系列的alpaca模型为例,Alapca是斯坦福提出的,使用self-instruction进行微调。所谓的self就是指通过已有的强大的语言模型生成指令数据,然后进行全量finetune训练。
Alpaca是通过OpenAI的GPT3.5生成了52k的训练数据,具体如上图右侧所示。
从self-instruct集合中生成175个由人类撰写的高质量指令-输出pair对,主要是规范一些期望输出的模版,然后这些作为种子集合输入到达芬奇03版本模型,生成更多的指令;最后就是把生成的52k高质量的数据用于LLaMA,做有监督的finetune训练,生成最终的Alpaca模型。
本质上self-instruct就是让更高级的大语言模型去调教新模型,来达到“听话”的效果。
下面看一下推理的实际效果。
上图是开源的WebUI对话界面,这是没有finetune训练之前的基础LLaMA模型效果,输入的问题是你作为一名老师,教我如何学习人工智能,回答如右框所示,可以看到他的回答第一句就是不理解teach教学这个词的意思。这个就是原始模型在大规模语料下可能会存在的问题,生成结果文不对题,也就无法正确的生成结果。
接下来我们看finetune之后的结果,相同的问题,回复内容的确是像老师的口吻直接讲学AI的价值和课程重要性,效果较为符合预期。
具体的AIGC一键部署可以参考阿里云AIGC试用的文档,里面介绍了基于阿里云GPU云服务器快速搭建各种不同的AIGC应用,比如stablediffusion文生图、LLaMA指令微调等超多应用。
欢迎大家快速部署体验,可以直接浏览器搜索“阿里云AIGC GPU试用”这几个字即可进入。
四、基于AIACC的性能优化及效果展示
接下来分享AIACC的加速原理。
我们团队之前在AIACC1.5的版本拿过DawnBench竞赛的四项世界第一,训练部分性能最快,成本最低。还有推理同学拿到了推理性能最快、成本最低的奖项。
目前更新为2.0版本,下图是AIACC-Training 2.0的架构,主要包括ACSpeed通信优化以及AGSpeed计算优化。
上图分割线上方为通信优化,ACSpeed实现为模块化的解耦设计,在兼容性、适用性和性能优化方面全面升级,从AI框架到nccl runtime以及协议栈侧均实现为plugin或者backend的方式,从而实现无感IaaS+的中间件支持。
下面是AGSpeed计算优化,主要针对pytorch动态图特效,实现计算图编译优化,这里也分为compiler的前后端,前端实现动态到静态图的转换,后端实现pass/tensor等编译优化,从而加速训练的计算过程。
通信优化的背景是,分布式训练在多机场景下的通信带宽成为训练瓶颈。因此ACSpeed实现c10d-plugin、nccl-runtime的方式进行无感优化分布式训练,针对阿里云VPC网络基础设施在分布式场景下进行深度优化,并且针对CIPU提供网络层增强,即前面提到的eRDMA实例,传统使用IB网络的方式较为繁琐,包括GID、HCA等设置,通过nccl-plugin极大增强了易用性,目前已经集成到eRDMA大包驱动内部,用户可以完全无感使用eRDMA的网络能力。
上图框架图上画的有Pytorch和TensorFlow不同路径,主要是因为使用Pytorch客户较多,所以针对Pytorch做了定制的优化,可以一行代码修改快速优化DDP以及FSDP等不同的训练方式,对模型侧无感,即便不是Pytorch,底层都是基于NCCL做通信的话也都可以直接走第二层nccl-runtime以及nccl-plugin获取纯通信优化。
目前算法层面实现了常用的allreduce、allgather、reduce-scatter、reduce等集合通信算法的优化版本,极大提升在阿里云GPU实例下的性能表现。
接下来是AGSpeed计算图的编译优化。
AGSpeed计算图编译优化,主要背景也是Torch的火热程度,所以我们针对Pytorch进行计算图的定制优化,增强前后端覆盖度,保证训练e2e功能和性能。
· 前端引入并优化Torchdynamo graph catch机制/通过online autotune保障覆盖度和SLA的鲁棒性;
· 后端引入并优化Nvfuser、inductor等多种optimizer,通过plugin方式增强编译优化性能。
上图是AIACC2.0的性能优化结果,左边是单独开启ACSpeed的性能,相比DDP提升5-150%;右边是单独开启AGSpeed的性能,相比Pytorch提升5-50%。
如果是单独只使用nccl-runtime以及nccl-plugin的通信优化,性能SLA主要是nccl-test,是经典测试GPU多机多卡通信的benchmark,下图展示的是allgather算子在两机eRDMA机型下的性能提升,在30-100%,在端到端场景下会根据不同通信占比进行折算。比如在某实际客户的某A100机型的2机场景下,Llama13B + zero3的模型实现,集合通信使用的是allgather+reduce-scatter算子,通信压力较大,通过一行代码import aiacc后即可使能AIACC优化,集合通信部分替换为aiacc_allgather和aiacc_reduce_scatter算子,最终端到端的llama13B训练性能提升37%。
最后介绍下AIACC2.0的加速套件官网链接,里面有IE的一些套件文档,欢迎大家试用,可以在相同实例的情况下达到更优的性能。
想要关注更多精彩直播/观看课程回放的同学,可以扫描下方海报中的二维码/点击链接,均可观看。