本文分享自华为云社区《千亿模型训练—盘古β大模型》,原文作者:泰坦 。

在4月25日的华为HDC大会上, 余总和田奇老师发布了盘古AI大模型,作为参与了盘古项目的开发人员,也来凑个热闹,简单介绍一下盘古项目,如下图:

盘古大模型参与者解读盘古β大模型-LMLPHP

NLP大模型其实有两个,α和β。α已经开源gitee链接,它是基于GPT-3结构的网络,主打生成类任务。β是基于Transformer结构的网络,更擅长理解类任务,田其老师台上互动的就是β,CLUE打榜的也是β。

盘古大模型参与者解读盘古β大模型-LMLPHP

什么是大模型

  • 网络参数大

千亿参数: 100000000000*4(float32)/1024^3=381.5GB

在盘古β中, 实际参数量约为400G, 使用Adam优化器, 总参数量约为1.2T, 在2048卡训练下, 因为有一些冗余信息, 保存的ckpt实际大小为830M。

  • 训练资源大

使用数千张昇腾910训练1月以上。

  • 训练数据大

原始数据40T, 处理后数据600G。实际上最重要的是要有钞能力。

如何训练大模型

大模型的困难,实际难在工程。我们使用华为云机器学习平台ModelArts + 机器学习框架Mindspore + AI处理器昇腾910进行开发。为了支撑大模型项目,Mindspore的小伙伴开发了非常多的新特性,如优化器模型并行,管道并行等,具体信息可以查看我们总架金雪锋的答案。

下面借鉴一下立交桥跳水冠军的帖子,简单介绍一下并行技术,及盘古β如何运用它们的。

数据并行

数据并行(DP)是应用最广的并行策略,对在多个设备上部署深度学习模型非常有用。但该方法存在缺陷,如随着训练设备数量不断增加,通信开销不断增长,模型统计效率出现损失等。如下图所示,数据并行中每个分布式节点存储相同的参数(parameters),input的数据不一样。由于盘古β使用了Adam优化器,会占用非常多的静态内存,所以batch size开不大。使用数据并行,相当于扩大了batch size。

盘古大模型参与者解读盘古β大模型-LMLPHP

模型并行

单卡无法容纳全量参数, 需要把模型参数切分到每个不同的卡上。分布式节点储存不同的参数,但是他们的input往往是相同的。

盘古大模型参与者解读盘古β大模型-LMLPHP

在盘古β中,所有参数为1.2T,每张910卡实际可用HBM为31G,理论算出最少需要40张卡。由于HCCL等限制,实际最少需要64卡进行训练。可以选择32模型并行,2数据并行,或者64模型并行。

管道并行

大规模分布式训练, 计算通信耗时长. 使用管道并行, 加速训练(X2)。

前面的模型并行,只是对模型的参数进行了切分,管道并行是对网络进行切分,每张卡只创建一个子网络,再通过流水线的方式组合起来。

盘古大模型参与者解读盘古β大模型-LMLPHP

以上图为例,4个节点将5层的网络进行了切分,每个节点只创建一个子网络。节点的执行序如下图所示:

盘古大模型参与者解读盘古β大模型-LMLPHP

每个节点接收前一个节点的输出,计算完成后再把输出传递给下一个节点。当最后一个stage完成计算后,便开始计算反向,grads由最后一个节点一层层传递到第一个节点,最后完成参数更新,再进行下一个step。

盘古β由encoder+decoder结构组成,两者共用一个Embedding层。在管道并行下,需要把Embedding层从第一个stage一直传递到第一个Decoder所在的stage,在此stage对target_ids计算嵌入,再送入Decoder中进行计算。而所有Decoder都会用到Encoder的输出来计算cross attention,所以我们对Decoder做了改造,使其接收Encoder输出的同时,再把此Encoder的输出传递给下一层Decoder。

在盘古β中,我们把整个模型切分成了16个stage,最后执行速度比非管道并行快1倍。

其他小功能

容灾

由于采用大集群进行训练,难免会发生硬件,软件方面的问题,造成训练终止。我们开发了容灾功能,会把每张卡使用的参数保存成ckpt,上传到ModelArts的NAS硬盘上。继续训练时每张卡只需要下载对应的ckpt加载,便可以继续训练了。在盘古β中,从任务创建后,每台机器都需要下载完整数据集到本地,每张卡的训练进程都需要下载一个ckpt进行加载,再进行图编译,最后真正训练跑起来需要2小时左右。

弹性训练

由于资源较为紧张,项目开始仅有1024卡进行训练,当剩余资源到位后,我们调整了并行策略,然后手动拆分ckpt,再进行继续训练。

当预训练完成后,finetuen会使用128或256卡进行训练,此时又需要手动合并ckpt,再进行训练。

拆分合并ckpt需要理解Tensor在不同并行策略下的排布,及策略改变后如何变换Tensor,保证每一张卡获取到对应的Tensor切片。

训练技巧

无监督预训练

盘古β采用了Masked Language Model方法进行预训练,即在输入句子中随机mask掉15%的词,模型预测mask掉的token。

下游任务(CLUE)finetune

使用multi_task方法(无监督数据集,CLUE数据集无监督数据集,CLUE数据有监督数据集)进行第一次finetune。这里使用的是CLUE所有下游任务的数据集。如无监督数据集A条,CLUE数据集无监督数据集B条,CLUE数据有监督数据集C条。

当第一次finetune的loss达到预期后,再针对单独的下游任务,使用有监督数据集进行finetuen。

PET(Pattern-Exploiting Training)

任务转换:不再直接对label进行预测,而是预测其label description,即将其转换为完形填空形式的任务,来预测不同label description的概率,例如:

 一个样本为“context:’「天天特价房」华庭仁和国际 3室2厅2卫仅售65万’, label: ‘房产’”

转换为如下形式:

 “以下是一则 房产 相关新闻标题: 「天天特价房」华庭仁和国际 3室2厅2卫仅售65万"

分布式推理

在大部分CLUE任务中,decoder只需要推理1步,但一些生成任务会推理多步。由于图编译会把decoder的循环部分完全展开,故我们在这里进行了改造,把整个网络拆分成了Encoder+Decoder两个网络,decoder的多步推理放在python层进行。

管道并行推理比较复杂,训练时使用上千张卡,推理时仅使用32卡。训练时整个网络分成了16个stage,推理时encoder分成4个stage,decoder分成4个stage,每张卡既有encoder,也有encoder。由于管道并行网络的特殊性,只有第一个stage需要真正的输入,只有最后一个stage才有真正的输出。不同的stage是跨机器的,就需要把encoder的输出传递给decoder,这里我们创建了Send,Recv网络进行发送,接收。

最后

当前盘古β使用的mindspore有些特性是新开发的,目前还在努力开发,预计不久这些新功能就会正式合入mindspore的master,华为云ModelArts也经过了此次大模型的考验,沉淀了一些能力,将来也会上线一些大模型的新功能,请大家拭目以待。

点击关注,第一时间了解华为云新鲜技术~

05-07 16:47