这篇文章最初发表在 NVIDIA 技术博客上。
大型语言模型 (LLM) 是一类使用 Transformer 网络构建的生成式 AI 模型,能够利用非常大的数据集来识别、汇总、翻译、预测和生成语言。正如我们所知,LLM 有望改变社会,但训练这些基础模型极具挑战性。
此博客阐述了使用 Transformer 网络构建 LLM 的基本原理,涵盖模型架构、注意力机制、嵌入技术和基础模型训练策略。
模型架构
模型架构定义了 Transformer 网络的骨干,大致规定了模型的功能和限制。LLM 的架构通常称为编码器、解码器或编码器 -- 解码器模型。
图 1.大型语言模型的规范结构
一些热门架构包括:
建筑 | 说明 | 适用于 |
Transformer 双向编码器表征 (BERT) | 编码器专用架构,最适合理解语言的任务。 | 分类和情感分析 |
生成式预训练 Transformer (GPT) | 仅适用于解码器的架构,适用于生成式任务,并使用判别性任务上的标记数据进行微调。给定单向架构,上下文只会向前流动。GPT 框架通过生成式预训练和判别微调,帮助使用与单任务无关的模型实现强大的自然语言理解。 | 文本含、句子相似性、问答。 |
文本转文本转换器(序列到序列模型) | 编码器 -- 解码器架构。它利用迁移学习方法将每个基于文本的语言问题转换为文本转文本格式,即以文本作为输入并生成下一个文本作为输出。借助双向架构,上下文可以双向流动。 | 翻译、问答、总结。 |
多专家模型 (MoE) | 可应用于任何架构的模型架构决策。旨在大幅扩展模型容量,同时尽可能减少计算开销,将密集模型转换为稀疏模型。MoE 层由许多专家模型和稀疏门控函数组成。在推理期间,门会将每个输入路由给顶级 K (K>=2 或 K=1) 专家。 | 在推理期间有效推广任务,以实现低延迟的计算效率 |
另一个热门架构决策是扩展到多模态模型,这些模型结合了来自文本、图像、音频和视频等多种模式或形式的数据的信息。虽然训练具有挑战性,但多模态模型提供了来自不同模式的互补信息的关键优势,正如人类通过分析来自多种感官的数据所理解的那样。
这些模型为每个模式包含单独的编码器,例如用于图像的 CNN 和用于文本的 Transformer,以从各自的输入数据中提取高级特征表征。从多个模式中提取的特征组合可能是一个挑战,可以通过融合从每个模式中提取的特征来解决,或者通过使用注意力机制来衡量每个模式相对于任务的贡献。
联合表征捕获模式之间的交互。模型架构可能包含额外的解码器,用于生成特定于任务的输出,例如分类、字幕生成、翻译、给定提示文本的图像生成、给定提示文本的图像编辑等。
深入研究 Transformer 网络
在 Transformer 网络领域,标记化过程在将文本分割为称为标记的较小单元方面发挥了关键作用。
分词器
标记化是构建模型的第一步,其中涉及将文本拆分为名为标记的较小单元,这些标记成为 LLM 的基本构建块。这些提取的标记用于构建词汇量索引,将标记映射到数字 ID,以数字方式表示适合深度学习计算的文本。在编码过程中,这些数字标记被编码为代表每个标记含义的向量。在解码过程中,当 LLM 执行生成时,标记器将数字向量解码回可读的文本序列。
该过程从标准化开始,以处理小写字母、剪枝标点符号和空格、词干、引文化、处理收缩和消除重音符号。清理文本后,下一步是通过识别单词和句子边界来分割文本。根据边界,分词器可以具有词、子词或字符级粒度。
虽然基于单词和字符的分词器很普遍,但这些分词器也存在挑战。基于单词的分词器会导致词汇量较大,而在分词器训练过程中未看到的单词会导致许多词外分词。基于字符的分词器会导致序列较长,单个分词意义较小。
由于这些缺点,基于子词的分词器越来越受欢迎。子词分词算法的重点是根据常见的字符 n-gram 和模式将稀有单词拆分成更小、有意义的子词。对于此技术,可以通过已知子词表示稀有和隐藏的单词,从而缩小词汇量。在推理过程中,它还可以有效地处理词汇量,同时在推理过程中优雅地处理词汇量不足的单词。
热门子词标记化算法包括字节对编码 (BPE)、WordPiece、Unigram 和 SentencePiece.
- BPE 从字符词汇开始,并以迭代方式将频繁的相邻字符对合并为新词汇术语,通过将最常见的单词替换为单个令牌,在解码时实现文本压缩,并加快推理速度。
- WordPiece 在执行合并操作时与 BPE 类似,但它利用语言的概率特性来合并字符,以更大限度地提高训练数据的可能性。
- Unigram 从大量词汇开始,计算令牌的概率,并根据损失函数删除令牌,直到它达到所需的词汇量大小。
- SentencePiece 基于语言建模目标从原始文本中学习子词单元,并使用 Unigram 或 BPE 标记化算法来构建词汇表。
注意力机制
由于传统的序列 2 序列编码器 -- 解码器语言模型(如递归神经网络 (RNN))不能很好地随输入序列的长度而扩展,因此引入了注意力的概念,并且事实证明这是开创性的。注意力机制使解码器能够使用输入序列中最相关的部分(按编码的输入序列加权),并为最相关的令牌分配最高权重。通过仔细选择按重要性划分的令牌,该概念改进了输入序列长度的扩展。
自注意力机制在 2017 年引入 Transformer 模型架构,消除了对 RNN 的需求。自注意力机制依靠同一序列中不同词之间的关系来创建输入序列的表示。通过包含输入上下文来增强输入嵌入的信息内容,自注意力机制在 transformer 架构中发挥着至关重要的作用。
图 2.自注意力架构 (来源:从零开始理解和编码大型语言模型的自注意力机制)
由于自注意力如何实现上下文感知的输入表示,因此称为"缩放点积注意力"。输入序列中的每个令牌使用各自的权重矩阵将自身投射到 Query (Q)、Key (K) 和 Value (V) 序列中。我们的目标是,在将所有其他输入令牌作为其上下文的情况下,计算每个输入令牌的注意力加权版本。通过计算 Q 和 K 矩阵的缩放点积,以及由获得更高权重的 V 矩阵确定的相关对,自注意力机制为每个输入令牌 (Q) 找到合适的向量,前提是序列中的所有键值对都是其他令牌。
自注意力进一步演变为多头注意力。前面描述的三个矩阵(Q、K、V)可以视为单头。多头自注意力是指使用多个此类头的情况。这些头的功能就像 CNN 中的多个内核一样,关注序列的不同部分,与短期依赖关系相比,专注于长期依赖关系。
图 3.多头自注意力 (来源:从零开始理解和编码大型语言模型的自注意力机制)
最后,交叉注意力的概念出现了,它不是像自注意力那样使用单个输入序列,而是涉及两个不同的输入序列。在 Transformer 模型架构中,这是一个来自编码器的输入序列,另一个由解码器处理。
闪存注意力
更大尺寸的 Transformer 会受到注意力层显存需求的限制,而注意力层的显存需求会随着序列长度的成比例增加。这种增长是二次型的。为了加快注意力层的计算速度并减少其显存占用,FlashAttention 优化了因从较慢的 GPU 高带宽显存 (HBM) 重复读取和写入而受到阻碍的朴素实现瓶颈。
FlashAttention 使用经典平铺将查询块、键和值从 GPU HBM (其主显存)加载到 SRAM (其快速缓存)进行注意力计算,然后将输出回写到 HBM.它还改进了内存使用情况,即不存储前向通道中的大型注意力矩阵,而是依赖于 SRAM 中反向传播期间重新计算的注意力矩阵。通过这些优化,FlashAttention 可显著加速(2-4 倍)序列,延长序列的时间。
图 4.借助 IO 感知实现快速闪存注意力和高显存效率的精确注意力**其中包括:github.com/Dao-AILab/f...)
进一步改进的 FlashAttention-2 比 FlashAttention 快 2 倍,通过添加序列并行性的进一步优化、更好的工作分区和减少非 matmul FLOPS.这个较新的版本还支持多查询注意力以及我们接下来介绍的分组查询注意力。
多查询注意力 (MQA)
一种注意力变体,其中多个查询头处理相同的关键和值预测头。这降低了 KV 缓存大小,从而降低了增量解码的显存带宽要求。生成的模型在推理过程中支持更快的自回归解码,与基准多头注意力架构相比,质量略有下降。
组查询注意力 (GQA)
![Grouped-query attention shares single key and value heads for each group of query heads, interpolating between multi-head and multi-query attention.Group-query attention (GQA) is an improvement over MQA to overcome quality degradation issues while retaining the speed-up at inference time. Moreover, models trained using multi-head attention don't have to be retrained from scratch and can employ GQA during inference by up-training existing model checkpoints using only 5% of original training compute. Also, this is a generalization of MQA using an intermediate (more than one, less than number of query heads) number of key-value heads. GQA achieves quality close to baseline multi-head attention with comparable speed to MQA.
Embedding techniques The order in which words appear in a sentence is important. This Information is encoded in LLMs using positional encoding by assigning the order of occurrence of each input token to a 2D positional encoding matrix. Each row of the matrix represents an encoded token of the sequence summed with its positional information. This allows the model to differentiate between words with similar meanings but different positions in the sentence and enables encoding of the relative position of words.
The original transformer architecture combines absolute positional encoding with word embeddings using sinusoidal functions. However, this approach doesn't allow extrapolation to longer sequences at inference time than those seen during training. Relative position encoding solved this challenge. In this, the content representations for query and key vectors are combined with positional representations that are trainable, relative to the distance between a query and a key that is clipped beyond a certain distance.
RoPE ](developer.nvidia.cn/zh-cn/blog/...) 图 5.分组查询注意力架构 (来源:**github.com/fkodom/grou...)
与 MQA 相比,组查询注意力 (GQA) 是一种改进,可以克服质量下降问题,同时保持推理时的加速。此外,使用多头注意力训练的模型不必从头开始重新训练。他们可以在推理期间使用 GQA,方法是仅使用原始训练计算的 5%提升训练现有模型检查点。此外,这是使用中间(多个查询头,但数量少于)键值头数的 MQA 的泛化。GQA 实现的质量接近基准多头注意力,且速度与 MQA 相当。
嵌入技术
单词在句子中的显示顺序非常重要。通过将每个输入令牌的出现顺序分配给 2D 位置编码矩阵,这些信息在 LLM 中使用位置编码进行编码。矩阵的每一行都表示序列的编码令牌及其位置信息求和。这允许模型区分含义相似但在句子中位置不同的单词,并支持对单词的相对位置进行编码。
原始 Transformer 架构将绝对位置编码与使用正弦函数的词嵌入相结合。但是,这种方法不允许外推到推理时间比训练时看到的更长的序列。相对位置编码解决了这一挑战。在此过程中,相对于查询与剪辑超过一定距离的关键帧之间的距离,查询和关键向量的内容表示与可训练的位置表示相结合。
RoPE
图 6.旋转位置嵌入的实现 (来源:RoFormer:采用旋转位置嵌入的增强型 Transformer)
资料来源:
旋转位置嵌入 (RoPE) 结合了绝对位置嵌入和相对位置嵌入的概念。绝对位置使用旋转矩阵进行编码。相对位置依赖关系纳入自注意力公式,并以乘法方式添加到上下文表示中。该技术保留了 Transformer 的正弦位置嵌入中引入的序列长度灵活性的优势,同时为线性自注意力配备相对位置编码。它还引入了衰减的令牌间依赖关系,增加了相对距离,从而使外推在序列推理时间更长。
AliBi
基于 Transformer 的 LLM 无法很好地扩展到更长的序列,原因是自注意力的二次成本,这限制了上下文令牌的数量。此外,原始 Transformer 架构中引入的正弦位置方法不会外推到比训练期间看到的更长的序列。这限制了可以应用 LLM 的真实用例集。为了克服这一点,引入了线性偏差 Attention (ALiBi).这项技术不向词嵌入添加位置嵌入;相反,它将对查询键的注意力分数进行偏差,并根据其距离进行惩罚。
为促进对比训练时看到的更长的序列进行高效外推,ALiBi 对注意力分数进行了负偏差,并根据相关键和查询之间的距离线性降低惩罚。与正弦模型相比,此方法不需要额外的运行时间或参数,并且会导致可忽略不计的 (0 -- 0.7%) 内存增加。ALiBi 相比正弦嵌入的优势在很大程度上可以解释为它更好地避免了早期令牌的诅咒。此方法还可以通过更有效地利用更长的上下文历史来实现进一步的收益。
训练 Transformer 网络
在训练 LLM 时,有几种技术可以提高效率并优化底层硬件配置的资源使用。扩展这些具有数十亿参数和数万亿令牌的大型 AI 模型需要巨大的内存容量。
为了缓解这一需求,模型并行和激活重计算等一些方法很受欢迎。模型并行将模型参数和优化器状态划分为多个 GPU,以便每个 GPU 存储模型参数的子集。它进一步分为张量和管道并行。
- Tensor 并行性在 GPU 上分割运算,通常称为层内并行性,专注于矩阵乘法等运算中的并行计算。此技术需要额外的通信来确保结果正确。
- 工作流并行在 GPU 中分割模型层(也称为层间并行化),专注于按层将模型分割成块。每个设备都计算其数据块,并将中间激活传递到下一阶段。这可能会导致泡沫时间,其中一些设备正在进行计算,而另一些则在等待,从而浪费计算资源。
- 序列并行性扩展了张量级模型并行性,因为它注意到先前未并行化的 Transformer 层的区域沿序列维度是独立的。沿序列维度分割这些层可以在张量并行设备中分配计算和这些区域的激活内存。由于激活是分布式的,并且具有较小的内存占用,因此可以保存更多激活以进行反向传递。
- 选择性激活重新计算与序列并行性并行计算并行执行。它注意到不同的激活需要不同数量的运算来重新计算,从而改善内存限制迫使重新计算部分而非全部激活的情况。它无需检查点和重新计算完整的 Transformer 层,而是可以仅检查点和重新计算每个 Transformer 层中占用大量内存但重新计算并不昂贵的部分,而不是检查点和重新计算。
所有技术都会增加通信或计算开销。因此,找到可实现最高性能的配置,然后使用数据并行性扩展训练对于高效的 LLM 训练至关重要。
在数据并行训练中,数据集被分割成多个分片,并将每个分片分配给设备。这相当于沿批量维度并行训练过程。每个设备都将保存模型副本的完整副本,并在分配的数据集分片上进行训练。反向传播后,模型的梯度将全部减少,以便不同设备上的模型参数可以保持同步。
其中一种变体称为全分片数据并行 (FSDP) 技术。该技术可在数据并行 worker 中统一分片模型参数并训练数据,其中每个微批数据的计算均针对每个 GPU worker 进行本地计算。
FSDP 提供可配置的分片策略,这些策略可以进行定制,以匹配集群的物理互连拓扑,以处理硬件异构性。它可以通过操作重排序和参数预取最大限度地减少气泡,以通过计算积极地重叠通信。最后,FSDP 通过限制为机上未分片参数分配的块数量来优化内存占用率。由于这些优化,FSDP 为更大的模型提供支持,在 TFLOPS 方面具有接近线性的可扩展性。
量化感知训练
量化是指深度学习模型与全精度(浮点)值相比,以降低的精度执行全部或部分计算的过程。此技术可在准确度损失最小的情况下,加快推理速度、节省内存和降低深度学习模型的使用成本。
量化感知训练 (QAT) 是一种在训练过程中考虑到量化影响的方法。模型在训练过程中使用模拟量化过程的量化感知操作进行训练。模型学习如何在量化表示中表现良好,从而提高与训练后量化相比的准确性。前向传递将权重和激活量化为低精度表示。后向传递使用全精度权重和激活来计算梯度。这使得模型能够学习对前向传递中引入的量化误差可靠的参数。结果是经过训练的模型可以在对准确性影响最小的情况下进行量化后训练。
立即训练 LLM
本文介绍了各种模型训练技术以及何时使用这些技术。请查看以下博文:掌握大语言模型 (LLM) 技术:定制,继续您在 LLM 工作流程中的学习之旅。
许多训练方法都支持 NVIDIA NeMo,它通过 3D 并行技术提供了加速的训练工作流,并提供了多种自定义技术选项。NeMo 针对语言和图像工作负载的大规模模型推理进行了优化,支持多 GPU 和多节点配置。下载 NeMo 框架并在您首选的本地和云平台上训练 LLM。