摘要:盘古 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 也经过了此次大模型的考验,沉淀了一些能力,将来也会上线一些大模型的新功能,请大家拭目以待。
作者:华为云开发者社区
链接:https://juejin.cn/post/6959381082651230239
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
共同学习,写下你的评论
评论加载中...
作者其他优质文章