LLM 模型大小、内存需求与量化

Gábor Bíró 2024年11月12日
3 阅读时间

大型语言模型 (LLM),例如 GPT-3、LLaMA 或 PaLM,是规模庞大的神经网络。它们的大小通常以参数数量来衡量(例如,7b、14b、72b,分别表示 70 亿、140 亿、720 亿个参数)。参数本质上是网络中的权重或偏置值。这些参数在训练期间学习获得,并共同代表模型的“知识”,决定了模型如何处理信息和生成输出。现代 LLM 拥有数十亿,有时甚至数千亿的参数。

LLM 模型大小、内存需求与量化
来源: 作者原创

数千亿的参数意味着大量的内存需求:

  • 存储: 模型参数必须存储在持久性存储设备上,例如硬盘驱动器或 SSD。
  • 加载: 为了运行模型(执行推理),需要将参数加载到 GPU(或其他加速器)的内存中。
  • 计算: 在模型执行期间,GPU 需要不断访问这些参数以执行计算。

示例:

假设一个模型有 1750 亿个参数,并且每个参数都以 FP32(32 位浮点)格式存储。

  • 一个 FP32 数字占用 4 个字节(32 位 / 8 位/字节)。
  • 1750 亿参数 * 4 字节/参数 = 7000 亿字节 = 700 GB。

因此,仅存储模型参数就需要 700 GB 的空间!加载和运行模型至少需要 GPU 上这么多的显存 (Video RAM)。这就是为什么需要配备大量显存的高端 GPU(如 NVIDIA A100、H100)来运行大规模 LLM。如果每个参数仅占用 1 个字节(如 INT8 格式),而不是 4 个字节,则以 GB 为单位的内存需求将大致等于以十亿为单位的参数数量。例如,使用 INT8 的 175B 参数模型将需要大约 175 GB 的显存。

量化:减少内存需求

量化是一种旨在减小模型大小和内存占用的技术,通常会牺牲一定程度的精度。在量化期间,模型的参数(权重,有时还有激活值)会转换为较低精度的数值格式

量化如何工作?

  1. 原始格式: 模型通常使用 FP32 或 FP16(16 位浮点)格式进行训练。
  2. 目标格式: 在量化期间,参数会转换为 INT8(8 位整数)、FP8 或其他较低精度类型等格式。
  3. 映射: 量化涉及在原始格式(例如 FP32)中的值范围与目标格式(例如 INT8)中的值范围之间创建映射。此映射定义了如何使用目标格式的有限范围来表示原始值,并且可以是线性的或非线性的。
  4. 舍入: 根据映射,原始值被“舍入”到目标格式中最接近的可表示值。
  5. 信息丢失: 这种舍入过程不可避免地会导致一些信息丢失,这可能会导致模型精度下降。量化中的挑战在于最大限度地减少这种精度损失。

示例(INT8 量化):

  • FP32:一个数字占用 4 个字节。
  • INT8:一个数字占用 1 个字节。

如果我们将 1750 亿参数的模型从 FP32 量化为 INT8,则模型大小将从 700 GB 缩小到 175 GB!这是一个显著的节省,使得在较小、更便宜的 GPU 上运行模型成为可能(尽管通常性能会略有下降)。

量化方法:

  • 训练后量化 (PTQ): 量化在模型完全训练后执行。这是最简单的方法,但可能导致更大的精度损失。
  • 量化感知训练 (QAT): 量化操作被模拟或整合到训练过程本身中。模型学习补偿由量化引起的精度损失。与 PTQ 相比,这通常会产生更好的精度,但需要更多的训练时间和计算资源。

总结

量化是高效运行大规模 LLM 的一项关键技术。它显著减少了模型大小和内存需求,使这些强大的模型能够被更广泛的用户和硬件所访问。但是,量化涉及与精度的权衡,因此为特定任务选择合适的量化方法和数值格式至关重要。硬件支持(例如,GPU 上高效的 INT8 操作)是快速有效地运行量化模型的关键。数值格式(FP32、FP16、BF16、INT8、FP8)及其硬件支持的演变与量化直接相关,共同促成了越来越大型和复杂的 LLM 的创建和部署。

Gábor Bíró 2024年11月12日