7B?13B?175B?解读大模型的参数

2024-06-03 10:52
文章标签 参数 模型 解读 7b 13b 175b

本文主要是介绍7B?13B?175B?解读大模型的参数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大模型也是有大有小的,它们的大小靠参数数量来度量。GPT-3就有1750亿个参数,而Grok-1更是不得了,有3140亿个参数。当然,也有像Llama这样身材苗条一点的,参数数量在70亿到700亿之间。

ff2d8e014335106eef4e0287e352468c.jpeg

这里说的70B可不是指训练数据的数量,而是指模型中那些密密麻麻的参数。这些参数就像是一个个小小的“脑细胞”,越多就能让模型更聪明,更能理解数据中那些错综复杂的关系。有了这些“脑细胞”,模型在处理任务时可能就会表现得更好。

大模型的这些参数就像是模型内部的“建筑师”,通过复杂的算法和训练过程,一点一滴地搭建起这个庞大的语言世界。每个参数都有它的作用,它们共同协作,让模型能够更准确地理解我们的语言,并给出更合适的回答。

那么,大模型中的参数是怎样构成的呢?

1. 大模型中的参数

大模型参数是其“内部零件”,这些零件各有各的用途,通常包括但不限于以下几类:

  • 权重(Weights):权重就像神经网络里的“电线”,连接着各个神经元。它们负责调整信号传递时的“音量”,让重要的信息传得更远,不那么重要的信息就小声点。比如在全连接层里,权重矩阵W就是一张“地图”,告诉我们哪些输入特征和输出特征关系最密切。

  • 偏置(Biases):偏置就像是神经元的“小助手”,负责给神经元的响应定个基准。有了它,神经元就知道自己该在什么水平上活跃了。

  • 注意力机制的参数(Attention Parameters):在基于Transformer的模型中,这些参数就像是“指南针”,告诉模型哪些信息最值得关注。它们包括查询矩阵、键矩阵和值矩阵等,就像是在一大堆信息中找出最关键的“线索”。

  • 嵌入矩阵(Embedding Matrices):在处理文本数据时,嵌入矩阵就是模型的“字典”。每一列都代表一个词汇,用一个数来表示这个词。这样,模型就能理解文本的意思了。

  • 隐藏状态初始化参数(Initial Hidden State Parameters):这些参数就是用来设置模型最初的隐藏状态的,就像是给模型定个基调,让它知道从哪里开始“思考”。

  • ......

这些参数一般会使用4种表达和存储的格式:

  1. Float: 32比特的浮点数,即4字节

  2. Half/BF16: 16比特的浮点数,即2字节

  3. Int8: 8比特的整数,即1字节

  4. Int4: 4比特的整数,即0.5字节

一般来说,参数的数量是影响大模型性能的主要因素。例如,13B-int8模型通常优于同一体系结构的7B-BF16模型。

eee0eed7143ed960d89fde52674c23e9.jpeg

2. 大模型参数对内存的需求

对于工程师而言,面对的是大模型训练或推理时会使用多少的内存资源。尽管 V100(有32 GB 的 GPU 内存)或 A100(有40 GB 的 GPU 内存)很强大,然而,大模型却并不能使用 Tensorflow 或 PyTorch 的单个 GPU 上进行训练。

2.1 训练阶段的内存需求

在模型训练期间,主要体现为模型状态和激活过程对内存的存储需求。模型状态包括由优化器状态、梯度和参数组成的张量。激活过程中包括在正向通道中创建的任何张量,这些张量是在反向通道中梯度计算所必需的。

在训练的任何时候,对于每个模型参数,总是需要有足够的 GPU 内存来存储:

  • 模型参数复制的字节数x

  • 梯度复制的字节数y

  • 优化器状态一般为12个字节,主要是参数、方差等的拷贝,会将所有优化器状态保存在 FP32中,以保持稳定训练并避免数值异常。

这意味着,训练时需要如下内存来存储所有的模型状态和过程数据:

(x+y+12 ) * model_size

2.2 推理阶段的内存需求

推理阶段利用预先训练好的 LLM 完成文本生成或翻译等任务。在这里,内存需求通常较低,主要的影响因素:

  • 有限的上下文: 推理通常处理较短的输入序列,需要较少的内存来存储与较小的文本块相关的激活。

  • 无反向传播: 在推理过程中,LLM 不需要保留反向传播的中间值,这是一种用于训练调整参数的技术。这消除了大量的内存开销。

推理阶段所需的内存不会高于相同参数计数和类型的训练阶段所需内存的四分之一。例如,对于一个7B的模型而言,大体上,使用浮点精度需要28GB内存,使用BF16精度需要14GB内存,使用int8精度需要7GB内存。这个粗略的估计方式可以相应地应用到其他版本的模型。

另外,当根据特定任务调整 LLM 时,微调需要更高的内存占用。微调通常包括更长的训练序列来捕捉目标任务的细微差别。当 LLM 处理更多的文本数据时,这将导致更大的激活。反向传播过程需要存储用于梯度计算的中间值,这些中间值用于在训练期间更新模型的权重。与推理相比,这增加了大量的内存负担。

2.3 基于Transformer的大模型的内存估算

具体而言, 对应基于Transformer的大模型,尝试计算一下训练时所需的内存,其中设:

  • l :transformer的层数

  • a:attention 的head 数量

  • b:批次大小

  • s:序列长度

  • h:隐藏层的维度大小

  • p:精度

这里, bshp = b * s * h * p 代表了输入数据量的大小。在transformer 的线性层部分,大概需要9bshp+bsh 的空间来用于后面的激活。在attention 部分,self-attention 可以表达为:

softmax((XQ)(XK)^T)XV

那么,XQ,XK,XV均需bshp大小的空间。在标准self-attention中,乘法(XQ) * (XK) ^ T 的结果只是一个包含 logit 的 b * s * s 矩阵。然而在实践中,由于使用了多头注意力机制,需要为每个头都要建立一个单独的 s * s 存储空间。这意味着需要 abssp 字节的空间,而存储 softmax 的输出也同样需要 abssp 字节。在 softmax 之后还一般需要额外的 abss 字节来存储掩码,所以 attention部分需要2abssp+abss的存储空间。

此外,transformer中还有两个Norm layer,每个仍需bshp的存储空间,共2个bshp。

所以,基于Transformer 的大模型训练所需内存大约为:

L(9bshp+bsh+2abssp+abss +2bshp) = Lbshp[16+2/p+(as/h)(2+1/p)]

解释一下,训练基于Transformer 的大模型所需内存大约是:

模型的层数 x 训练批次的大小 x 序列长度 x 隐藏层的维度 x 精度 x 大于16的整数

这或许就是基于Transfromer的大模型参数对训练时内存需求的一个理论下界。

3. 大模型参数对GPU 的需求

有了大模型参数对内存的要求, 可以进一步估算大模型在训练和推理中所需的GPU数量。但由于GPU数量估算依赖的参数稍多,有人(Dr. Walid Soula,https://medium.com/u/e41a20d646a8)给出了一个粗略估算的简单公式, 在工程上同样有一定的参考意义。

188272d16364e5f61c4152a2b3e2931c.jpeg

其中,

  • Model’s parameters in billions 是以B为单位的模型参数数量;

  • 18是训练期间不同组件的内存占用因子;

  • 1.25 代表了激活过程所需的内存数量因子,激活是随着模型处理输入数据而变化的动态数据结构。

  • GPU Size in GB是可用的 GPU 内存总量

举个实际的例子,假设使用的是 NVIDIA RTX 4090 GPU,它有24GB 的 VRAM,计算一下训练‘ Llama3 7B’模型所需的 GPU 数量,大约为 :

GPU 的总数≈(7 * 18 * 1.25)/24,大约等于7

对于推理而言, 可以简化为训练阶段的1/8~1/9 , 当然,这些只是一般意义的粗略估计。

4. 由大模型参数到分布式训练

理解大模型参数的组成及其对内存和GPU的需求,有助于深入掌握分布式训练在工程实践中所面临的挑战。

采用专为分布式训练设计的框架,例如TensorFlow或PyTorch,可以显著简化分布式训练策略的实施过程,这些框架提供了丰富的工具和API。通过运用梯度累积等技术在更新模型前,或利用梯度压缩等技术减少节点间的数据交换量,可以有效降低通信成本。确定分布式训练的最佳批次大小(即前文提到的参数b)至关重要;b值过小可能增加通信开销,而过大则可能导致内存不足。

LLMOps的重要性日益凸显。定期监控为分布式训练配置的性能指标,调整超参数、分区策略和通信设置以优化性能,是提升训练效率的关键。实施模型的检查点机制并在发生故障时进行有效的恢复,可以确保训练过程在无需从头开始的情况下继续进行。

换句话说,大模型的训练/推理本质上是一个复杂的分布式系统架构工程挑战,例如:

  • 通信开销:在执行梯度计算和数据更新时,通信所需时间可能会影响整体的加速效果。

  • 同步复杂性:多台机器并行训练时,同步的复杂性需要谨慎设计。

  • 容错与资源管理:单点故障对模型训练和推理的影响,以及CPU与GPU的资源分配与调度策略。

  • ......

然而,实际上大多数工程师可能并不直接参与具体的训练工作,而是关注在构建应用时可以如何利用大模型的参数。

0171d4ac1ba01f625c16b49fca69de91.jpeg

5. 大模型应用中使用的参数

了解大模型应用的编程范式,即面向Prompt的编程,可以参考相关文字如《解读提示工程(Prompt Engineering)》和《Agent 应用于提示工程》以及《提示工程中的10个设计模式》。

这里主要关注在使用大模型输出文本时,可以配置的三个参数:Temperature、Top-K和Top-P。

Temperature参数通常被误解为仅控制模型创造性的开关,但其实它更深层的作用是调节概率分布的“软性”。当Temperature值设置较高时,概率分布变得更柔和、均匀,这促使模型生成更多样化、具创造性的输出。反之,较低的Temperature值会使分布更尖锐,峰值更明显,从而倾向于产生与训练数据类似的输出。

Top-K参数用于限制模型在每个步骤中输出最可能的Top-K个标记,通过这种方式可以减少输出中的不连贯或无意义内容。这种策略在维持输出的最有可能的一致性与允许一定程度的创造性抽样之间形成平衡。

Top-P是另一种解码方法,它根据设定的P值(0≤P≤1)来选择一组累积概率超过P值的最小单词集合作为输出。这种方法使得选中的单词数量能够根据下一个单词的概率分布动态地增加或减少。特别地,当P值为1时,Top-P会选择所有单词,相当于从整个分布中抽样,从而产生更加多样的输出;而当P值为0时,Top-P仅选择概率最高的单词,类似于贪婪解码,使输出更加集中和一致。

这三个参数共同作用,影响模型的行为。例如,当设置Temperature=0.8、Top-K=36以及Top-P=0.7时,模型首先基于上下文计算整个词汇表的完整非规范化对数概率分布。Temperature=0.8意味着每个对数概率除以0.8,这在归一化前有效地增加了模型对其预测的信心。Top-K=36表示选择具有最高频比例对数概率的36个标记。接着,Top-P=0.7在这个Top-K=36集合中应用过滤,按概率从高到低保持排序,直到累积概率达到0.7。最后,将这个过滤后的集合重新归一化,用于后续的采样过程。

6. 小结

在工程实践中,理解大模型的参数是有意义的。参数在大模型中起着决定性的作用,它们定义了大模型的行为、性能、实现的成本以及对资源的需求。在工程上理解大模型的参数,就是要把握模型的复杂度、性能和能力之间的关系。从存储和计算的视角合理配置和优化这些参数,可以在实际应用中更好地选择和优化模型,以适应不同的任务需求和资源限制。

【参考资料与关联阅读】

这篇关于7B?13B?175B?解读大模型的参数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026779

相关文章

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用