AI 模型与平台

深入了解大型语言模型参数和内存要求:详细分析

mm
将 Unite.AI 添加到您在 Google 上的首选来源

大型语言模型 (LLMs) 近年来取得了显著的进展。像 GPT-4、Google (GOOGL ) 的 Gemini 和 Claude 3 这样的模型正在为能力和应用设定新的标准。这些模型不仅提高了文本生成和翻译能力,还在多模态处理方面取得了突破,结合文本、图像、音频和视频输入,提供了更全面的 AI 解决方案。
例如,OpenAI 的 GPT-4 在理解和生成类似人类的文本方面表现出色,而 Google 的 Gemini 模型则擅长处理多种数据类型,包括文本、图像和音频,从而实现更无缝和上下文相关的交互。同样,Anthropic 的 Claude 3 模型以其多语言能力和在 AI 任务中的增强性能而受到关注。
随着 LLMs 的开发继续加速,了解这些模型的细节,特别是它们的参数和内存要求,变得至关重要。本指南旨在阐明这些方面,提供详细和易于理解的解释。

大型语言模型的基础

什么是大型语言模型?

大型语言模型是训练在大量数据集上的神经网络,用于理解和生成人类语言。它们依赖于像 Transformer 这样的架构,使用自注意力等机制来处理和产生文本。

LLMs 中参数的重要性

参数是这些模型的核心组件。它们包括权重和偏差,在训练过程中,模型会调整这些参数以最小化预测错误。参数的数量通常与模型的容量和性能相关,但也影响其计算和内存要求。

了解 Transformer 架构

Transformers-architecture

Transformers Architecture

概述

Transformer 架构,由 Vaswani 等人在 2017 年的“Attention Is All You Need”论文中引入,已成为许多 LLMs 的基础。它由编码器和解码器组成,每个组件由多个相同的层组成。

编码器和解码器组件

  • 编码器: 处理输入序列并创建上下文感知表示。
  • 解码器: 使用编码器的表示和之前生成的标记来生成输出序列。

关键构建块

  1. 多头注意力: 允许模型同时关注输入序列的不同部分。
  2. 前馈神经网络: 为模型添加非线性和复杂性。
  3. 层归一化: 通过归一化中间输出来稳定和加速训练。

计算参数数量

Transformer Training

预训练模型用于高效的 Transformer 训练

计算基于 Transformer 的 LLMs 的参数

让我们分解每个组件的参数计算。我们将使用原始论文中的符号,其中 d_model 表示模型的隐藏状态维度。

  1. 嵌入层
    • 参数 = vocab_size * d_model
  2. 多头注意力
    • 对于 h 个头,d_k = d_v = d_model / h
    • 参数 = 4 * d_model^2(用于 Q、K、V 和输出投影)
  3. 前馈神经网络
    • 参数 = 2 * d_model * d_ff + d_model + d_ff
    • 其中 d_ff 通常是 4 * d_model
  4. 层归一化
    • 参数 = 2 * d_model(用于缩放和偏差)

一个 Transformer 层的总参数:

  • Parameters_layer = Parameters_attention + Parameters_ffn + 2 * Parameters_layernorm

对于具有 N 层的模型:

  • 总参数 = N * Parameters_layer + Parameters_embedding + Parameters_output

示例计算

让我们考虑一个具有以下规格的模型:

  • d_model = 768
  • h(注意力头的数量)= 12
  • N(层数)= 12
  • vocab_size = 50,000
  1. 嵌入层
    • 50,000 * 768 = 38,400,000
  2. 多头注意力
    • 4 * 768^2 = 2,359,296
  3. 前馈神经网络
    • 2 * 768 *(4 * 768)+ 768 +(4 * 768)= 4,719,616
  4. 层归一化
    • 2 * 768 = 1,536

每层的总参数:

  • 2,359,296 + 4,719,616 +(2 * 1,536)= 7,081,984

12 层的总参数:

  • 12 * 7,081,984 = 84,983,808

模型的总参数:

  • 84,983,808 + 38,400,000 = 123,383,808

该模型将具有大约 1.23 亿个参数。

内存使用类型

在处理 LLMs 时,我们需要考虑两种主要的内存使用类型:

  1. 模型内存: 存储模型参数所需的内存。
  2. 工作内存: 在推理或训练期间存储中间激活、梯度和优化器状态所需的内存。

计算模型内存

模型内存直接与参数数量相关。每个参数通常存储为 32 位浮点数,尽管一些模型使用混合精度训练,使用 16 位浮点数。
模型内存(字节)= 参数数量 * 每个参数的字节数
对于我们的示例模型,具有 1.23 亿个参数:

  • 模型内存(32 位)= 123,383,808 * 4 字节 = 493,535,232 字节 ≈ 494 MB
  • 模型内存(16 位)= 123,383,808 * 2 字节 = 246,767,616 字节 ≈ 247 MB

估计工作内存

工作内存要求可能会根据具体任务、批大小和序列长度而有很大差异。推理期间工作内存的粗略估计是:
工作内存 ≈ 2 * 模型内存
这考虑到了存储模型参数和中间激活。训练期间,内存要求可能更高,因为需要存储梯度和优化器状态:
训练内存 ≈ 4 * 模型内存
对于我们的示例模型:

  • 推理工作内存 ≈ 2 * 494 MB = 988 MB ≈ 1 GB
  • 训练内存 ≈ 4 * 494 MB = 1,976 MB ≈ 2 GB

稳态内存使用和峰值内存使用

训练基于 Transformer 架构的大型语言模型时,了解内存使用情况对于高效资源分配至关重要。让我们将内存要求分为两类:稳态内存使用和峰值内存使用。

稳态内存使用

稳态内存使用包括以下组件:

  1. 模型权重: 模型参数的 FP32 副本,需要 4N 字节,其中 N 是参数数量。
  2. 优化器状态: 对于 Adam 优化器,这需要 8N 字节(每个参数 2 个状态)。
  3. 梯度: 梯度的 FP32 副本,需要 4N 字节。
  4. 输入数据: 假设 int64 输入,这需要 8BD 字节,其中 B 是批大小,D 是输入维度。

稳态内存使用可以近似为:

  • M_steady = 16N + 8BD 字节

峰值内存使用

峰值内存使用发生在反向传播期间,当激活被存储用于梯度计算时。主要贡献者是:

  1. 层归一化: 每个层归一化需要 4E 字节,其中 E = BSH(B:批大小,S:序列长度,H:隐藏大小)。
  2. 注意力块
    • QKV 计算:2E 字节
    • 注意力矩阵:4BSS 字节(S:序列长度)
    • 注意力输出:2E 字节
  3. 前馈块
    • 第一线性层:2E 字节
    • GELU 激活:8E 字节
    • 第二线性层:2E 字节
  4. 交叉熵损失
    • 对数:6BSV 字节(V:词汇表大小)

激活内存可以估计为:

  • M_act = L *(14E + 4BSS)+ 6BSV 字节

其中 L 是 Transformer 层的数量。

总峰值内存使用

训练期间的峰值内存使用可以近似为:

  • M_peak = M_steady + M_act + 4BSV 字节

额外的 4BSV 项考虑了反向传播开始时的额外分配。
通过了解这些组件,我们可以在训练和推理期间优化内存使用,确保高效的资源分配和大型语言模型的改进性能。

缩放法则和效率考虑

大型语言模型的缩放法则

研究表明,大型语言模型的性能往往遵循某些缩放法则,随着参数数量的增加。Kaplan 等人(2020 年)观察到,模型性能随着参数数量、计算预算和数据集大小的增加而提高,遵循幂律关系。

模型性能与参数数量之间的关系可以近似为:

性能 ∝ N^α

其中 N 是参数数量,α 是缩放指数,通常在语言建模任务中约为 0.07。

这意味着,要实现 10% 的性能改进,我们需要将参数数量增加 10^(1/α) ≈ 3.7 倍。

效率技术

随着大型语言模型的不断增长,研究人员和从业者已经开发了各种技术来提高效率:

a) 混合精度训练: 使用 16 位或甚至 8 位浮点数进行某些操作,以减少内存使用和计算要求。

b) 模型并行: 将模型分布在多个 GPU 或 TPU 上,以处理单个设备无法容纳的更大模型。

c) 梯度检查点: 通过在反向传播期间重新计算某些激活而不是存储它们,来交换计算和内存。

d) 剪枝和量化: 删除训练后不太重要的权重或降低其精度,以创建更小、更高效的模型。

e) 蒸馏: 训练较小的模型来模仿较大模型的行为,可能在减少参数的情况下保留了大部分性能。

实践示例和计算

GPT-3,是最大的语言模型之一,具有 175 亿个参数。它使用 Transformer 架构的解码器部分。为了理解其规模,让我们用假设值来分解参数计数:

  • d_model = 12288
  • d_ff = 4 * 12288 = 49152
  • 层数 = 96

对于一个解码器层:
总参数 = 8 * 12288^2 + 8 * 12288 * 49152 + 2 * 12288 ≈ 11 亿
对于 96 层:
11 亿 * 96 = 1056 亿
其余参数来自嵌入和其他组件。

结论

了解大型语言模型的参数和内存要求对于有效设计、训练和部署这些强大的工具至关重要。通过分解 Transformer 架构的组件并检查实践示例,如 GPT,我们对这些模型的复杂性和规模有了更深入的了解。
为了更好地了解最新的关于大型语言模型及其应用的进展,请查看以下综合指南:

我已经沉浸在了令人着迷的机器学习和深度学习世界中五年了。我的热情和专业知识让我为超过50个不同的软件工程项目做出了贡献,特别关注AI/ML。我的持续的好奇心也让我对自然语言处理产生了兴趣,这是一个我渴望进一步探索的领域。