无 MatMul 的 LLM:关键概念解释
Posted: Tue Dec 03, 2024 4:17 am
训练大型语言模型 (LLM) 的计算成本越来越难以控制。例如,GPT-4 的训练花费了 OpenAI 约 1 亿美元。这些成本主要来自矩阵乘法运算(简称 MatMul),研究人员和开发人员自然都试图完全消除它或使其更高效。
“可扩展的无 MatMul 语言建模”论文介绍了一种突破性的方法,可正面解决此问题。通过从 LLM 中完全消除 MatMul,作者开发了一种模型,该模型在保持竞争性能的同时,还显著降低了计算和内存要求。
无 MatMul 的 LM 与 Transformer:内存和延迟比较
来源:Rui-Jie Zhu 等
论文中的所有模型都可以在HuggingFace上找到— 您可以在线试用它们,也可以使用 HuggingFace 的库在本地试用。此外,研究人员还在GitHub上提供了他们的代码,让其他人可以训练他们的模型。
如果你想更好地理解矩阵乘法的立方时 扎洛数据库 间复杂度,我推荐这篇《Big-O 符号和时间复杂度简介》 ,其中有一节专门介绍 MatMul LLM 的时间复杂度。
我还对 MatMul-free 和 MatMul LLM 进行了比较——你可以在这篇文章中找到它:Matmul-Free 与 MatMul LLM:速度和内存消耗。
大型语言模型中的 MatMul 瓶颈
现代基于 Transformer 的 LLM 严重依赖矩阵乘法运算,这是其核心组件(例如注意力机制和前馈层)的核心。与 MatMul 运算相关的计算和内存成本非常高,会影响训练和推理阶段。随着 LLM 规模的增加,参数数量和计算复杂性也会增加,从而使 MatMul 成为主要瓶颈。
这个问题的一个常见例子是,当 GPU 的 VRAM 不足以处理模型大小时,迫使用户改用 CPU 进行训练或运行推理。CPU 并未像 GPU 那样针对并行 MatMul 操作进行优化,导致计算速度明显变慢。这会形成一个令人沮丧的循环,由于内存限制,即使计算能力足够,也无法充分利用可用的硬件。
多年来,研究人员探索了各种策略来减少 MatMul 的计算负担。量化是一种流行的方法,它涉及降低权重和激活的精度。通过用更少的位表示数字,量化可以降低 MatMul 操作的计算成本和内存占用。
然而,这种方法通常会牺牲模型准确性,并且无法完全消除 MatMul。微软的BitNet等著名努力表明,使用二进制或三元量化可以扩展 LLM,但这些模型在某些部分(例如自注意力机制)仍然依赖于 MatMul 操作。
还提出了替代架构来解决 MatMul 的低效率问题。AdderNet 等方法在某些网络组件中用加法代替乘法,而二元/三元神经网络则利用简化的算术运算
虽然这些方法提供了一些改进,但它们通常无法完全消除 MatMul,并且仅针对模型的特定部分。因此,总体计算成本仍然很高,限制了 LLM 的可扩展性和效率。
无 MatMul 语言模型的工作原理
为了了解无 MatMul LM 的工作原理,让我们研究一下底层架构和关键组件。
用三元运算代替 MatMul
在传统神经网络中,密集层(连接两个连续层之间的所有神经元)依靠 MatMul 来转换输入数据。作者用使用三元权重的 BitLinear 层替换了这些层。它们的权重不是可以是任何实数,而是被限制为三个值:-1、0 或 1。
权重最初以全精度值进行训练,然后在训练期间,使用称为“绝对量化”的过程将其量化为三元值。此过程按权重矩阵的平均绝对值缩放权重矩阵,然后将每个元素四舍五入为最接近的三元整数(-1、0 或 1)。
通过这种简化,他们可以用加法和减法代替 MatMul 中的乘法。例如,将数字乘以 -1 与对其取反相同,乘以 0 的结果为 0,乘以 1 则数字保持不变。
核心组件:MLGRU 和 GLU
下图概述了 MatMul-Free 语言模型的关键组件,包括 MatMul-Free 线性门控循环单元 (MLGRU) 和 MatMul-Free 门控线性单元 (GLU):
图中突出显示了基于自注意力的 Transformer 与无 MatMul 的 LLM 之间的区别。
来源:Rui-Jie Zhu 等
该图分为几个部分(从左上到右下):
自我注意力:本节展示传统的自我注意力机制如何通过矩阵乘法进行操作。
无 MatMul 的线性 GRU:此部分说明了 MLGRU 的架构,重点介绍了它如何使用逐元素操作和门控机制而不是 MatMul 来处理输入序列。
GLU / 无 MatMul GLU:本节演示了 GLU 如何在模型嵌入的不同维度上混合信息,并使用三元权重来消除 MatMul。
矩阵乘法 与缩放三元累加:此比较显示了如何用缩放三元累加取代标准矩阵乘法,从而简化了计算。
RMS 范数:本节详细介绍了 RMSNorm 操作,它在量化之前对激活进行标准化。
MLGRU 通过一次处理一个标记来处理输入序列。在每个步骤中,它将当前标记的嵌入和先前的隐藏状态作为输入。隐藏状态充当内存,存储来自先前标记的信息。然后,MLGRU 使用一系列元素操作和门控机制来更新此隐藏状态。这些门本质上是 0 到 1 之间的数字向量,通过确定先前隐藏状态和当前标记的嵌入的哪些部分与下一步最相关来控制信息流。此过程持续进行,直到整个序列被处理完毕。
无 MatMul 门控线性单元 (GLU) 是无 MatMul 语言模型的另一个关键组件。它将模型内部单词表示(嵌入)的不同维度上的信息混合在一起。简单来说,它可以帮助模型理解每个单词的不同方面或特征。
GLU 通过使用门控机制来控制不同嵌入通道之间的信息流来实现这一点。此门控机制类似于 MLGRU 中的门控,但它在通道维度而不是标记维度上运行。
无 MatMul 的 GLU 是标准 GLU 的改良版本,它通过使用 BitLinear 层消除矩阵乘法,BitLinear 层是采用三元权重(只能取 -1、0 或 1 值的权重)的密集层。在无 MatMul 的 GLU 中,首先使用两个单独的 BitLinear 层转换输入。一个层的输出通过 SiLU 激活函数,然后与另一个层的输出逐元素相乘。然后,这个门控输出通过另一个 BitLinear 层以产生最终输出。
这只是对 MLGRU 和 GLU 组件的高级解释。我鼓励您参考原始研究论文,以更详细地了解它们的内部工作原理和数学公式。
无 MatMul 与 Transformer
该研究调查了无 MatMul 模型的缩放规律,并将其性能与传统 Transformer 架构在模型尺寸增加时的性能进行了比较。
性能和可扩展性
令人惊讶的是,研究结果表明,随着模型规模的扩大,这两种方法之间的性能差距正在缩小。这是一个重要的观察结果,因为它表明,随着规模的扩大,无 MatMul 模型与传统 Transformer 的竞争力越来越强,并有可能在非常大的规模上胜过它们。
无 MatMul 的 LM 与 Transformer:缩放定律比较
来源:Ru
“可扩展的无 MatMul 语言建模”论文介绍了一种突破性的方法,可正面解决此问题。通过从 LLM 中完全消除 MatMul,作者开发了一种模型,该模型在保持竞争性能的同时,还显著降低了计算和内存要求。
无 MatMul 的 LM 与 Transformer:内存和延迟比较
来源:Rui-Jie Zhu 等
论文中的所有模型都可以在HuggingFace上找到— 您可以在线试用它们,也可以使用 HuggingFace 的库在本地试用。此外,研究人员还在GitHub上提供了他们的代码,让其他人可以训练他们的模型。
如果你想更好地理解矩阵乘法的立方时 扎洛数据库 间复杂度,我推荐这篇《Big-O 符号和时间复杂度简介》 ,其中有一节专门介绍 MatMul LLM 的时间复杂度。
我还对 MatMul-free 和 MatMul LLM 进行了比较——你可以在这篇文章中找到它:Matmul-Free 与 MatMul LLM:速度和内存消耗。
大型语言模型中的 MatMul 瓶颈
现代基于 Transformer 的 LLM 严重依赖矩阵乘法运算,这是其核心组件(例如注意力机制和前馈层)的核心。与 MatMul 运算相关的计算和内存成本非常高,会影响训练和推理阶段。随着 LLM 规模的增加,参数数量和计算复杂性也会增加,从而使 MatMul 成为主要瓶颈。
这个问题的一个常见例子是,当 GPU 的 VRAM 不足以处理模型大小时,迫使用户改用 CPU 进行训练或运行推理。CPU 并未像 GPU 那样针对并行 MatMul 操作进行优化,导致计算速度明显变慢。这会形成一个令人沮丧的循环,由于内存限制,即使计算能力足够,也无法充分利用可用的硬件。
多年来,研究人员探索了各种策略来减少 MatMul 的计算负担。量化是一种流行的方法,它涉及降低权重和激活的精度。通过用更少的位表示数字,量化可以降低 MatMul 操作的计算成本和内存占用。
然而,这种方法通常会牺牲模型准确性,并且无法完全消除 MatMul。微软的BitNet等著名努力表明,使用二进制或三元量化可以扩展 LLM,但这些模型在某些部分(例如自注意力机制)仍然依赖于 MatMul 操作。
还提出了替代架构来解决 MatMul 的低效率问题。AdderNet 等方法在某些网络组件中用加法代替乘法,而二元/三元神经网络则利用简化的算术运算
虽然这些方法提供了一些改进,但它们通常无法完全消除 MatMul,并且仅针对模型的特定部分。因此,总体计算成本仍然很高,限制了 LLM 的可扩展性和效率。
无 MatMul 语言模型的工作原理
为了了解无 MatMul LM 的工作原理,让我们研究一下底层架构和关键组件。
用三元运算代替 MatMul
在传统神经网络中,密集层(连接两个连续层之间的所有神经元)依靠 MatMul 来转换输入数据。作者用使用三元权重的 BitLinear 层替换了这些层。它们的权重不是可以是任何实数,而是被限制为三个值:-1、0 或 1。
权重最初以全精度值进行训练,然后在训练期间,使用称为“绝对量化”的过程将其量化为三元值。此过程按权重矩阵的平均绝对值缩放权重矩阵,然后将每个元素四舍五入为最接近的三元整数(-1、0 或 1)。
通过这种简化,他们可以用加法和减法代替 MatMul 中的乘法。例如,将数字乘以 -1 与对其取反相同,乘以 0 的结果为 0,乘以 1 则数字保持不变。
核心组件:MLGRU 和 GLU
下图概述了 MatMul-Free 语言模型的关键组件,包括 MatMul-Free 线性门控循环单元 (MLGRU) 和 MatMul-Free 门控线性单元 (GLU):
图中突出显示了基于自注意力的 Transformer 与无 MatMul 的 LLM 之间的区别。
来源:Rui-Jie Zhu 等
该图分为几个部分(从左上到右下):
自我注意力:本节展示传统的自我注意力机制如何通过矩阵乘法进行操作。
无 MatMul 的线性 GRU:此部分说明了 MLGRU 的架构,重点介绍了它如何使用逐元素操作和门控机制而不是 MatMul 来处理输入序列。
GLU / 无 MatMul GLU:本节演示了 GLU 如何在模型嵌入的不同维度上混合信息,并使用三元权重来消除 MatMul。
矩阵乘法 与缩放三元累加:此比较显示了如何用缩放三元累加取代标准矩阵乘法,从而简化了计算。
RMS 范数:本节详细介绍了 RMSNorm 操作,它在量化之前对激活进行标准化。
MLGRU 通过一次处理一个标记来处理输入序列。在每个步骤中,它将当前标记的嵌入和先前的隐藏状态作为输入。隐藏状态充当内存,存储来自先前标记的信息。然后,MLGRU 使用一系列元素操作和门控机制来更新此隐藏状态。这些门本质上是 0 到 1 之间的数字向量,通过确定先前隐藏状态和当前标记的嵌入的哪些部分与下一步最相关来控制信息流。此过程持续进行,直到整个序列被处理完毕。
无 MatMul 门控线性单元 (GLU) 是无 MatMul 语言模型的另一个关键组件。它将模型内部单词表示(嵌入)的不同维度上的信息混合在一起。简单来说,它可以帮助模型理解每个单词的不同方面或特征。
GLU 通过使用门控机制来控制不同嵌入通道之间的信息流来实现这一点。此门控机制类似于 MLGRU 中的门控,但它在通道维度而不是标记维度上运行。
无 MatMul 的 GLU 是标准 GLU 的改良版本,它通过使用 BitLinear 层消除矩阵乘法,BitLinear 层是采用三元权重(只能取 -1、0 或 1 值的权重)的密集层。在无 MatMul 的 GLU 中,首先使用两个单独的 BitLinear 层转换输入。一个层的输出通过 SiLU 激活函数,然后与另一个层的输出逐元素相乘。然后,这个门控输出通过另一个 BitLinear 层以产生最终输出。
这只是对 MLGRU 和 GLU 组件的高级解释。我鼓励您参考原始研究论文,以更详细地了解它们的内部工作原理和数学公式。
无 MatMul 与 Transformer
该研究调查了无 MatMul 模型的缩放规律,并将其性能与传统 Transformer 架构在模型尺寸增加时的性能进行了比较。
性能和可扩展性
令人惊讶的是,研究结果表明,随着模型规模的扩大,这两种方法之间的性能差距正在缩小。这是一个重要的观察结果,因为它表明,随着规模的扩大,无 MatMul 模型与传统 Transformer 的竞争力越来越强,并有可能在非常大的规模上胜过它们。
无 MatMul 的 LM 与 Transformer:缩放定律比较
来源:Ru