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

摘要:盘古NLP大模型有两个,α和β。α已经开源gitee连接,它是基于GPT-3结构的网络,主打生成类任务。β是基于Transformer结构的网络,更擅长理解类任务。

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

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

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

什么是大模型

  • 网络参数大

千亿参数: 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。
image.pngspa

模型并行

单卡没法容纳全量参数, 须要把模型参数切分到每一个不一样的卡上。分布式节点储存不一样的参数,可是他们的input每每是相同的。
image.png

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

管道并行

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

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

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

每一个节点接收前一个节点的输出,计算完成后再把输出传递给下一个节点。当最后一个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也通过了这次大模型的考验,沉淀了一些能力,未来也会上线一些大模型的新功能,请你们拭目以待。

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

相关文章
相关标签/搜索