目前,基于 Transformers 架构的大型语言模型 (LLM),如 GPT、T5 和 BERT,已经在各种自然语言处理 (NLP) 任务中取得了 SOTA 结果。将预训练好的语言模型(LM) 在下游任务上进行微调已成为处理 NLP 任务的一种 范式。与使用开箱即用的预训练 LLM (例如:零样本推理) 相比, 在下游数据集上微调这些预训练 LLM 会带来 巨大的性能提升。
但是, 随着模型变得越来越大, 在消费级硬件上对模型进行全部参数的微调(full fine-tuning) 变得不可行。此 外, 为每个下游任务独立存储和部署微调模型变得非常昂贵, 因为微调模型(调整模型的所有参数) 与原始预训 练模型的大小相同。因此, 近年来研究者们提出了各种各样的参数高效迁移学习方法(Parameter-efficient Transfer Learning), 即固定住 PretrAIn Language model (PLM) 的大部分参数, 仅调整模型的一小部分参数来达到与全部 参数的微调接近的效果(调整的可以是模型自有的参数,也可以是额外加入的一些参数)
根据 OpenAI 联合创始人 Andrej Karpathy 在微软 Build 2023 大会上所公开的信息, OpenAI 所使用的大规模 语言模型构建流程主要包含四个阶段:预训练、有监督微调、奖励建模、强化学习。这四个阶段都需要不同规模 数据集合以及不同类型的算法,会产出不同类型的模型,同时所需要的资源也有非常大的差别。
大模型训练过程示意图
预训练 (Pretraining) 阶段需要利用海量的训练数据, 包括互联网网页、维基百科、书籍、 Github、论文、问答 网站等, 构建包含数千亿甚至数万亿单词的具有多样性的内容。利用由数千块高性能 GPU 和高速网络组成超级 计算机, 花费数十天完成深度神经网络参数训练, 构建基础语言模型 (Base Model) 。基础大模型构建了长文本的 建模能力,使得模型具有语言生成能力,根据输入的提示词 (Prompt),模型可以生成文本补全句子。也有部分研究 人员认为, 语言模型建模过程中也隐含的构建了包括事实性知识 (Factual Knowledge) 和常识知识 (Commonsense) 在内的世界知识 (World Knowledge)。GPT-3 完成一次训练的总计算量是 3640PFlops,按照 NVIDIA A100 80G 和平 均利用率达到 50% 计算, 需要花费近一个月时间使用 1000 块 GPU 完成。由于 GPT-3 训练采用了 NVIDIA V100 32G,其实际计算成本远高于上述计算。参数量同样是 1750 亿的 OPT 模型, 该模型训练使用了 992 块 NVIDIA A100 80G,整体训练时间将近 2 个月。BLOOM 模型的参数量也是 1750 亿, 该模型训练一共花费 3.5 个月, 使 用包含 384 块 NVIDIA A100 80G GPU 集群完成。可以看到大规模语言模型的训练需要花费大量的计算资源和时 间。包括 LLaMA 系列、 Falcon 系列、百川 (Baichuan) 系列等在模型都属于此阶段。由于训练过程需要消耗大量 的计算资源, 并很容易受到超参数影响, 如何能够提升分布式计算效率并使得模型训练稳定收敛是本阶段的重 点研究内容。
有监督微调(Supervised F.NETuning),也称为指令微调 (Instruction Tuning),利用少量高质量数据集合, 包含 用户输入的提示词 (Prompt) 和对应的理想输出结果。用户输入包括问题、闲聊对话、任务指令等多种形式和任 务。利用这些有监督数据, 使用与预训练阶段相同的语言模型训练算法, 在基础语言模型基础上再进行训练, 从 而得到有监督微调模型 (SFT 模型)。经过训练的 SFT 模型具备了初步的指令理解能力和上下文理解能力, 能够完成开放领域问题、阅读理解、翻译、生成代码等能力, 也具备了一定的对未知任务的泛化能力。由于有监督微 调阶段的所需的训练语料数量较少, SFT 模型的训练过程并不需要消耗非常大量的计算。根据模型的大小和训 练数据量, 通常需要数十块 GPU ,花费数天时间完成训练。 SFT 模型具备了初步的任务完成能力, 可以开放给 用户使用, 很多类 ChatGPT 的模型都属于该类型, 包括: Alpaca 、Vicuna 、MOSS 、ChatGLM-6B 等。很多这类 模型效果也非常好, 甚至在一些评测中达到了 ChatGPT 的 90% 的效果。当前的一些研究表明有监督微调阶段数 据选择对 SFT 模型效果有非常大的影响, 因此如何构造少量并且高质量的训练数据是本阶段有监督微调阶段的 研究重点。
奖励建模 (Reward Modeling) 阶段目标是构建一个文本质量对比模型, 对于同一个提示词, SFT 模型给出的多个不同输出结果的质量进行排序。奖励模型 (RM 模型) 可以通过二分类模型, 对输入的两个结果之间的优劣 进行判断。 RM 模型与基础语言模型和 SFT 模型不同, RM 模型本身并不能单独提供给用户使用。奖励模型的训 练通常和 SFT 模型一样, 使用数十块 GPU,通过几天时间完成训练。由于 RM 模型的准确率对于强化学习阶段 的效果有着至关重要的影响, 因此对于该模型的训练通常需要大规模的训练数据。 Andrej Karpathy 在报告中指 出, 该部分需要百万量级的对比数据标注, 而且其中很多标注需要花费非常长的时间才能完成。标注示例中文 本表达都较为流畅, 标注其质量排序需要制定非常详细的规范, 标注人员也需要非常认真的对标规范内容进行 标注, 需要消耗大量的人力, 同时如何保持众包标注人员之间的一致性, 也是奖励建模阶段需要解决的难点问 题之一。此外奖励模型的泛化能力边界也在本阶段需要重点研究的另一个问题。如果 RM 模型的目标是针对所 有提示词系统所生成输出都能够高质量的进行判断, 该问题所面临的难度在某种程度上与文本生成等价, 因此 如何限定 RM 模型应用的泛化边界也是本阶段难点问题。
强化学习 (Reinforcement Learning) 阶段根据数十万用户给出的提示词, 利用在前一阶段训练的 RM 模型, 给出 SFT 模型对用户提示词补全结果的质量评估, 并与语言模型建模目标综合得到更好的效果。该阶段所使用 的提示词数量与有监督微调阶段类似,数量在十万量级,并且不需要人工提前给出该提示词所对应的理想回复。 使用强化学习, 在 SFT 模型基础上调整参数, 使得最终生成的文本可以获得更高的奖励 (Reward) 。该阶段所需 要的计算量相较预训练阶段也少很多, 通常也仅需要数十块 GPU,经过数天时间的即可完成训练。对比强化学 习和有监督微调, 在模型参数量相同的情况下, 强化学习可以得到相较于有监督微调好得多的效果。关于为什么 强化学习相比有监督微调可以得到更好结果的问题, 截止到 2023 年 9 月也还没有完整和得到普遍共识的解释。此外, Andrej Karpathy 也指出强化学习也并不是没有问题的, 它会使得基础模型的熵降低, 从而减少了模型输 出的多样性。在经过强化学习方法训练完成后的 RL 模型, 就是最终提供给用户使用具有理解用户指令和上下文 的类 ChatGPT 系统。由于强化学习方法稳定性不高, 并且超参数众多, 使得模型收敛难度大, 再叠加 RM 模型 的准确率问题,使得在大规模语言模型如何能够有效应用强化学习非常困难。
模型的训练成本
在模型的训练过程中除了要考虑模型准确性, 性能、成本和延迟都是重要考虑因素, 需要考虑效率和效果 (efficiency with effectiveness)之间的平衡。
当然, 大语言模型需要大量数据来学习自然语言的模式和结构。估算数据的成本可能具有挑战性, 因为公 司通常使用其业务运营中长期积累的数据以及开源数据集。此外, 还要考虑到数据需要进行清洗、标记、组织 和存储, 考虑到 LLM 的规模, 数据管理和处理成本会迅速增加, 特别是考虑到这些任务所需的基础设施、工具 和数据工程师时。举个具体的例子, 已知 LLaMA 使用了包含 1.4 万亿个 token 的训练数据集, 总大小为 4.6TB!接下主要介绍的是计算资源等方面的成本。
算力估算
如何评估大模型的所需算力。众所周知, 现如今的预训练语言模型均是基于 Transformer 结构实现的, 因此 大模型的参数主要来源于 Transformer 的 Self-Attention 部分。EleutherAI 团队近期发布一篇博客来介绍如何估计一个大模型的算力成本,公式如下:
C = τT ≈ 6PD
公式中各个符号代表的含义如下:
C 表示 Transformer 需要的计算量,单位是 FLOP;
P 表示 Transformer 模型包含的参数量;
D 表示训练数据规模,以 Token 数量为单位;
τ 表示吞吐量,单位为 FLOP
T 表示训练时间;
C 是一个量化计算成本的单位,通常用FLOP 表示,也可以用一些新的单位来表示:
FLOP/s-s :表示每秒浮点运算数 × 秒;
PetaFLOP/s-days:表示实际情况下每秒浮点运算数 × 天
费用和能耗
近年来, LLM 变得越来越大, LLM 的训练费用跟参数大小直接相关, 训练大型模型需要大量的算力, 因为 需要处理海量的数据。训练这类模型所需的算力取决于以下因素:模型的规模(参数数量)、训练数据集的大小、 训练轮次、批次大小。T5 11b 规模的模型单次训练成本预估超过 130 万美元, GPT-3 175B 单次训练需要 460 万 美元。
在此, 我们假定要训练一个千亿规模的大模型, 用 1PB 数据进行训练, 训练一次, 并且在 10 天内完成训练。 看看需要消耗多少算力,并计算这样的算力消耗,如果用英伟达的芯片,需要多少芯片。
首先, 我们要了解一个概念, 即 FLOPs (浮点运算次数)。FLOPs 用来衡量执行某个任务所需的计算量。T5 11B 模型只需要 3.3x102 2,假设一个千亿(1000 亿) 参数的大型模型, 我们可以参考 GPT-3。GPT-3 中最大的模 型(1750 亿参数) 的训练大约需要 3.14 ∗ 102 3 次浮点运算(FLOPs),FLOPs 大了 10 倍, 下图是训练大语言模 型所需 FLOPs 对比示意图。
训练大语言模型所需 FLOPs 对比示意图
我们可以通过以下简化公式估算所需的 FLOPs:
所需 FLOPs = (千亿参数 / 1750 亿参数) * 3.14 ∗ 102 3 FLOPs
根据这个公式, 我们得出训练一个千亿参数的模型大约需要 1.8 ∗ 102 3 次浮点运算。我们来看看英伟达的芯片。 以英伟达 A100 GPU 为例, 其具有每秒 19.5 万亿次(19.5 TFLOPs) 的浮点运算能力。要计算出需要多少个 A100 GPU 来满足这个算力需求,我们可以使用以下公式:
所需GPU数量 = 1.8 ∗ 10^23FLOPs/(19.5∗10^12FLOPs/s * 训练时间秒数)
如果希望在 10 天(约 864000 秒) 内完成训练, 可以按照以下计算方式得到所需 GPU 数量, 在 10 天内训练 1000 亿参数规模、 1PB 训练数据集,大约需要 10830 个英伟达 A100 GPU:
所需GPU数量 = 1.8 ∗ 10^23FLOPs/(19.5∗10^12FLOPs/s * 864000s)
接下来, 我们来计算大模型的训练成本。要计算训练一个千亿规模大型模型的总费用, 我们需要考虑以下 因素:GPU 成本、其他硬件成本(如 CPU、内存、存储等)、数据中心成本(如电力、冷却、维护等)、人力成本。
还是上面的例子,需要在 10 天内训练 1000 亿参数规模的大模型,总的成本如下:
GPU 成本: 英伟达 A100 GPU 的价格因供应商和购买数量而异, 假设每个 A100 GPU 的成本约为 10000 美 元,那么 10830 个 GPU 的总成本约为:10830 * $10,000 = $108,300,000
其他硬件成本: GPU 只是整个计算系统的一部分, 我们还需要考虑其他硬件设备的成本。包括 CPU、内存、 存储、网络设备等。这些硬件成本可能占据整体硬件成本的一部分, 假设其他硬件成本占 GPU 成本的 20%,那 么:其他硬件成本 = $108,300,000 * 20% = $21,660,000
数据中心成本: 我们还需要考虑数据中心的成本, 包括电力、冷却、维护等。假设这些成本占 GPU 成本的 10%,那么:数据中心成本 = $108,300,000 * 10% = $10,830,000
人力成本: 训练大型模型需要一支研究和工程团队, 包括研究员、工程师、数据科学家等。人力成本因团队 规模和地区差异而异。在这里,我们假设人力成本约为 200 万美元。
训练大语言模型所需费用对比示意图
综合以上因素,训练一个千亿规模大型模型的总费用大约为 $142,790,000:
总费用 = GPU 成本 + 其他硬件成本 + 数据中心成本 + 人力成本
总费用 = $108,300,000 + $21,660,000 + $10,830,000 + $2,000,000
因此, 在 10 天内训练一个千亿规模的大型模型大约需要花费 1.43 亿美元。当然, 如果训练时间长一点, 就 可以用更少的 GPU,花费更少的成本。但一般而言, 总成本都会在几千万美元规模。从上面的分析可以发现, 大模型真的是烧钱的游戏。先不考虑大模型的研发, 就是要完成一次大模型的训练, 首先就要有上亿的成本投入, 上图是训练大语言模型所需费用对比示意图。
对于 OpenAI API 的用户, 定价基于模型和使用情况而变化, 例如 GPT-3.5-turbo 通用聊天服务的收费标准 为 0.002$/1k token, 0.003$/1k token0. 12$/1k token
训练大模型的能耗同样惊人, 日前, 斯坦福大学人工智能研究所发布的一份新报告估计, 训练像 OpenAI 的 GPT-3 这样的人工智能模型所需消耗的能量, 足以可以让一个普通美国家庭用上数百年了。训练一个 6b trans- former 总能消耗估计约为 103.5 Mwh ,google 称,训练 PaLM 两个月左右耗费约了 3.4 Gwh。
训练大语言模型二氧化碳排放量对比示意图
上图中展示了训练四种模型相关的碳成本的研究:DeepMind 的 Gopher 、BigScience inititiaives 的 BLOOM、 Meta 的 OPT 和 OpenAI 的 GPT-3。据报道, OpenAI 的模型在训练期间释放了 502 公吨碳。它释放的碳含量是 Gopher 的 1.4 倍, 是 BLOOM 的 20.1 倍。GPT-3 的耗电量也是最大的, 达 1,287MWh。每个模型的能耗受很多 因素影响, 包括数据点或参数的数量, 它们训练所在的数据中心的能效。尽管能耗存在明显差异, 四个模型中 有三个(DeepMind 的 Gopher 除外) 都是在大致相当的 1750 亿个参数上进行训练的。OpenAI 并没有透露其新 发布的 GTP-4 训练了多少参数,鉴于该模型前几个版本之间所需数据的巨大飞跃, 可以肯定 GTP-4 比之前的版 本需要更多数据。