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

news2024/11/22 21:07:43

概述

大型语言模型 取得了显著进步。GPT-4、谷歌的 Gemini 和 Claude 3 等模型在功能和应用方面树立了新标准。这些模型不仅增强了文本生成和翻译,还在多模态处理方面开辟了新天地,将文本、图像、音频和视频输入结合起来,提供更全面的 AI 解决方案。

例如,OpenAI 的 GPT-4 在理解和生成类似人类的文本方面表现出了显著的进步,而谷歌的 Gemini 模型则擅长处理各种数据类型,包括文本、图像和音频,从而实现更无缝和上下文相关的交互。同样,Anthropic 的 Claude 3 模型以其多语言能力和在 AI 任务中的增强性能而闻名。

随着 LLM 的发展不断加速,了解这些模型的复杂性(尤其是它们的参数和内存要求)变得至关重要。本指南旨在揭开这些方面的神秘面纱,提供详细且易于理解的解释。
原文地址:https://www.unite.ai/understanding-large-language-model-parameters-and-memory-requirements-a-deep-dive/

大型语言模型的基础知识

什么是大型语言模型?

大型语言模型是使用海量数据集训练的神经网络,用于理解和生成人类语言。它们依赖于 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
  2. 多头注意力:
    • For h heads, with d_k = d_v = d_model / h:
    • Parameters = 4 * d_model^2 (for Q, K, V, and output projections)
  3. 前馈网络:
    • Parameters = 2 * d_model * d_ff + d_model + d_ff
    • Where d_ff is typically 4 * d_model
  4. 层标准化:
    • 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
  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

该模型大约有 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字节
  3. 前馈模块:
    • 第一线性层:2E 字节
    • GELU 激活:8E 字节
    • 第二线性层:2E 字节
  4. 交叉熵损失:
    • 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 等实际示例,我们可以更深入地了解这些模型的复杂性和规模。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1937578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

昇思25天学习打卡营第20天|Diffusion扩散模型

Mindspore框架利用扩散模型DDPM生成高分辨率图像(生成高保真图像项目实践) Mindspore框架利用扩散模型DDPM生成高分辨率图像|(一)关于denoising diffusion probabilistic model (DDPM)模型Mindspore框架利…

GitHub CLI 发布 2.53.0

gh 是 GitHub 官方的命令行客户端工具,在此推荐给每一位在参与、想参与到 GitHub 上开源项目的小伙伴。体验异常舒适! 常用的命令包括有: 登陆认证 gh auth login克隆代码仓库 gh repo clone linuxsuren/api-testing创建 Fork 仓库 gh repo f…

Java面试八股之Redis Stream的实现原理及应用场景

Redis Stream的实现原理及应用场景 Redis Stream是一种在Redis 5.0版本中引入的数据结构,它主要用于实现高效的消息队列服务。下面我将详细解释其实现原理以及一些常见的应用场景。 实现原理 1. 结构组成: - Redis Stream由一个或多个消息组成&#xf…

《无所不能的JavaScript · 异步编程》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

数据库:编程(打开、操作、关闭)

一、需要的头文件 sqlite3.h 二、编译过程 gcc xxx -lsqlite3 三、编程框架 打开数据库 》读写数据库(增,删,改,查) 》关闭数据库 3.1 打开数据库: sqlite3_open int sqlite3_open(char * path,sqlite3 ** db); 功能&…

【入门篇】2.3 STM32启动模式(一)

一,Boot引脚分步 二,启动电路 三,启动模式 STM32F4 根据 BOOT 引脚的电平选择启动模式,这两个 BOOT 引脚根据外部施加的电平来决定芯片的启动地址。 下表中 BOOT0 和 BOOT1 是 STM32 芯片上面的两个引脚,用于控制 STM32

【Elasticsearch】Elasticsearch 中的节点角色

Elasticsearch 中的节点角色 1.主节点(master)1.1 专用候选主节点(dedicated master-eligible node)1.2 仅投票主节点(voting-only master-eligible node) 2.数据节点(data)2.1 内容…

引起全球大规模蓝屏故障的CrowdStrike是什么,到底发生了什么?|TodayAI

在周五早晨,一场由网络安全公司CrowdStrike引发的大规模故障使全球范围内的多家大型航空公司、电视广播公司、银行和其他重要服务陷入停顿。此次故障导致无数Windows机器出现“蓝屏死机”(BSOD),系统无法正常启动。据悉&#xff0…

畅玩游戏新选择 :游戏本 Windows10 64位 专业版!

对于喜欢游戏竞技的玩家而言,选择一款合适的操作系统对于提升游戏体验至关重要。为了满足这一需求,系统之家小编将带来高性能的游戏本专用Win10操作系统。这一版本系统不仅注重游戏的稳定性,还针对玩家在游戏中可能遇到的超时检测和恢复&…

如何处理 PostgreSQL 中死锁的情况?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 如何处理 PostgreSQL 中死锁的情况?一、认识死锁二、死锁的症状三、死锁的检测四、预防死锁…

C++基础知识:引用的基本使用

1.作用&#xff1a; 给变量别名 2.语法&#xff1a; 数据类型 &别名原名 3.图例解释&#xff1a; 4.代码解释&#xff1a; #include<iostream>using namespace std;int main(){//引用基本语法int a10;int &ba;//两者公用了空间b和a都可以改变//该空间内的数…

一分钟图情论文:《智慧数据驱动的古籍智慧性保护体系研究》

中山大学的陈涛、苏日娜等人合著的《智慧数据驱动的古籍智慧性保护体系研究》论文探讨了智慧数据在古籍保护中的应用&#xff0c;提出了古籍智慧性保护体系框架。 智慧数据是一个动态的变量&#xff0c; 而非静态的常量&#xff0c;具有定性评价、流变发展和多态组成三个特点古…

Getx学习笔记之中间件鉴权

目录 前言 一、实现步骤 1.添加依赖 2.创建鉴权中间件 3.定义路由 4.设置初始路由 5.模拟登陆状态 二、Getx鉴权步骤总结 三、本文demo示例 四、参考文章 前言 在 Flutter 中&#xff0c;使用 GetX 可以很方便地实现中间件鉴权&#xff08;Authentication&#xff09…

Ubuntu编译ffmpeg并添加cmake工程

文章目录 前言前提须知为什么要自己编译 FFmpeg前提软件包与工具的安装编译ffmpeg写CMakeList.txt包含ffmpeg到我们项目中 总结 前言 FFmpeg 是一个领先的多媒体框架&#xff0c;能够解码、编码、转码、复用、解复用、流化、过滤和播放几乎所有人类和机器创造的内容。FFmpeg 包…

视频监控平台LntonCVS视频融合共享平台智慧安防视频监控汇聚应用方案

LntonCVS是一款功能强大且灵活部署的安防视频监控平台。它支持多种主流标准协议&#xff0c;包括GB28181、RTSP/Onvif、RTMP等&#xff0c;同时能够兼容海康Ehome、海大宇等厂家的私有协议和SDK接入。该平台不仅提供传统的安防监控功能&#xff0c;还支持接入AI智能分析&#x…

解读vue3源码-响应式篇2

提示&#xff1a;看到我 请让我滚去学习 文章目录 vue3源码剖析reactivereactive使用proxy代理一个对象1.首先我们会走isObject(target)判断&#xff0c;我们reactive全家桶仅对对象类型有效&#xff08;对象、数组和 Map、Set 这样的集合类型&#xff09;&#xff0c;而对 str…

月之暗面科技有限公司(Moonshot AI)内推

月之暗面科技有限公司&#xff08;Moonshot AI&#xff09;内推 公司简介 月之暗面科技有限公司&#xff0c;一家致力于实现通用人工智能&#xff08;AGI&#xff09;的创新企业&#xff0c;其主力产品 Kimi 智能助手&#xff0c;以其超长文本处理能力和多端同步功能&#xff…

215. 数组中的第K个最大元素 347. 前 K 个高频元素(LeetCode热题100)

215. 数组中的第K个最大元素 - 力扣&#xff08;LeetCode&#xff09; 写个快排&#xff0c;使数组升序&#xff0c;返回倒数第k个元素即可 func quickSort(nums []int, l int, r int) {if l > r {return}x : nums[(l r) / 2]i : l - 1j : r 1for i < j {for {iif n…

【HTML入门】第十六课 - 网页中的按钮们

这一小节&#xff0c;我们说一说 html网页 中的按钮。按钮的作用&#xff0c;就是让用户点呗&#xff0c;点了以后触发一些事件&#xff0c;可以做一些事情。 目录 1 input 按钮 一 2 input 按钮二 3 button 按钮 4 链接a标签 5 用其他元素做按钮 6 用图片做一个按钮 1 …

为什么要从C语言开始编程

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;很多小伙伴在入门编程时。都…