Press "Enter" to skip to content

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

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

 

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

 

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

 

 

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

 

 

什幺是大模型

网络参数大

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

 

 

模型并行

 

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

 

 

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

 

管道并行

 

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

 

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

 

 

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

 

 

每个节点接收前一个节点的输出,计算完成后再把输出传递给下一个节点。当最后一个 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,即将其转换为完形填空形式的任务,来预测不同 labeldescription 的概率,例如:

 

​ 一个样本为“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 也经过了此次大模型的考验,沉淀了一些能力,将来也会上线一些大模型的新功能,请大家拭目以待。

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注