CPM-Ant模型介绍

作者:OpenBMB
2022-09-16 11:41:13

总览

CPM-Ant是一个开源的中文预训练语言模型,拥有10B参数。它是CPM-Live直播训练过程中的第一个里程碑。训练过程是低成本和环境友好的。基于增量微调(delta tuning)方法,CPM-Ant在CUGE基准测试中取得了优异的结果。除了完整的模型,我们还提供各种压缩版本以适应不同的硬件配置。CPM-Ant相关代码、日志文件和模型参数在一个开放的 许可协议 下完全开源。具体来说,CPM-Ant具有如下特点:

  • 计算高效 BMTrain 工具包让我们能够充分利用分布式计算资源的能力以高效训练大模型。CPM-Ant的训练持续了 68 天,花费了 43 万人民币,这远远低于现有模型训练的成本。训练CPM-Ant的温室气体排放量约为4872kg CO2e ,而训练T5-11B的排放量为46.7t CO2e [1]。
  • 性能优异OpenDelta 工具让我们能够非常方便地通过增量微调将CPM-Ant适配到下游任务。在我们的实验中,CPM-Ant仅仅 微调了6.3M参数 就在3/6个CUGE任务上取得了最好的结果,这一结果超越了其他全参数微调的模型(如CPM2微调了11B参数,源1.0微调了245B参数)。
  • 部署经济BMCookBMInf 工具包让我们能够在有限的计算资源下驱动CPM-Ant。基于BMInf,我们能够替代计算集群在 单块GPU上进行大模型推理 (即便是一块GTX 1060这样的消费级显卡)。为了使CPM-Ant的部署更加经济,我们使用BMCook进一步将原始的10B模型压缩为不同的版本。 压缩后的模型(7B,3B,1B,300M) 能够适应不同低资源场景下的需求。
  • 使用便捷。 不管是原始10B模型还是相关的压缩版本,通过几行代码就能够轻松地加载与运行。我们也会将CPM-Ant加入到 ModelCenter 中,对模型的进一步开发会变得更加容易。
  • 开放民主 。 CPM-Ant的训练过程完全开放。我们将会发布所有的代码、日志文件和模型存档并提供开放获取。CPM-Ant也采用了允许商业化的开放 许可协议

模型架构

CPM-Ant的模型架构是基于我们之前的工作 [2,3] 开发的,这里我们进行简要的介绍。关于模型的更多细节,欢迎访问我们的 GitHub 上。


预训练目标

CPM-Ant利用空白填充和文本生成作为其预训练目标。如下图所示,空白填充和文本生成都是以自回归的方式进行的。为了为这两个目标构造自监督数据,我们采用了两种掩码(masking)策略:一种是掩蔽输入的最后一部分词元(token),用于文本生成;另一种是随机掩蔽输入的词元,用于空白填充。掩蔽率遵循均匀分布U(0,1)。对于每个样本,我们将以50%的概率随机掩蔽输入来进行文本填充,或以另50%的概率掩蔽最后的词元来进行文本生成。

文本生成任务

空白填充任务


预训练软提示

在CPM-Ant中,我们引入了一些预训练的软提示来切换模型模式。对于空白填充和文本生成,我们分别设置了相对应的软提示。这些软提示由几个可学习的向量(embedding)组成。在预训练过程中,这些软提示被添加到输入中,激发特定训练目标的知识来处理输入。在为下游任务适配CPM-Ant时,只有与任务相关的软提示被用于微调CPM-Ant。关于预训练软提示的更多细节,请参考论文 [4]。

在文本生成任务中添加软提示


多段式机制和统一建模架构

由于我们希望CPM-Ant能够对各种下游任务具有足够的通用性,我们没有使用Transformer的原始编码器-解码器架构,而是采用了一个统一的模型架构,同时对上下文和生成的词元进行编码,通过修改注意力掩码的方式来控制生成过程

其中 M 是注意力掩码,⊙是Hadamard积。类似的统一编码器架构已经在前期工作中证明了其简单性和有效性 [5,6]。

为了使训练更加稳定,我们在模型中使用了如下的Pre-LN Residual结构。


多段机制和相对位置偏置

我们将CPM-Ant的输入切分成若干个段,每个段都用来承载特定的信息。具体来说,软提示、空白填充数据和文本生成数据分别归属于不同的段。之前的工作 [7] 表明,只对绝对位置进行编码的策略无法捕捉到词元之间的相对距离。我们采用多段式机制来组织CPM-Ant的数据。具体来说,对于第i个词元,我们额外分配了一个位置编码pi.和段编码si.。有了这两个编码,我们就可以计算出相对位置偏置。

这里B是在注意力层中使用的偏置矩阵,fsi,sj (·)用于将词元之间的相对距离映射为偏置值。直观地说,多段相对位置偏置可以充分考虑段的相关性来编码相对距离。在CPM-Ant中,为了简单起见,如果两个词元不属于同一个段,无论它们的相对距离是多少,我们都会分配一个统一的偏置值 bsi,sj

预训练细节

训练CPM-Ant具有很大的挑战,这里我们将介绍预训练过程中的一些细节。从5月29日到8月5日,我们完成了CPM-Ant的训练,历时68天。

我们总共使用了32块NVIDIA A100 40G GPU来训练CPM-Ant。在预训练开始时,我们只使用了8块GPU,在6月7日增加到了32块。

我们从11T原始语料库中选择了200G高质量的中文数据来预训练我们的模型,其中包含了大约50B的词元。由于训练一个10B的模型需要大约200B的词元 [8],这些预训练数据被遍历了4次。

BMTrain and Model Center 的帮助下,预训练过程总共花费了43万人民币,这只是谷歌训练T5-11B模型约130万美元费用的1/20。

训练CPM-Ant的温室气体排放量约为4872kg CO2e,而训练T5-11B的排放量为46.7t CO2e。


整个预训练过程共经历了6次中断。

  • 6月6日13:20 - 6月6日16:10:我们升级了GPU驱动。
  • 6月7日00:30 - 6月7日17:20:我们使用更多的GPU进行预训练,从8个增加到32个。
  • 6月10日17:40 - 6月12日02:20:一个计算节点崩溃,同时我们也升级了模型。更多细节可以参考 6月12日的日志
  • 6月14日21:00 - 6月15日11:50:磁盘空间不足导致数据读取异常,从而引发内存不足的错误。
  • 6月16日08:30 - 6月16日12:10:一个节点崩溃。
  • 6月19日09:10 - 6月19日16:10:CUDA内存不足错误。在重启训练后,该问题没有再发生。
  • 在6月10日至12日期间,我们引入了一个bug,导致模型每次都从头开始读取数据。这个bug在6月22日被发现并修复。这个bug的“副作用”可以从损失函数曲线上看出来,每当模型学习到最开始的数据时,训练损失就会变得很低,因为模型已经见过这些数据很多次了。

为了让大家更好地跟踪预训练过程,我们在 GitHub仓库 记录了每天的训练日志。


CPM-Ant增量微调

我们使用参数高效微调,即增量微调(delta tuning)[9],来评估CPM-Ant在六个下游任务上的性能。 具体来说,我们在实验中使用了LoRA [10],它在每个注意层中插入了两个可调整的低秩矩阵,并冻结了原始模型的所有参数。使用这种方法,我们为每个任务只微调了6.3M的参数,仅占总参数的0.067%

特别地,我们在实验中采用了LoRA [10],它在每个注意层中插入了两个可调整的低秩矩阵,并冻结了原始模型的所有参数。使用这种方法,我们为每个任务只微调了 6.3M 的参数,仅占总参数的0.067%

OpenDelta的帮助下,我们在不修改原始模型的代码的情况下进行了所有的实验。需要指出的是,在下游任务上评测CPM-Ant模型时,我们没有使用任何额外的训练数据。实验结果如下表所示:

可以看到在仅微调极少参数的情况下,我们的模型在三个数据集上的性能已经超过了CPM-2和源1.0。同时我们也发现,有些任务(例如LCSTS)在微调参数极少时可能会比较难以学习。不过别担心,表中展示的仅为中间实验结果,而CPM-Live的预训练方式还在不断更新,我们期待进化后的模型在使用delta tuning时能在下游任务上有更好的性能!


CPM-Ant模型压缩

由于原始的CPM-Ant有10B参数,该模型在一些低资源场景下可能无法工作。因此,我们将CPM-Ant模型压缩成几个参数较少的版本。这些压缩的模型包括CPM-Ant-7B/3B/1B/300M。而所有这些模型压缩尺寸都可以对应于现有的开源预训练语言模型的经典尺寸。

考虑到用户可能会在我们发布的检查点上进行进一步的开发,我们主要使用针对注意力层(attention layer)和前馈层(feedforward layer)的任务无关的结构化剪枝来压缩CPM-Ant。剪枝过程也是渐进的,即从10B到7B,从7B到3B,从3B到1B,最后从1B到300M。在具体的剪枝过程中,我们将训练一个动态的可学习的掩码矩阵,然后用这个掩码矩阵来裁剪相应的参数。最后,根据掩码矩阵的阈值修剪参数,该阈值是根据目标稀疏度确定的。

修剪后的模型如下表所示:


压缩细节

学习掩码参数

为了压缩CPM-Ant模型,我们通过学习一个掩码来决定哪些参数是需要被修剪的。具体来讲,我们为每一个潜在的被修剪对象分配一个分数,该分数从一个硬具体分布(hard concrete distribution[11, 12])中采样得到。这些潜在的被修剪对象可以是前馈层或者注意力头。我们使用目标稀疏度(sparsity)作为训练标准,并使用拉格朗日乘数法来加速收敛过程。直到达到目标稀疏度后,我们停止训练掩码,并根据一个特定的阈值来将掩码二值化,以达到修剪CPM-Ant参数的目的。考虑到掩码二值化带来的损失,我们以一种伪剪枝的方式,使用二值化后的掩码进一步预训练该模型,以保持更好的性能。最后,我们用掩码进行实际修剪,得到一个更小的模型。

掩蔽(masking)策略

在训练掩码阶段,我们使用了两种策略。第一种是掩码在优化器中生效。在更新CPM-Ant之前,我们将所有梯度乘以掩码,掩蔽掉那些需要被修剪的参数。第二种是将掩码乘以模型权重,再做前向或反向传播。我们使用优化器层级的掩码策略得到7B模型,并使用模型层级的掩码策略来加速其他压缩版本的压缩过程。

阶梯式修剪策略

为了避免剧烈损失,我们动态地进行层修剪、注意力头修剪和前馈层维度的修剪。以CPM-Ant-3B模型为例。我们首先对10B模型的层进行修剪,以达到7B模型的要求。然后学习一个掩码,得到目标注意力头数。通过固定注意力头部分,我们修剪前馈层部分,最后得到3B模型。

压缩记录

最后,我们汇总了所有模型的性能:

下面是一些压缩过程的记录(这里主要有一些压缩过程中遇到的bug,你可以跳过:

  • 在7B和3B模型的压缩中,我们在包括两个数据文件的数据集上训练掩码和预训练模型,在观察到7B模型在第一个数据文件上损失降低到2.1后,我们于8月21日停止7B模型的预训练并开始3B模型的压缩。但是在8月23日,我们看到在进入第二个文件时,损失急剧增加,如上表所示,这意味着压缩仍然没有收敛。这可能是由于模型在开始的一部分数据上训练了太多次(如预训练细节中所述),导致了在该部分数据上一定程度的过拟合。因此,我们将继续在第二个数据文件上对3B和7B模型进行预训练,持续两周。
  • 在1B压缩之前,我们对两个数据文件进行合并和混洗,并对压缩程序进行规范化,以避免处理重复数据。如上所示,注意力头掩码训练和前馈层维度掩码训练在一个过程中合并,对应于两个波峰。以“1B-注意力头和前馈层维度掩码”为例。下表描述了详细的剪枝过程:

构建基于CPM-Ant的演示系统

为了进一步验证模型的有效性,我们在CPM-Ant基础上微调了一个标题生成器以展示模型能力。该生成器可以为文章生成劲爆的标题,请看下面系统展示:



在下一步,我们会添加更多的功能以提高用户体验。更多有趣的应用也即将到来

感兴趣的用户可以使用CPM-Ant构建您自己的展示应用。如果您有任何想法或者遇到任何问题,随时欢迎您在我们的 论坛 发起讨论!


未来工作

  • 在下游任务上微调CPM-Ant压缩模型,评测模型的性能。
  • CPM-Live模型支持更多的语言。
  • CPM-Live模型支持结构化数据,例如JSON和表格数据。
  • 在预训练阶段使用更多的伪数据进行数据增强,包括摘要、问答和可控文本生成。

参考文献

  • Patterson D, Gonzalez J, Le Q, et al. Carbon emissions and large neural network training[J]. arXiv preprint arXiv:2104.10350, 2021.
  • Zhang Z, Han X, Zhou H, et al. CPM: A large-scale generative Chinese pre-trained language model. AI Open, 2021, 2: 93-99.
  • Zhang Z, Gu Y, Han X, et al. Cpm-2: Large-scale cost-effective pre-trained language models. AI Open, 2021, 2: 216-224.
  • Gu Y, Han X, Liu Z, et al. PPT: Pre-trained prompt tuning for few-shot learning. Proceedings of ACL. 2022: 8410-8423.
  • Dong L, Yang N, Wang W, et al. Unified language model pre-training for natural language understanding and generation. Proceedings of NeurIPS. 2019: 13063-13075.
  • Du Z, Qian Y, Liu X, et al. All nlp tasks are generation tasks: A general pretraining framework[J]. arXiv preprint arXiv:2103.10360, 2021.
  • Shaw P, Uszkoreit J, Vaswani A. Self-Attention with Relative Position Representations. Proceedings of NAACL-HLT. 2018: 464-468.
  • Hoffmann J, Borgeaud S, Mensch A, et al. Training Compute-Optimal Large Language Models[J]. arXiv preprint arXiv:2203.15556, 2022.
  • Ding N, Qin Y, Yang G, et al. Delta tuning: A comprehensive study of parameter efficient methods for pre-trained language models[J]. arXiv preprint arXiv:2203.06904, 2022.
  • Hu E J, Shen Y, Wallis P, et al. Lora: Low-rank adaptation of large language models[J]. arXiv preprint arXiv:2106.09685, 2021.
  • Louizos C, Welling M, Kingma D P. Learning sparse neural networks through L_0 regularization. Proceedings of ICLR. 2018.
  • Maddison C, Mnih A, Teh Y. The concrete distribution: A continuous relaxation of discrete random variables. Proceedings of ICLR. 2017.