在上一篇《Generative AI 新世界:文本生成领域论文解读》中,我带领大家一起梳理了文本生成领域(Text Generation)的主要几篇论文:InstructGPT,RLHF,PPO,GPT-3,以及 GPT-4。本期文章我将帮助大家一起梳理另一个目前炙手可热的话题:大型语言模型(Large Language Models,或简写为 LLMs)。
大型语言模型指的是具有数十亿参数(B+)的预训练语言模型(例如:GPT-3, Bloom, LLaMA)。这种模型可以用于各种自然语言处理任务,如文本生成、机器翻译和自然语言理解等。
大型语言模型的这些参数是在大量文本数据上训练的。现有的大型语言模型主要采用 Transformer 模型架构,并且在很大程度上扩展了模型大小、预训练数据和总计算量。他们可以更好地理解自然语言,并根据给定的上下文(例如 prompt)生成高质量的文本。其中某些能力(例如上下文学习)是不可预测的,只有当模型大小超过某个水平时才能观察到。
以下是 2019 年以来出现的各种大型语言模型(百亿参数以上)时间轴,其中标黄的大模型已开源。
Source:A timeline of existing LLMs(>10B) https://arxiv.org/abs/2303.18223
在本期文章中,我们将一起探讨大型语言模型的发展历史、语料来源、数据预处理流程策略、训练使用的网络架构、最新研究方向分析(LLaMA、PaLM-E 等),以及在亚马逊云科技上进行大型语言模型训练的一些最佳落地实践等。
大型语言模型的发展历史
我们首先来了解下大型语言模型的发展历史和最新研究方向分析。
大型语言模型 1.0。过去五年里,自从我们看到最初的 Transformer 模型 BERT、BLOOM、GPT、GPT-2、GPT-3 等的出现,这一代的大型语言模型在 PaLM、Chinchilla 和 LLaMA 中达到了顶峰。第一代 Transformers 的共同点是:它们都是在大型未加标签的文本语料库上进行预训练的。
大型语言模型 2.0。过去一年里,我们看到许多经过预训练的大型语言模型,正在根据标记的目标数据进行微调。第二代 Transformers 的共同点是:对目标数据的微调,使用带有人工反馈的强化学习(RLHF)或者更经典的监督式学习。第二代大型语言模型的热门例子包括:InstructGPT、ChatGPT、Alpaca 和 Bard 等。
大型语言模型 3.0。过去的几个月里,这个领域的热门主题是参数高效微调和对特定领域数据进行预训练,这是目前提高大型语言模型计算效率和数据效率的最新方法。另外,下一代大型语言模型可能以多模态和多任务学习为中心,这将为大型语言模型带来更多崭新并突破想象力的众多新功能。
在本文第二章节“大模型最新研究方向分析”中,我们还会深入探讨参数微调、特定数据预训练和多模态等方向的相关进展分析。
01
近年来的大型语言模型概览
Source: https://arxiv.org/abs/2303.18223
上图展示了近年来大型语言模型(大于 10B 的参数)的统计数据,包括容量评估、预训练数据规模(token 数量或存储大小)和硬件资源成本。
图中,“Adaptation” 表示模型是否经过了后续微调:IT 表示指令调整,RLHF 表示通过人工反馈进行强化学习。“Evaluation” 表示模型在原始论文中是否经过了相应能力的评估:ICL 表示上下文学习(in-context learning),CoT 表示思维链(chain-of-thought)。
02
大型语言模型的语料来源
与早期的预训练语言模型(PLMs)相比,包含更多参数的大型语言模型需要更大的训练数据量,涵盖了更广泛的内容。为了满足这种需求,已经发布了越来越多的用于研究的训练数据集。根据他们的内容类型,大致可分类为六组:图书、CommonCrawl、Reddit 链接、维基百科、代码和其它。如下表所示:
Source: https://arxiv.org/abs/2303.18223
Source: https://arxiv.org/abs/2303.18223
上图展示了现有大型语言模型预训练数据中,各种不同的数据来源占比比率的信息。
03
大型语言模型的数据预处理策略
在收集了大量数据后,对其进行预处理对于构建预训练语料库至关重要,尤其是要删除嘈杂、冗余、不相关和潜在的有毒数据,这可能会在很大程度上影响大型语言模型的容量和性能。该论文中,研究者们用一个章节专门阐述了其研究团队的数据预处理策略,以及如何通过各种方法来提高所收集数据质量。
Source: https://arxiv.org/abs/2303.18223
上图为该论文阐述大型语言模型的预训练数据处理的典型策略概览图。
04
大型语言模型的网络结构
大型语言模型在训练阶段的网络结构设计参数,也是影响大型语言模型性能的重要指标之一。下表列举了一些大型语言模型的主要网络结构参数,包括:token 大小、归一化方式、位置嵌入方式、激活函数、是否使用 Bias、层数、注意力头的数量、隐藏状态大小、最大上下文长度等参数。如下表所示:
Source: https://arxiv.org/abs/2303.18223
上表概述了包含详细配置信息的多个大型语言模型的型号卡(Model cards):
PE 表示位置嵌入
#L 表示层数
#H 表示注意力头的数量
dmodel 表示隐藏状态的大小
MCL 表示最大上下文长度
05
大型语言模型的涌现能力
LLM 的涌现能力被正式定义为「在小型模型中不存在但在大型模型中出现的能力」,这是 LLM 与以前的 PLM 区分开来的最显著特征之一。当出现这种新的能力时,它还引入了一个显著的特征:当规模达到一定水平时,性能显著高于随机的状态。以此类推,这种新模式与物理学中的相变现象密切相关。原则上,这种能力也可以与一些复杂的任务有关,而人们更关心可以应用于解决多个任务的通用能力。
Source: https://arxiv.org/pdf/2206.07682.pdf
在少量提示(few-shot prompting)方法下测试了以下八个不同场景的模型性能:
算术运算(Mod. arithmetic)
语音翻译(IPA transliterate)
单词解读(Word unscramble)
Persian QA
TruthfulQA 基准
概念映射(Grounded mappings)
多任务语言理解(Multi-task NLU)
上下文理解基准
每个点都是一个单独的模型。当语言模型实现随机时,就会出现通过少量提示(few-shot prompting)方法执行任务的能力性能,在模型大小达到一定规模之后,性能会显著提高到远高于随机水平。
目前大型语言模型主要有三种代表性的涌现能力,分别是:
上下文学习
指令遵循
循序渐进的推理
上下文学习。GPT-3 正式引入了上下文学习能力:假设语言模型已经提供了自然语言指令和多个任务描述,它可以通过完成输入文本的词序列来生成测试实例的预期输出,而无需额外的训练或梯度更新。
指令遵循。通过对自然语言描述(即指令)格式化的多任务数据集的混合进行微调,LLM 在微小的任务上表现良好,这些任务也以指令的形式所描述。这种能力下,指令调优使 LLM 能够在不使用显式样本的情况下通过理解任务指令来执行新任务,这可以大大提高泛化能力。
循序渐进的推理。对于小语言模型,通常很难解决涉及多个推理步骤的复杂任务,例如数学学科单词问题。同时,通过思维链推理策略,LLM 可以通过利用涉及中间推理步骤的 prompt 机制来解决此类任务得出最终答案。据推测,这种能力可能是通过代码训练获得的。
大模型最新研究方向分析
01
Amazon Titan
2023年4月,亚马逊云科技宣布推出 Amazon Titan 模型。根据其以下官方网站和博客的信息(如下图所示):一些亚马逊云科技的客户已经预览了亚马逊全新的 Titan 基础模型。目前发布的 Amazon Titan 模型主要包括两个模型:
针对总结、文本生成、分类、开放式问答和信息提取等任务的生成式大语言模型;
文本嵌入(embeddings)大语言模型,能够将文本输入(字词、短语甚至是大篇幅文章)翻译成包含语义的数字表达(jiembeddings 嵌入编码)。
Source: https://aws.amazon.com/cn/bedrock/titan/
https://aws.amazon.com/cn/blogs/china/aws-announces-new-tools-for-generative-ai/
虽然这种大语言模型不生成文本,但对个性化推荐和搜索等应用程序却大有裨益,因为相对于匹配文字,对比编码可以帮助模型反馈更相关、更符合情境的结果。实际上,Amazon.com 的产品搜索能力就是采用了类似的文本嵌入模型,能够帮助客户更好地查找所需的商品。为了持续推动使用负责任 AI 的最佳实践,Titan 基础模型可以识别和删除客户提交给定制模型的数据中的有害内容,拒绝用户输入不当内容,过滤模型中包含不当内容的输出结果,如仇恨言论、脏话和语言暴力。
02
Alpaca: LLM Training LLM
2023年3月 Meta 的 LLaMA 模型发布,该模型对标 GPT-3。已经有许多项目建立在 LLaMA 模型的基础之上,其中一个著名的项目是 Stanford 的羊驼(Alpaca)模型。Alpaca 基于 LLaMA 模型,是有 70亿参数指令微调的语言 Transformer。Alpaca 没有使用人工反馈的强化学习(RLHF),而是使用监督学习的方法,其使用了 52k 的指令-输出对(instruction-output pairs)。
● LLaMA 模型:
https://research.facebook.com/publications/llama-open-and-efficient-foundation-language-models/
Source: https://github.com/tatsu-lab/stanford_alpaca
研究人员没有使用人类生成的指令-输出对,而是通过查询基于 GPT-3 的 text-davinci-003 模型来检索数据。因此,Alpaca 本质上使用的是一种弱监督(weakly supervised)或以知识蒸馏(knowledge-distillation-flavored)为主的微调。
Source: https://crfm.stanford.edu/2023/03/13/alpaca.html
这里值得关注的是羊驼(Alpaca)模型的训练数据,是通过查询 GPT-3 模型获得的。通俗地来说,这是“用 LLM 来训练 LLM”,或者称之为“用 AI 来训练 AI”。我觉得大多数人可能低估了这件事情对人类社会影响的意义,我觉得其意义非凡。这意味着:AI 之间的相互学习成长这件事,已经开始了。很多年后,当我们回望 AI 世代的演进史,这件事也许会是一个重要的时间节点。
03
PaLM-E: Multimodality
在 2023 年 3 月,PaLM-E 模型发布,展示了在大型语言模型和多模态数据模式(multimodality)融合的一些最新进展。这是大型语言模型的另一个重要趋势:通过视觉、多模态和多任务训练来扩展能力。
Source: PaLM-E paper:
https://arxiv.org/pdf/2303.03378.pdf
如以上论文中的图示,PaLM-E 模型是一种用于具体推理任务、视觉语言任务和语言任务的单一通用多模态语言模型。PaLM-E 模型对多模态句子进行操作,即一系列标记,其中来自任意模式(例如图像、神经三维表示或状态,绿色和蓝色)的输入与文本标记(橙色)一起插入,作为 LLM 的输入,经过端到端训练。
Source: PaLM-E paper:
https://arxiv.org/pdf/2303.03378.pdf
该论文展示了 PaLM-E 在三个不同的机器人领域做迁移学习的测试结果对比图。使用 PaLM-E 、ViT 预训练、机器人和视觉语言的混合数据组合,与仅对相应的域内数据进行训练相比,有显著的性能提升。
值得注意的是,PaLM-E 继续被训练为一个完全基于解码器的 LLM,它根据给定的前缀或提示自回归生成文本补全。那么,它们如何启用状态表征或者图像的输入呢?他们对网络进行了预训练以将其编码为 embeddings。对于图像,他们使用 4B 和 22B 参数的视觉 Transformer (ViT) 来生成嵌入向量;然后对这些嵌入向量进行线性投影,以匹配单词令牌嵌入的嵌入维度。
在训练过程中,为了形成多模态的句子,他们首先使用特殊标记 Tokens,例如:<img1>、<img2> 等,然后将其与嵌入的图像交换(类似于通过嵌入层嵌入单词标记的方式)。
Source:
https://magazine.sebastianraschka.com/p/ahead-of-ai-7-large-language-models
一些第三方领域学者对其论文和展示的性能提升也做了分析,如上图所示。使用 PaLM-E 、ViT 预训练、机器人和视觉语言的混合数据组合进行联合训练,与针对单个任务的训练模型相比,可以实现两倍以上的性能提升。
大型语言模型的训练和构建优化
01
训练大型语言模型的挑战
训练大型语言模型涉及许多挑战。这些挑战概括来说,大致来自于六个方面,如下图示:
硬件(Hardware)
健康检查(Health Checks)
编排(Orchestration)
数据(Data)
规模扩展(Scaling up)
成本考虑(Cost)
首先是硬件。你想使用最新的硬件。最新的硬件通常可以让你在各种基准测试中获得更好的性能,因此,如果这些模型需要数周或数月的时间来训练,而你没有利用最新硬件的性能优势,那么你将无法训练模型以获得最适合你的用例的结果。
第二个是健康检查。您需要确保硬件运行良好,以便最大限度地减少模型训练期间的干扰。
我们还需要考虑编排,启动集群,关闭集群,确保网络和安全配置运行良好,机器学习团队在运行各种工作负载时不会相互干扰。
我们需要考虑的其他事情是大数据集。存储、处理和加载它们以进行机器学习训练并不是一件容易的事,并且可能需要大量的开发工作才能高效完成。
我们扩大基础设施的规模并设计算法以绕过基础设施的局限性是另一个挑战。我们今天谈论的模型通常不适用于单个 GPU,因此你必须考虑如何将该模型拆分到 GPU 上。
最后,我们必须考虑成本。这些大型模型的训练成本可能高达数十万甚至数百万美元。所以,你想很好地利用机器学习团队的时间。与其让他们在基础架构上工作,他们可以专注于尝试新的模型创意,这样您的企业就可以利用该模型取得最佳结果。
02
大型语言模型的构建优化
幸运的是,Amazon SageMaker 可以帮助你应对所有这些挑战,从而加速大型语言模型的训练。现在,Amazon SageMaker 可帮助您使用托管基础设施、工具和工作流程为任何用例构建、训练和部署机器学习模型。如下图所示。
下图中黄色的部分,例如:Amazon SageMaker 分布式训练库、Amazon SageMaker 训练编译优化等,我们还会在下一篇的动手实验部分,用完整的代码来演绎实现,让你有更身临其境的感受。
在下层,我们有基础设施,Amazon SageMaker 可让你访问最新的硬件,包括 GPU 和 Trainium,以及实例之间的快速网络互连,这对于分发训练至关重要。
在中间层,有托管基础设施和工具的能力。
Amazon SageMaker 会为你处理大规模集群编排,它加速了集群,最后它会向下旋转。它有助于完成所有这些安全和网络配置,因此你可以轻松保护客户数据和 IP 的安全。
在训练工作开始时还会进行健康检查,以确保硬件有效运行,减少对训练工作的干扰。编排还意味着你只需为所用的计算资源付费。你只需要在集群启动时付费,为你训练模型,这样你就不必全天候为所有昂贵的硬件付费。
还有用于分析、调试和监控实验的工具,以及使用各种策略进行超参数优化的工具,以确保获得尽可能好的模型。
在顶层,有针对云端进行了优化的框架和库,例如在 Amazon SageMaker 上非常易于使用的 PyTorch、TensorFlow 和 Hugging Face,以及可帮助你处理超大型数据集或超大型模型的 Amazon SageMaker 分布式训练库。
我已经谈了很多使用 Amazon SageMaker 进行训练的能力和好处,让我们来谈谈它是如何运作的。训练模型,我们需要一些计算资源,然后在某些数据集上运行我们编写的训练代码。Amazon SageMaker 做到这一点的方法是:通过启动短暂的训练集群来完成任务。
当提交训练作业时,Amazon SageMaker 将根据你选择的集群配置启动集群。它将从 ECR 加载训练代码,从 S3 加载数据,然后开始训练。训练过程中,它会将日志和指标输出到 CloudWatch,将模型检查点(checkpoint)同步到 S3,并在任务结束时关闭集群。如果你编写的代码考虑了具有弹性,编写成能够从检查点自动恢复,则你的训练作业将无需手动干预即可自动重启。
以下是用于开始训练作业的核心代码,即 estimator API:
from sagemaker.pytorch import PyTorch
estimator = PyTorch(entry_point = ‘./cifar10.py’,role = role,framework_version = ‘1.13’,py_version = ‘py38’,instance_count = 1,instance_type = ‘ml.g5.xlarge’,hyperparameters = {‘epochs’: 50, ‘batch_size’: 32},metric_definitions = [{‘Name’: ‘train:loss’, ‘Regex’: ‘loss: (.*)’}]
estimator.fit(“s3://bucket/path/to/training/data”)
左滑查看更多
这里选择了 PyTorch 估算器,并定义了入口点的函数文件:cifar10.py。这与我们在自己的本地电脑上运行用于训练模型的脚本非常相似,我们称之为脚本模式。使用 Amazon SageMaker 训练作业的方法有很多,灵活性更强,你可以提供自己的 docker 容器或一些内置算法。
然后定义想要使用的框架和 Python 版本,以及训练作业的实例类型、实例数量和超参数。你现在可以随时轻松更改这些内容,启动其他训练任务来尝试不同的实例类型,看看哪种硬件最适合你的用例。
接下来将给出指标定义。这将告诉 Amazon SageMaker 如何解析从脚本中输出的日志,Amazon SageMaker 会将这些指标发送到 CloudWatch,供你稍后查看。
最后调用 estimator.fit(),其中包含训练数据的路径。
03
大模型训练
在亚马逊云科技上的最佳实践
本章节内容,将重点关注大型语言模型在亚马逊云科技上的最佳训练实践。大致分为五大方面:
计算(Compute) — Amazon SageMaker Training
存储(Storage) — 可以通过两种方式完成数据加载和检查点(checkpointing)配置:Amazon FSx Lustre 文件系统或 Amazon S3
并行化(Parallelism)— 选择分布式训练库对于正确使用 GPU 至关重要。我们建议使用经过云优化的库,例如 SageMaker 分片数据并行处理,但自管理库和开源库也可以使用
联网(Networking) — 确保 EFA 和 NVIDA的 GPUDirectRDMA 已启用,以实现快速的机器间通信
弹性(Resiliency) — 在大规模情况下,可能会发生硬件故障。我们建议定期写入检查点(checkpointing)
由于篇幅所限,恕本文不能完整解读分析以上五个方面的最佳实践优化,你可通过以下亚马逊云科技的官方博客了解详情:
https://aws.amazon.com/cn/blogs/machine-learning/training-large-language-models-on-amazon-sagemaker-best-practices/
以下我们会简单介绍下大模型训练并行化(Parallelism)在亚马逊云科技上的最佳实践。
大模型训练的并行化(Training Parallelism)
大模型通常有数十到数千亿个参数,这使得它们无法容纳在单个 GPU 卡中。大模型领域目前已有多个训练分布式计算的开源库,例如:FSDP、DeepSpeed 和 Megatron。你可以在 Amazon SageMaker Training 中直接运行这些库,也可以使用 Amazon SageMaker 分布式训练库,这些库已经针对亚马逊云进行了优化,可提供更简单的开发人员体验。
因此,在大型语言模型领域的开发人员,在亚马逊云科技上目前有两种选择:
在 Amazon SageMaker 上使用优化过的分布式库进行分布式训练;
自己来管理分布式训练。
以下将概述如何在 Amazon SageMaker 上,使用优化过的分布式库进行分布式训练。
为了提供更好的分布式训练性能和可用性,Amazon SageMaker Training 提出了几种专有扩展来扩展 TensorFlow 和 PyTorch 训练代码。在真实场景里,大型语言模型的训练通常以多维度并行(3D-parallelism)的方式在进行:
数据并行(data parallelism):可拆分训练小批次并将其馈送到模型的多个相同副本,以提高处理速度
流水线并行(pipeline parallelism):将模型的各个层归因于不同的 GPU 甚至实例,以便将模型大小扩展到单个 GPU 和单个服务器以外
Tensor 并行(tensor parallelism):将单个层拆分为多个 GPU,通常位于同一服务器内,以将单个层扩展到超过单个 GPU 的大小
以下示例图,展示了如何在具有 8*k*3 个 GPU(每台服务器8个 GPU)的 k*3 服务器集群上训练 6 层模型。数据并行度为 k,流水线并行度为6,张量并行度为 4。集群中的每个 GPU 包含模型层的四分之一,完整模型分为三台服务器(总共24个 GPU)。
Source:
https://aws.amazon.com/cn/blogs/machine-learning/training-large-language-models-on-amazon-sagemaker-best-practices/
其中和大型语言模型特别相关的分布式实践包括:
Amazon SageMaker 分布式模型并行 — 该库使用图形分区生成针对速度或内存进行了优化的智能模型分区。Amazon SageMaker 分布式模型并行提供了最新、最好的大型模型训练优化,包括数据并行、流水线并行、张量并行、优化器状态分片、激活检查点和卸载。
Amazon SageMaker 分片数据并行——在 MiCS: Near-linear Scaling for Training Gigantic Model on Public Cloud 论文中,引入了一种新的模型并行策略,该策略仅在数据并行组上划分模型,而不是整个集群。借助 MiCS,亚马逊云科技的科学家们能够在每个 GPU 上实现 176 万亿次浮点运算(理论峰值的 56.4%),从而在 EC2 P4de 实例上训练 210 层、1.06 万亿个参数的模型。作为 Amazon SageMaker 并行共享数据,MIC 现已能够向 Amazon SageMaker Training 客户提供。
MiCS: Near-linear Scaling for Training Gigantic Model on Public Cloud:
https://arxiv.org/pdf/2205.00119.pdf
Amazon SageMaker 分布式训练库提供高性能和更简单的开发者体验。开发人员无需编写和维护自定义的并行进程启动器,或使用特定于框架的启动工具,因为并行启动器已经内置在 Amazon SageMaker 的任务启动 SDK 之中。
与传统分布式训练相比,大型语言模型的微调通常不仅要求数据并行,数据并行和模型并行需要同时进行。Amazon SageMaker Model Parallelism 在易用性和稳定性(OOM)上与开源自建方案(如 DeepSpeed)相比具有核心竞争优势。对于基于哪些模型进行具体微调、具体最佳实践等技术细节,你还可以咨询亚马逊云科技的解决方案架构师团队,获得更进一步的技术支持和专业建议。
总结
本期文章我们一起探讨大型语言模型的发展历史、语料来源、数据预处理流程策略、训练使用的网络架构、最新研究方向分析(LLaMA、PaLM-E 等),以及在亚马逊云科技上进行大型语言模型训练的一些最佳落地实践等。下期文章,我们将重点讨论动手实践,解读和演示大型语言模型(LLMs)在亚马逊云科技上的部署、编译优化、分布式训练等方面的动手实验,敬请期待。
请持续关注「亚马逊云开发者」微信公众号,了解更多面向开发者的技术分享和云开发动态!
本篇作者
黄浩文
亚马逊云科技资深开发者布道师,专注于 AI/ML、Data Science 等。拥有20多年电信、移动互联网以及云计算等行业架构设计、技术及创业管理等丰富经验,曾就职于 Microsoft、Sun Microsystems、中国电信等企业,专注为游戏、电商、媒体和广告等企业客户提供 AI/ML、数据分析和企业数字化转型等解决方案咨询服务。
2023亚马逊云科技中国峰会即将开启!
👇👇👇点击下方图片即刻注册👇👇👇
听说,点完下面4个按钮
就不会碰到bug了!