深入探究理解大型语言模型参数和内存需求
概述
大型语言模型 取得了显著进步。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 编码器:处理输入序列并创建上下文感知表示。
- 解码功能:使用编码器的表示和先前生成的标记生成输出序列。
关键构建模块
- 多头注意力:使模型能够同时关注输入序列的不同部分。
- 前馈神经网络:给模型增加了非线性和复杂性。
- 层标准化:通过规范中间输出来稳定和加速训练。
计算参数数量
计算基于 Transformer 的 LLM 中的参数
让我们分解一下基于 Transformer 的 LLM 的每个组件的参数计算。我们将使用原始论文中的符号,其中 d_model
表示模型隐藏状态的维度。
- 嵌入层:
- Parameters = vocab_size * d_model
- 多头注意力:
- For h heads, with d_k = d_v = d_model / h:
- Parameters = 4 * d_model^2 (for Q, K, V, and output projections)
- 前馈网络:
- Parameters = 2 * d_model * d_ff + d_model + d_ff
- Where d_ff is typically 4 * d_model
- 层标准化:
- 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
- 嵌入层:
- 50,000 * 768 = 38,400,000
- 多头注意力:
- 4 * 768^2 = 2,359,296
- 前馈网络:
- 2 * 768 * (4 * 768) + 768 + (4 * 768) = 4,719,616
- 层标准化:
- 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 时,我们需要考虑两种主要类型的内存使用情况:
- 模型内存:存储模型参数所需的内存。
- 工作内存:推理或训练期间所需的内存,用于存储中间激活、梯度和优化器状态。
计算模型内存
模型内存与参数数量直接相关。每个参数通常存储为 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 架构训练大型语言模型时,了解内存使用情况对于高效分配资源至关重要。让我们将内存需求分为两大类:稳定状态内存使用情况和峰值内存使用情况。
稳定状态内存使用情况
稳定状态内存使用情况包括以下部分:
- 型号重量:FP32 模型参数的副本,需要 4N 字节,其中 N 是参数的数量。
- 优化器状态:对于 Adam 优化器,这需要 8N 字节(每个参数 2 个状态)。
- 渐变:渐变的FP32副本,需要4N字节。
- 输入数据:假设输入为 int64,这需要 8BD 字节,其中 B 是批量大小,D 是输入维度。
总的稳定状态内存使用量可以近似为:
- M_steady = 16N + 8BD 字节
峰值内存使用率
在反向传递期间,当激活被存储用于梯度计算时,内存使用量达到峰值。造成内存峰值的主要因素有:
- 层标准化:每层标准需要 4E 字节,其中 E = BSH(B:批量大小,S:序列长度,H:隐藏大小)。
- 注意力障碍:
- QKV计算:2E字节
- 注意力矩阵:4BSS 字节(S:序列长度)
- 注意输出:2E字节
- 前馈模块:
- 第一线性层:2E 字节
- GELU 激活:8E 字节
- 第二线性层:2E 字节
- 交叉熵损失:
- 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 等实际示例,我们可以更深入地了解这些模型的复杂性和规模。
相关文章:

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

maven 私服搭建(tar+docker)
maven私服搭建 一、linux安装nexus1、工具下载 二、 docker 搭建nexus1、镜像下载创建目录2、运行nexus3、访问确认,修改默认密码,禁用匿名用户登录4、创建仓库5、创建hostd仓库6、创建Blob Stores7、创建docker私服1、创建proxy仓库2、创建hotsed本地仓…...

银行业务知识全篇(财务知识、金融业务知识)
第一部分 零售业务 1.1 储蓄业务 4 1.1.1 普通活期储蓄(本外币) 4 1.1.2 定期储蓄(本外币) 5 1.1.3 活期一本通 9 1.1.4 定期一本通 10 1.1.5 电话银行 11 1.1.6 个人支票 11 1.1.7 通信存款 13 1.1.8 其他业务规…...
解决ElasticJob项目重启ZooKeeper注册冲突以及zkCli删除目录
解决ElasticJob项目重启ZooKeeper注册冲突以及zkCli删除目录 背景 在现代化的分布式调度系统中,ElasticJob 是一个非常流行的选择。它利用 ZooKeeper 作为注册中心来管理任务分片。然而,有时在项目重启时,会遇到 ZooKeeper 注册冲突的问题&…...

【EI检索】第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)
一、会议信息 大会官网:www.mvipit.org 官方邮箱:mvipit163.com 会议出版:IEEE CPS 出版 会议检索:EI & Scopus 检索 会议地点:河北张家口 会议时间:2024 年 9 月 13 日-9 月 15 日 二、征稿主题…...

vscode通过ssh链接远程服务器上的docker
目录 1 编译docker image1.1 编译镜像1.2 启动镜像 2 在docker container中启动ssh服务2.1 确认是否安装ssh server2.2 修改配置文件2.3 启动ssh服务 3 生成ssh key4 添加ssh公钥到docker container中5 vscode安装插件Remote - SSH6 在vscode中配置 1 编译docker image 一般来…...

使用NIFI连接瀚高数据库_并从RestFul的HTTP接口中获取数据局_同步到瀚高数据库中---大数据之Nifi工作笔记0067
首先来看一下如何,使用NIFI 去连接瀚高数据库. 其实,只要配置好了链接的,连接字符串,和驱动,任何支持JDBC的数据库都可以连接的. 首先我们用一个ListDatabaseTables处理器,来连接瀚高DB 主要是看这里,连接地址,以及驱动,还有驱动的位置 这个是数据连接的配置 jdbc:highgo://…...

IDEA的工程与模块管理
《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试(Debug) 第七章 …...
[M前缀和] lc3096. 得到更多分数的最少关卡数目(前缀和+思维)
文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接:3096. 得到更多分数的最少关卡数目 2. 题目解析 比较有意思的题目,仔细读题后发现解题没啥难度,但是如何写好、写的更简洁需要注意下: 思路: 数据量 1e5&#…...

基础vrrp(虚拟路由冗余协议)
一、VRRP 虚拟路由冗余协议 比如交换机上联两个路由器,由两个路由虚拟出一台设备设置终端设备的网关地址,两台物理路由的关系是主从关系,可以设置自动抢占。终端设备的网关是虚拟设备的ip地址,这样,如果有一台路由设备…...

《绝区零》是一款什么类型的游戏,Mac电脑怎么玩《绝区零》苹果电脑玩游戏怎么样
米哈游的《绝区零》最近在网上爆火呀,不过很多人都想知道mac电脑能不能玩《绝区零》,今天麦麦就给大家介绍一下《绝区零》是一款什么样的游戏,Mac电脑怎么玩《绝区零》。 一、《绝区零》是一款什么样的游戏 《绝区零》是由上海米哈游自主研发…...

Mysql sql技巧与优化
1、解决mysql同时更新、查询问题 2、控制查询优化 hint 3、 优化 特定类型的查 优化 COUNT() 查询 使用 近似值 业务能接受近似值的话,使用explain拿到近似值 优化关联查询 优化子查询 4、优化group by和distinct 优化GROUP BY WITH ROLLUP 5、优化 limit分页 其他…...

7.SpringBoot整合Neo4j
1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-neo4j</artifactId> </dependency> 说明:这里引入neo4j的版本跟spring框架的版本有关系。需要注意不同的版本在neo…...

教室管理系统的开发与实现(Java+MySQL)
引言 教室管理系统是学校和培训机构日常运营中不可或缺的工具。本文将介绍如何使用Java、Swing GUI、MySQL和JDBC开发一个简单而有效的教室管理系统,并涵盖系统的登录认证、教室管理、查询、启用、暂停和排课管理功能。 技术栈介绍 Java:作为主要编程…...
Go的入门
一、GO简介 Go语言(也叫 Golang)是Google开发的开源编程语言。 1. 语言特性 Go 语法简洁,上手容易,快速编译,支持跨平台开发,自动垃圾回收机制,天生的并发特性,更好地利用大量的分…...

windows中使用Jenkins打包,部署vue项目完整操作流程
文章目录 1. 下载和安装2. 使用1. 准备一个 新创建 或者 已有的 Vue项目2. git仓库3. 添加Jenkinsfile文件4. 成功示例 1. 下载和安装 网上有许多安装教程,简单罗列几个 Windows系统下Jenkins安装、配置和使用windows安装jenkins 2. 使用 在Jenkins已经安装的基础上,可以开始下…...
RocketMQ中概念知识点记录 和 与SpringBoot集成实现发送 同步、异步、延时、批量、tag、key、事务消息等
1. 消息模型 消息(Message): 是 RocketMQ 中数据传输的基本单位,由主题、标签、键值、消息体等组成。主题(Topic): 消息的分类,类似于邮件的主题,用于对消息进行粗粒度的分类。标签(…...

云计算实训09——rsync远程同步、自动化推取文件、对rsyncd服务进行加密操作、远程监控脚本
一、rsync远程同步 1.rsync基本概述 (1)sync同步 (2)async异步 (3)rsync远程同步 2.rsync的特点 可以镜像保存整个目录树和文件系统 可以保留原有权限,owner,group,时间,软硬链…...

【DGL系列】DGLGraph.out_edges简介
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 函数说明 用法示例 示例 1: 获取所有边的源节点和目标节点 示例 2: 获取特定节点的出边 示例 3: 获取所有边的边ID 示例 4: 获取所有信息&a…...

掌握品质之钥:ISO9001质量管理体系认证的巨大价值
在当今竞争激烈的市场环境中,企业若要脱颖而出并持续成功,就必须确保其产品和服务质量始终如一。ISO9001质量管理体系认证正是帮助企业实现这一目标的关键工具。本文将深入探讨ISO9001认证的巨大价值以及它如何助力企业提升竞争力、优化内部管理并赢得客…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...