Press "Enter" to skip to content

中文稀疏GPT大模型落地,通往低成本&高性能多任务通用自然语言理解的关键里程碑

1. 概述

 

GPT 模型能较好的处理 NLP 各个应用领域的任务,比如文本分类,推理,对话,问答,完形填空,阅读理解,摘要,生成等等。百亿 / 千亿参数量级的 GPT 大模型作用在这些应用领域虽然效果很好,但是训练成本非常高。以 OpenAI 推出的 1750 亿的 GPT-3 为例,在 1024 张 A100GPU 上预估需要 34 天,一万亿参数的 GPT-3 在 3072 张 A100 显卡上也至少需要 84 天;微软 / 英伟达联合推出的 5300 亿的 NLG 模型,在 2048 张 A100 显卡上耗时了 3 个月的训练时间才能达到比较好的收敛效果。基于 MoE 的稀疏化训练是目前最具竞争力的降本途径。另一方面,GPT 稀疏大模型在中文领域的效果还没有得到实际的验证,能否有效处理中文超多分类任务,口语化表达的中文推理或者情感分析任务,都是我们亟待探索的课题。综上所述,我们的工作是探索基于稀疏 MoE 结构的 GPT 模型在中文任务上的性能上限,同时把大模型训练成本压缩到极致,仅在单机 A100 硬件支持下就能将百亿参数大模型训练成熟。

 

继去年使用 Transformer Encoder 大模型取得中文小样本学习、英文预训练模型知识量度量双冠后,今年阿里云又在中文语言理解权威评测基准 CLUE 的中文零样本学习权威榜单 ZeroCLUE 上取得冠军。我们将大模型技术能力向前推进了一大步。基于 MoE 稀疏结构,仅用一台 A100 就把 160 亿参数量级的多任务通用 GPT 模型训练成熟。此次刷榜的模型是阿里云机器学习 PAI 团队推出的 GPT-MoE,这也是业界推出的首个稀疏的纯 decoder 架构模型在 zeroclue 上登顶。这是通往低成本且高性能多任务通用自然语言理解的关键里程碑。

 

 

MoE 的全称是 Mixture of Experts,其中的 Expert 对应的是 Transfomrer 模型的 FFN 层,在训练的时候从多个 FFN 中选取一部分 FFN 进行激活。这意味着模型可以在不增加计算强度(FLOPS/Bytes)的情况下,通过增加 FFN 的数量进而增加模型参数量级来提升模型在下游任务上的性能。采用 MoE 后的稀疏 Transformer 模型和同等质量的稠密模型相比有 5 倍的吞吐性能提升,如下图所示。我们在稀疏架构总体设计的时候,选择让 MoE 跟纯 Transformer Decoder 架构的 GPT 进行有机结合。原因是 MoE 跟 Decoder 结合效果通常会好于跟 Encoder 的结合效果。具体来讲,Encoder 是通过随机 masking 的方式学习语言模型,而这种被随机 masked 的 token 会让 expert 的路由选择出现不均衡。另一方面,考虑到 Decoder 类的 GPT 模型比 Encoder 类的 Bert 模型有更广泛使用场景,因此我们采用 GPT+MoE 的技术架构路线。

 

 

2. 算法 & 工程技术解读

 

算法方面我们提出了一种更加高效稳定的稀疏路由均衡器,基于 Prompt 的领域话术再适应的零样本学习以及中文中文复杂任务定向优化。工程方面我们训练了工业级中文 BPE 分词器,微调过程中的工程优化,大模型训练加速平台 Raidformer 等等,下面为大家一一详细解读。

 

打造工业级中文 BPE 分词器 & 高质量预训练数据集

 

中文每个字都有独立的意思,可以利用复杂多变的自由组合来表达多种含义,如果 GPT 的词表依旧采用 Bert 那种按字分词的策略,这无形中极大增加了 GPT 语言建模的难度。比如下面这个例子,“道”字可以衍生出意义完全不同的三个词:道德,道理,道歉。根据 “道” 字左边的上下文信息推测其右边的字难度还是比较大的。

 

 

我们需要构建一种性能鲁棒的中文分词工具,它能够从大规模语料中按照上下文统计特征提炼出中文单个汉字构成的大颗粒度词组。我们决定采用先进的 BPE 算法来尝试做到这点。我们使用的 Sentencepiece 工具在 5 亿条高质量中文语料上训练了一个星期产出了一个 5w 词表量级的中文 BPE 分词器。另外中文超大规模语料的选择也有讲究,去年我们使用 PAI 数据集就能把 13 亿的 Bert 模型训练成熟,今年我们尝试了更大的 WuDao2.0 数据集,大概是 PAI 数据集的十倍。原始 WuDoa2.0 数据集质量还是不太符合要求的,我们按照去年对 PAI 数据集的清洗过程,重新对原始的 WuDao2.0 数据集做了清洗,生成了一份相对高质量的 WuDao2.0 数据集。我们在数据集和分词器上做了一些消融实验,结论如下:

 

1.    精选后的 wudao 数据集比精选的 PAI 数据集(只有 wudao 量级的十分之一)在验证集 loss 上要小,同时在 TNEWS 和 EPRSTMT 等下游任务指标要高。

 

2.    5 亿条句子训练出来的 BPE 分词器比 1 亿条句子训练出来的 BPE 分词器在验证集 loss 上有 0.02 的降低,同时在 TNEWS 和 EPRSTMT 下游任务指标有小幅提升。

 

强化型稀疏路由均衡器

 

MoE 概念最早出现在 2017 年的 ICLR[1]上。它的基本概念十分简单,在前向传播的时候动态地从多个 FFN 中随机选择一些执行运算,从而达到参数扩充的效果。后续一系列论文 [4][5][6][7][8][9] 也都是围绕设计稀疏路由均衡器展开。

 

真正将 MoE 带到工业级发扬光大的是谷歌公司的 GShard[2]和 Switch Transformer[3]。其采用 top-1 路由机制。每个 Expert 根据如下的 softmax 函数被赋予一个概率值,取概率最高(top-1)的那个 Expert 当作网络的 FFN 层。其中 W_r 是做路由选择时需要学习的参数。

 

我们作出的改进是对 Expert 路由选择也就是到 token 到 FFN 的映射模块进行强化。让该模块在做映射路径选择的时候更加保持平衡。我们通过大量的消融实验发现了一种性能更好更稳定的稀疏路由均衡器 Large-Margin[10] Router。其在 Transformer 中的功能位置如下图所示:

 

 

采用 Large-Margin Router 后可以看出 validation loss 的下降十分明显,同时下游任务的提升的效果也提升不少。

 

 

刷榜采用的模型参数配置如下所示:

 

 

领域话术再适应的零样本学习

 

我们仅使用一台 A100 机型就能拉起 160 亿量级的稀疏 GPT 大模型的训练。这种低成本的训练环境,允许我们通过继续预训练或者微调来能进一步释放 GPT 大模型的能力,让其在各个 NLP 任务中发挥更大的价值。

 

继续稀疏预训练的再适应损失函数

 

训练 GPT 大模型使用的超大规模中文数据集 WuDao2.0,其话术风格偏向正式的用语风格。而 ZeroCLUE9 个任务中有六个任务是口语化的风格,两个任务是是科技论文风格。这两种风格是大模型没有见过的,因此需要通过学习更多特定领域的陈述表达方式让大模型去适应新的话术风格。具体来讲,当基础大模型训练成熟后,我们对每个任务或者多个相似任务进行继续预训练,最后对每个任务执行无监督零样本学习。如下图所示:

 

 

我们使用 CLUE 官方提供的未标注的任务语料来学习风格话术。对 loss 函数设计是总的 loss= 上下文 loss + 提示语 loss + 伪标签 loss+MoEloss。示例如下:

 

其中上下文和提示语的 loss 使用 GPT 训练语言模型标准的负对数最大似然,伪标签 loss 使用 Masked LM,MoE loss 和预训练保持一致。同时通过相关系数调节各个 loss 之间的贡献比例。

 

寻找最优中文提示语及其答案

 

提示语和对应答案的设计对 zeroshot 的性能影响非常大。以 EPRSTMT 情感分析任务为例,我们发现使用 “满意 / 不满意” 比使用 “负面 / 正面” 效果好不少。提示语中加上评论两个字毫无作用,这跟我们的直觉貌似有些不一致。需采用更为通用的提示语:“这句话表达的是”。下面是我们通过实践总结出来的比较好的提示语和答案。

 

 

备注:CHID 任务不需要提示语和答案

 

单机环境优化训练显存 & 超大体积大模型加载

 

我们在使用 160 亿参数大模型做继续预训练的时候面临两个非常大的工程挑战

超大容量 ckpt 导致单机无法加载
原始数据 on the fly 继续预训练显存消耗更大导致无法继续预训练

160 亿稀疏 GPT 大模型需要占用 2T 的内存空间才能加载进来,经过探索尝试,我们最终用 NVME 挂载来扩充虚拟内存的方式解决了该问题,幸运的是我们使用的 A100 机型 NVME 空间很大。命令如下所示:

 

 

更为致命的是我们发现 160 亿参数的大模型按照和基础预训练同样的训练加速 & 降显存配置加载进来显存就 OOM 了。OOM 的主要原因是由于采用了 on the fly 的数据加载方式以及更为复杂的反向传播。得益于 Rapidformer 引擎良好的用户接口设计,我们发现打开 zero-stage-2 开关同时限制 number workers 个数可以执行继续预训练。这样做存在一个负效应就是基础预训练和继续预训练的优化器存在不一致,不过影响在可控范围内。

 

攻坚中文超多分类任务 & 复杂推理任务 & 关键字识别任务

 

中文超多分类任务

 

榜单中有二个很困难的超多分类任务,是英文任务中从来没有遇到过的。众所周知,GPT 模型擅长做生成类的任务,BERT 模型擅长做识别类的任务。IFLYTEK 和 CSLDCP 是识别类的任务且类别超多,类别数过多导致 likelihood-ranking 的性能下降,直接使用 ZeroShot 的精度很低。

 

 

为了提升超多分类问题的精度,我们首先对这些叶子类目进行归纳整理,抽象出一级类目出来,比如:

 

 

接着在执行 loglikehood-ranking 的时候先在一级类目范围内进行粗排,接着在叶子泪目范围内进行精排。采用这样一级泪目辅助的精细化排序后,这三个多分类任务平均有 4 个点左右的提升。

 

复杂推理任务

 

这两个任务的难点在于口语化,句子短。即使进行领域话术再适应,也很难在几个 epoch 内让 160 亿大模型的风格迅速适配过来。

 

 

我们将 CMNLI/OCNLI/BUSTM 的无标签数据混合在一起进行联合领域自适应,采用同样的 Prompt 设计,进行联合推理。执行多任务数据混合后在 OCNLI 和 BUSTM 的平均分有 5 个点的提升。

 

关键字识别任务

 

 

起初我们认为这个任务不行是 prompt 的设计有问题,后来通过大量的实验我们发现使用 log-likelihood-ranking 推理准则没有使用 perplexity 推理准则有用,部署 perplexity-ranking 后有将近 7 个点的提升。

 

大模型训练加速工具 Rapidformer

 

Rapidformer 的定位是为 Transformer 模型库提供大模型大数据量的训练加速能力。这是通过有机整合微软的 DeepSpeed,英伟达的 Megatron 以及 Meta 的 FairScale 来做到的。如下图所示:

 

 

下图对比了 Rapidformer,Megatron,DeepSpeed 三者之间的加速能力差异,Rapidformer 融合了 Megatron 和 DeepSpeed 的各自的优点,提供了一个统一的训练环境。

 

 

基于 Rapidformer,我们可以通过加速开关的组合,来找到最优的吞吐。下面我们用 130 亿参数的 GPT-MoE 大模型为例,介绍下如何寻找最优的吞吐加速策略组合。130 亿稀疏模型的参数配置如下:

 

 

我们用到的训练加速核心技术包括:

 

激活检查点(Activation Checkpoint)在神经网络中间设置若干个检查点(checkpoint),检查点以外的中间结果全部舍弃,反向传播求导数的时间,需要某个中间结果就从最近的检查点开始计算,这样既节省了显存,又避免了从头计算的繁琐过程。

 

梯度累积 (Gradient Accumulation)  以 batch_size=16 为例,可以每次算 16 个样本的平均梯度,然后缓存累加起来,算够了 4 次之后,然后把总梯度除以 4,然后才执行参数更新,这个效果等价于 batch_size=64。这是一种有效的增加 Batch Size 的方法。通过该策略可以将每个 step 的 batch size 扩充到很大,结合 LAMB 优化器会提升收敛速度。

 

混合精度训练(Mixed Precision Training)采用混合精度训练的好处主要有以下两点:1. 减少显存占用,由于 FP16 的内存占用只有 FP32 的一半,自然地就可以帮助训练过程节省一半的显存空间。2. 加快训练和推断的计算,FP16 除了能节约内存,还能同时节省模型的训练时间。具体原理如下图所示,核心是在反向传播参数更新的时候需要维护一个 FP32 的备份来避免舍入误差,另外会通过 Loss Scaling 来缓解溢出错误。

 

Zero 显存优化器  ZeRO(The Zero Redundancy Optimizer)是一种用于大规模分布式深度学习的新型内存优化技术。ZeRO 具有三个主要的优化阶段分别对应于优化器状态,梯度和参数的划分。

 

●    优化器状态分区(Pos) :减少了 4 倍的内存,通信容量与数据并行性相同

 

●    增加梯度分区(Pos+g) : 8x 内存减少,通信容量与数据并行性相同

 

●    增加参数分区(Pos+g+p) :内存减少与数据并行度和复杂度成线性关系。

 

所有吞吐实验都采用 sequence length=2048,Global Batch Size=256,通过下表我们发现当在 local DDP 环境下,打开 Activation Checkpoint,关闭 Zero-stage-2,8 步梯度累积每步消耗的时间是最少的,吞吐也是最高的。同时显存也得到了充分的利用。

 

 

3. 使用示例

 

本次刷榜使用的 160 亿参数的中文 GPT-MOE 稀疏大模型及其 ZeroShot 应用已在 EasyNLP(https://github.com/alibaba/EasyNLP)中开源,详情请见链接。具体使用方式如下所示:

 

首先通过如下的命令拉起 EasyNLP 专属镜像并创建容器,里面已经安装了 Rapidformer 及其全部的依赖库。

 

 

然后下载中文版的 GPT-MOE 模型,注意需要在硬盘上预留 2T 的存储空间同时需要通过 swap 设置 2T 的内存空间。

 

 

接下来就可以开始针对每个任务执行继续预训练了,在 run_finetune_gpt_moe.sh 脚本中已经通过开关打开了必要的训练降显存加速技术比如:Activation Checkpoint 和 Zero-stage-2。从 CLUE 官网下载无标签的训练数据,然后打上伪标签,注入进大模型中开始进行任务话术领域再适应。

 

 

训练完成后保存 ckpt 就可以执行针对特定任务的 Zeroshot 推理了,使用如下的推理脚本。

 

 

4. 总结

 

在这次中文 ZeroCLUE 刷榜评测中,我们围绕中文百亿稀疏 GPT 大模型落地挖掘了以下核心技术:

 

●    基于 large-margin 的稀疏路由均衡器比传统 Top-1 均衡器效果更好更稳定。

 

●     针对 160 亿参数稀疏大模型的领域话术再适应算法以及工程底座经刷榜检验是可靠的。

 

●    提升了中文超多分类问题和复杂推理等问题的零样本学习任务效果。

 

●    大模型训练加速工具的可靠性进一步得到了验证。

 

后续在 EasyNLP 中还会陆续放出更多高质量的大模型,敬请期待。

 

参考文件

 

[1] . Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer

 

[2]. GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding

 

[3]. Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity

 

[4]. BASE Layers: Simplifying Training of Large, Sparse Models

 

[5]. Hash Layers For Large Sparse Models

 

[6]. TAMING SPARSELY ACTIVATED TRANSFORMER WITH STOCHASTIC EXPERTS

 

[7]. GLaM: Efficient Scaling of Language Models with Mixture-of-Experts

 

[8]. Unified Scaling Laws for Routed Language Models

 

[9]. Designing Effective Sparse Expert Models

 

[10]. Large Margin Deep Networks for Classification

Be First to Comment

发表回复

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