「70 年的人工智能研究史告诉我们,利用计算能力的一般方法最终是最有效的方法。」
这句话出自「强化学习教父」Rich Sutton 2019 年发表的一篇文章《苦涩的教训》(The Bitter Lesson)。他认为,人工智能如果想要长期获得提升,利用计算能力才是王道。
这是一个颇具争议的观点,但也的确为现阶段的 AI 发展提供了一个重要思路。在过去的几年中,越来越多的研究者和机构开始在「大模型 + 大算力」的方向上展开探索。这不仅仅是摸索 AI 技术发展路径的需要,也是 AI 落地到各行各业的刚需。
我们看到,在 AI 发展的早期阶段,开发者倾向于为每个场景从头训练一个模型,但随着应用场景的不断丰富,这种模式的缺点开始显现,比如重复的人力、算力投入(重复造轮子),部分场景开发难度过大、成本过高等。而且,有些场景的数据是非常稀缺的,难以支撑一个高精度模型的训练。
在此背景下,通过设计先进的算法,整合尽可能多的数据,汇聚大量算力,集约化地训练领域通用大模型供大量企业使用,已经成为一种必然趋势。
5 月 18 日,在华为生态大会 2021「昇腾万里 共赢智能新时代」分论坛上,鹏城实验室超大模型「鹏程. 盘古」重磅亮相。这是业界首个全开源 2000 亿参数中文预训练语言模型。
该模型由鹏城实验室联合相关技术团队开发,首次基于「鹏城云脑 Ⅱ」和全场景 AI 计算框架 MindSpore 的自动混合并行模式实现在 2048 卡算力集群上的大规模分布式训练,是国产全栈式 AI 基础设施第一次支持 2000 亿级超大规模语言模型训练,探索并验证了国产 E 级智算平台在软硬件协同优化、大规模分布式并行训练等核心关键技术上的可行性。
在模型性能方面,鹏程. 盘古大模型性能全球领先,16 个下游任务中性能指标优于业界 SOTA 模型,其中零样本学习任务 11 个任务领先、单样本学习任务 12 个任务领先、小样本学习任务 13 个任务领先。
在应用方面,鹏程. 盘古支持丰富的应用场景,在知识问答、知识检索、知识推理、阅读理解等文本生成领域表现突出。
能够取得如此优异的成绩,「大数据」、「大算力」固然功不可没,但如果没有卓越的软硬件协同优化、大规模分布式并行训练等技术做支撑,即使拿到足够的算力和数据,我们也训练不出鹏程. 盘古这类大模型。
在这篇文章中,我们就来谈谈鹏程. 盘古背后的技术以及这类大模型的价值所在。
开发鹏程. 盘古难在哪儿?
在以往的印象中,我们很容易将大模型的成功归功于算力和数据。但其实,大模型是一种统筹了数据预处理、模型架构、并行训练与优化的完整美学。就算给我们足够的算力、原始数据、原始模型,想要做出真正跑得通的大模型,中间还有千难万难。
拿数据来说,什么样的数据决定了模型有什么样的基本效果。显然,仅仅满足数据量大、干净、多样三个标准,就需要大量工程操作。量大与多样是大模型的必然要求,而它们必然导致数据被污染,被污染的数据必然导致模型效果不好(garbage in, garbage out)。因此,工程师们只能手动写下一条条规则去过滤、筛选出干净的数据。
模型也不例外。如果只关注大模型的「大」,那想当然地就会把标准模型变深、变宽。这就牵扯出一些问题:模型真的收敛得好?梯度反向传播没问题吗?权重都起作用吗?标注信号足够强吗?因此,要想达到理想的性能,模型上的修改与适配也是必不可少。
最后,也是最难的,并行训练策略与优化。光想想 2000 亿参数需要 TB 级内存,现在根本不存在这么大的 AI 处理器,大模型必然被「肢解」到不同的处理器。怎样分解模型、怎样分配处理器之间的通信、怎样优化计算图等等都显得异常复杂。
所以,当鹏程. 盘古解决了以上一系列问题,它才能真正称得上是一个有效的「大模型」。
最为核心:超大规模分布式训练
优质大模型最为核心,也最为困难的挑战,是超大规模分布式训练。机器之心之前曾详细介绍过 MindSpore 自动并行技术如何助力鹏程. 盘古。
很难想象,对于鹏程. 盘古这样的大模型,MindSpore 只需几行代码就能完全自动地完成并行策略。
MindSpore 对外屏蔽了复杂并行实现的细节,写并行就像编写单机模型那样简单。单机模型代码只需加上红色的「.shard()」和「.pipline_stage」等方法与配置,即可指定模型并行方法。
如果手动来写鹏程. 盘古分布式训练逻辑,那么需要综合考虑计算量与类型、集群带宽、拓扑结构、样本数量等等一大堆复杂的东西,然后再设计出性能比较优秀的并行切分策略,并编写大量并行切分和节点间的通信代码。而 MindSpore 将所有的复杂逻辑,都隐藏在「.set_auto_parallel_context()」这样简单的上下文管理器中。
从算法工程师角度来说,我们写自己的串行算法逻辑,MindSpore 负责自动把它们优化成并行分布式逻辑,这样用起来才是最舒服的。为了达到这样的效果,MindSpore「.set_auto_parallel_context()」上下文管理器默默地自动完成了 5 种并行优化。
MindSpore 从 5 大维度实现自动并行,5 维并行方式组合起来构成了鹏程. 盘古的分布式训练策略。
1. 数据并行:自动将批量训练数据分割成更小的批量,并将小批量分配到不同的训练服务器。这是算法工程师最基本,也是最常用的并行训练手段。
2. 算子级模型并行:对模型中的每个算子涉及到的张量进行切分。例如前面示例中的 ops.MatMul(x, w).shard((4, 1), (1, 1)),表示将 x 输入张量切分成 4 份,将 w 权重张量保留为一份。然后 4 个计算设备各保留一份被切分的 x 和完整的 w。
3.Pipeline 模型并行:将模型按层分成多个 stage,再把各个 stage 映射到多台设备上。例如模型第一层、第二层这样的 Pipeline 会拆分到不同的计算节点上。
4. 优化器模型并行:将优化器涉及的参数和梯度切分到多台设备上。例如常用的 Adam 优化算法,通过引入优化器并行,每个计算节点只保存部分权重及「动量」,能降低每个计算节点的静态内存并提升计算效率。
5. 重计算 (Rematerialization):因为反向传播的需求,一般正向算子的输出结果会累计保存在内存中,导致内存峰值过大。MindSpore 自动并行会舍弃部分正向算子的输出,并在反向阶段再重新计算一遍,这样能有效降低内存使用峰值。
这 5 大并行策略都是跨计算节点的,然而,在单卡节点内,MindSpore 还会通过图层和算子层的跨层协同优化,来进一步发挥算力潜能。虽然都隐藏在 MindSpore 框架底层,但这些自动并行与优化策略,对于超大规模的鹏程. 盘古是最为核心的。
模型创新:冗余不谓之「大」
预训练语言模型,除了自编码(AutoEncoding) 的 BERT 以及自回归(AutoRegressive) 的 GPT-3 这两大类架构,还有很多优秀的架构,例如多任务学习或者 XLNet 那样依赖排列组合的预训练方式。
然而,并非所有预训练语言模型都能平滑地扩展到数千亿参数量。可能有的架构收敛速度太慢,也可能有的架构对「few-shot」这样的复杂任务支持不够好。为了构建一种不臃肿且有效的模型,鹏程. 盘古采用了 GPT-3 初步试验的自回归架构作为 baseline,然后增加额外的 Query Layer 以加强模型在大规模中文预训练上的能力。
的确,如上所示,鹏程. 盘古和标准的自回归语言模型结构不一样,通常来说 Transformer 层在「5+this」那一个时间步就直接输出第六个位置的 Token。但鹏程. 盘古还增加了一个 Query 层,并加上「6」 这一位置信息以预测对应的 Token。
在 Transformer 顶层加上一个 Query Layer,旨在通过独立的位置编码,显式地将期望的输出给加进去。这样的好处在于鹏程. 盘古明确知道它要预测哪个位置的词,因此输入可以是随机词序,而不只是标准正序的方式。
和标准正序语言模型相比,显然这样的任务是更难的,因为模型不仅要预测下一个词,同时还要自己学会理解随机词序正确的语义及词之间真正的依赖关系。
正因为预训练任务及模型结构的双重改进,鹏程. 盘古大模型才会尽可能用上庞大的 2000 亿权重参数,才能称得上「大」。
为什么要花那么大力气开发鹏程. 盘古?
从鹏程. 盘古背后的技术我们可以看出,这类大模型的诞生往往要经历一个艰辛的过程。但一旦训练出来,其价值是非常可观的。
首先,大模型的泛化能力往往非常强大。以鹏程. 盘古为例,在学习了 TB 级的数据之后,该模型在很多方向都具备强大的通用知识,就像一个修炼了多年内功的武林高手。以此为底座,模型在各行各业的语言类场景下都有用武之地。
其次,大模型的小样本学习能力非常强大。在拥有了强大的通用知识之后,模型只需要学习少量新增样本就可以「触类旁通」,去解决特定场景下的任务。这就省去了从零开始训练的麻烦,减少了重复劳动,降低了普通人、一般企业用上大模型的难度。
但是,要想将上述价值发挥到极致,惠及整个 AI 生态圈,模型还得是开源、开放的。
我们看到,由于超大模型耗资甚巨、技术特性难以透彻理解,目前只有 Google、Microsoft、NVIDIA 等大公司才可以玩转千亿 / 万亿级的大模型,这对于中小企业、研究机构和个人研究者来说都很不友好,也不利于 AI 生态圈的建设。
鹏程. 盘古的开源正是基于这一考量。为了发挥这一基础性技术成果的最大效益,以鹏城实验室为首的联合团队决定将鹏程. 盘古的模型、代码、数据集在 OpenI 启智社区全面开源、开放,希望以启智开源社区为载体,集众智、聚众力,吸引开发者共同参与到模型的压缩轻量化和应用创新工作中,不断探索鹏程. 盘古大模型的巨大潜力。
OpenI 启智社区是在国家实施新一代人工智能发展战略背景下,新一代人工智能产业技术创新战略联盟(AITISA)组织产学研用协作共建共享的开源平台,旨在以鹏城云脑重大科研基础设施及 Trustie 软件开发群体化方法与平台为基础,全面推动人工智能领域的开源开放协同创新。
- 开源地址:https://git.openi.org.cn/PCL-Platform.Intelligence/PanGu-Alpha
- 技术报告:https://git.openi.org.cn/PCL-Platform.Intelligence/PanGu-Alpha/src/branch/master/PANGU-%ce%b1.pdf
此外,鹏程. 盘古的开源也符合一带一路人工智能产业发展联盟《联合宣言》的精神。这份宣言提出了四大倡议,其中就包括「构建基于先进技术的新型科技伙伴关系」,「把人工智能作为一带一路新的纽带,共同建设面向未来的『科技命运共同体』」等内容。
自成立以来,鹏城实验室一直将国家对新型研发机制及一带一路科研合作的要求作为自己的整体定位和目标,先后在多个战略性、前瞻性、基础性重大科学问题和关键核心技术上展开研究,鹏程. 盘古就是其最新研究成果之一。当然,鹏程. 盘古只是对超大规模分布式训练、超大规模中文预训练模型的一次探索,未来还需要更多的研究工作者投入到通用智能与大规模分布式计算的研究工作中。