问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

深入探究理解大型语言模型参数和内存需求

创作时间:
作者:
@小白创作中心

深入探究理解大型语言模型参数和内存需求

引用
CSDN
1.
https://blog.csdn.net/matt45m/article/details/140546021

大型语言模型(LLM)在近年来取得了显著进步,从OpenAI的GPT-4到谷歌的Gemini,这些模型不仅在文本生成和翻译方面表现出色,还在多模态处理领域开辟了新天地。随着LLM的发展不断加速,了解这些模型的复杂性(尤其是它们的参数和内存要求)变得至关重要。本文将深入探讨LLM的参数和内存需求,帮助读者更好地理解这些强大工具的工作原理。

大型语言模型的基础知识

什么是大型语言模型?

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

LLM中参数的重要性

参数是这些模型的核心组成部分。它们包括权重和偏差,模型会在训练期间调整这些参数,以尽量减少预测误差。参数的数量通常与模型的容量和性能相关,但也会影响其计算和内存需求。

了解Transformer架构

概述

Vaswani等人在2017年发表的论文《Attention Is All You Need》中引入的Transformer架构已成为许多LLM的基础。它由一个编码器和一个解码器组成,每个编码器和解码器都由多个相同的层组成。

编码器和解码器组件

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

关键构建模块

  1. 多头注意力:使模型能够同时关注输入序列的不同部分。
  2. 前馈神经网络:给模型增加了非线性和复杂性。
  3. 层标准化:通过规范中间输出来稳定和加速训练。

计算参数数量

计算基于Transformer的LLM中的参数

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

  1. 嵌入层:
  • Parameters = vocab_size * d_model
  1. 多头注意力:
  • For h heads, with d_k = d_v = d_model / h:
  • Parameters = 4 * d_model^2 (for Q, K, V, and output projections)
  1. 前馈网络:
  • Parameters = 2 * d_model * d_ff + d_model + d_ff
  • Where d_ff is typically 4 * d_model
  1. 层标准化:
  • Parameters = 2 * d_model (for scale and bias)

一个Transformer层的总参数:

  • Parameters_layer = Parameters_attention + Parameters_ffn + 2 * Parameters_layernorm

对于具有N层数:

  • Total Parameters = N * Parameters_layer + Parameters_embedding + Parameters_output

示例计算
让我们考虑具有以下规格的模型:

  • d_model = 768
  • h (number of attention heads) = 12
  • N (number of layers) = 12
  • vocab_size = 50,000
  1. 嵌入层:
  • 50,000 * 768 = 38,400,000
  1. 多头注意力:
  • 4 * 768^2 = 2,359,296
  1. 前馈网络:
  • 2 * 768 * (4 * 768) + 768 + (4 * 768) = 4,719,616
  1. 层标准化:
  • 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

该模型大约有123亿个参数。

内存使用类型

使用LLM时,我们需要考虑两种主要类型的内存使用情况:

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

计算模型内存

模型内存与参数数量直接相关。每个参数通常存储为32位浮点数,尽管有些模型使用16位浮点数进行混合精度训练。

模型内存(字节)= 参数数量 * 每个参数的字节数

对于具有123亿个参数的示例模型:

  • 型号内存(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字节
  1. 前馈模块:
  • 第一线性层:2E 字节
  • GELU 激活:8E 字节
  • 第二线性层:2E 字节
  1. 交叉熵损失:
  • Logits:6BSV 字节(V:词汇量)

总激活内存可以估算为:

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

其中L是Transformer层的数量。

总峰值内存使用量
训练期间的峰值内存使用量可以通过结合稳态内存和激活内存来近似:

  • M_peak = M_steady + M_act + 4BSV 字节

额外的4BSV项解释了在后向传递开始时的额外分配。

通过了解这些组件,我们可以优化训练和推理期间的内存使用情况,确保高效的资源分配并提高大型语言模型的性能。

缩放定律和效率考虑

LLM的缩放定律

研究表明,随着参数数量的增加,LLM的性能趋向于遵循某些缩放规律。Kaplan等人(2020)观察到,模型性能随着参数数量、计算预算和数据集大小的幂律而提高。

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

绩效∝N^α

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

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

效率技巧

随着LLM课程的不断发展,研究人员和实践者已经开发出各种技术来提高效率:

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 ≈ 1.1 亿

共计96层:

1.1亿*96=105.6亿

其余参数来自嵌入和其他组件。

结论

了解大型语言模型的参数和内存需求对于有效设计、训练和部署这些强大的工具至关重要。通过分解Transformer架构的组件并研究GPT等实际示例,我们可以更深入地了解这些模型的复杂性和规模。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号