微信扫码
与创始人交个朋友
我要投稿
在人工智能领域,模型的规模通常由其参数的数量来衡量。以GPT-3为例,它拥有惊人的1750亿个参数,而Grok-1更是达到了3140亿个参数的庞大规模。然而,并非所有模型都如此庞大,像Llama这样的模型,其参数数量则在70亿到700亿之间,相对更为精干。
这些参数并非指训练数据的量,而是模型内部的构成要素。可以把它们想象成模型的"神经元",数量越多,模型处理信息的能力就越强,对数据中复杂关系的把握也就越精准。这些"神经元"赋予了模型更高级的认知能力,使其在执行任务时能够更加出色。
模型中的参数就像是构建语言理解世界的"建筑师"。它们通过精心设计的算法和训练过程,逐步塑造出模型对语言的深刻理解。每个参数都扮演着特定的角色,协同工作,以确保模型能够准确捕捉语言的细微差别,并提供恰当的回应。
那么,这些构成大模型的参数是如何组织的呢?简单来说,它们是由多层的神经网络构成,每一层都包含大量的节点,节点之间通过权重连接。这些权重,也就是参数,会在训练过程中不断调整,以最小化模型预测与实际结果之间的差异。通过这种方式,模型学会了如何根据输入数据生成准确的输出,从而实现对语言的深入理解和有效回应。
在大型人工智能模型中,参数是其核心组件,它们各司其职,共同构成了模型的复杂网络。以下是一些主要类型的参数及其功能:
权重(Weights):权重类似于神经网络中的连接线,它们调节信息流动的强度。在全连接层中,权重矩阵W充当了特征之间联系的桥梁,指导模型识别哪些输入特征对预测输出特征最为关键。
偏置(Biases):偏置是神经元的调节器,它们设定了神经元激活的起点,帮助模型确定何时以及如何响应输入信号。
注意力机制参数(Attention Parameters):在基于Transformer架构的模型中,这些参数充当了信息筛选的指南,指导模型集中注意力于最有价值的数据点。它们包括查询(Query)、键(Key)和值(Value)矩阵,帮助模型在大量信息中识别出关键线索。
嵌入矩阵(Embedding Matrices):嵌入矩阵是模型处理文本数据时的“词汇库”。每个词汇通过一个向量表示,使得模型能够理解并处理语言信息。
隐藏状态初始化参数(Initial Hidden State Parameters):这些参数为模型的初始状态设定基调,指导模型从何处开始处理和分析数据。
这些参数通常以以下四种格式进行表达和存储:
Float:32位浮点数,占用4字节,提供高精度的数值表示。
Half/BF16:16位浮点数,占用2字节,是一种节省空间的数值表示方式。
Int8:8位整数,占用1字节,常用于模型的量化,以减少模型大小和提高运算效率。
Int4:4位整数,占用0.5字节,进一步压缩数值表示,尽管精度可能有所降低。
参数的数量是衡量模型性能的关键指标之一。例如,一个拥有13亿个Int8参数的模型,通常在性能上会优于同一架构但只有7亿个BF16参数的模型。这是因为参数数量的增加可以提供更丰富的信息处理能力,从而提升模型的整体性能。
对于工程师而言,面对的是大模型训练或推理时会使用多少的内存资源。尽管 V100(有32 GB 的 GPU 内存)或 A100(有40 GB 的 GPU 内存)很强大,然而,大模型却并不能使用 Tensorflow 或 PyTorch 的单个 GPU 上进行训练。
在人工智能模型的训练过程中,内存的存储需求主要来自于模型状态的维护和激活过程的数据积累。具体来说,模型状态涵盖了优化器状态、梯度以及参数,它们都以张量的形式存在。激活过程则涉及到在正向传播中生成的张量,这些张量对于反向传播中的梯度计算至关重要。
在训练的每一个阶段,对于模型中的每一个参数,都需要有足够的GPU内存空间来存储以下数据:
模型参数的副本:每个参数都需要占用一定的内存空间来存储其副本,这里我们用字节数x来表示。
梯度的副本:与模型参数类似,梯度也需要占用内存空间,这里用字节数y来表示。
优化器状态:优化器状态通常需要12个字节的存储空间,它包括了参数、方差等信息的拷贝。为了保证训练过程的稳定性并避免数值计算中出现异常,所有优化器状态都会以FP32(32位浮点数)格式保存。
因此,整个训练过程中,所需的内存总量可以由以下公式来估算:
(x+y+12 ) * model_size
在执行推理任务时,我们利用已经训练好的大型语言模型(LLM)来完成诸如文本生成或翻译等任务。与训练阶段相比,推理阶段的内存需求通常较低,主要由以下几个因素决定:
有限的上下文需求:推理过程中处理的输入序列较短,因此需要较少的内存来存储与这些较小文本块相关的激活信息。
无需反向传播:与训练阶段不同,推理阶段不需要进行反向传播,这是一种在训练中用于调整模型参数的技术。由于不需要保留用于反向传播的中间值,推理阶段的内存开销大幅减少。
根据模型的参数规模和精度类型,推理阶段所需的内存可以估算如下:对于一个7亿参数的模型,使用浮点数精度(FP32)的内存需求大约为28GB,使用16位浮点数(BF16)的内存需求约为14GB,而使用8位整数(Int8)的内存需求则为7GB。这些估算可以作为其他模型版本的参考。
当对LLM进行特定任务的微调时,内存需求会有所增加。微调通常涉及更长的训练序列,以便更好地捕捉目标任务的细节。处理更多的文本数据会导致更大的激活,而反向传播过程则需要存储用于梯度计算的中间值,这些值在训练期间用于更新模型权重。与推理阶段相比,微调阶段的内存负担显著增加。
l:Transformer模型中的层数。
a:每个注意力机制中的头(head)数量。
b:批次大小,即每次训练迭代中处理的样本数量。
s:序列长度,即每个样本中的元素数量。
h:隐藏层的维度大小,即模型内部表示的大小。
p:精度,影响每个参数所需的存储空间。
softmax((XQ)(XK)^T)XV
当我们探讨基于Transformer架构的大型模型在训练阶段所需的内存时,我们需要考虑几个关键参数,包括层数、注意力头的数量、批次大小、序列长度以及隐藏层的维度和精度。以下是对所需内存的计算和解释:
输入数据量:表示为`bshp`,即批次大小(b)、序列长度(s)、隐藏层维度(h)和精度(p)的乘积。这代表了模型处理的输入数据的总大小。
线性层:在Transformer的线性层部分,我们大约需要`9bshp + bsh`的空间来存储激活后的值。这包括了线性变换和后续操作所需的内存。
注意力机制:对于标准的自注意力(self-attention)操作,我们首先需要为查询(Q)、键(K)和值(V)各分配`bshp`大小的空间。在多头注意力机制中,每个头都需要单独的`s * s`矩阵来存储结果,这需要`abssp`字节的空间。由于有a个头,总空间需求为`a * abssp`。此外,softmax操作后的输出也需要相同的空间,再加上掩码所需的`abss`字节,因此注意力部分的总内存需求为`2abssp + abss`。
归一化层:Transformer中通常包含两个归一化层(Norm layer),每个层都需要`bshp`大小的空间,因此总共需要`2bshp`。
将这些部分加起来,基于Transformer的大模型在训练时所需的内存可以近似表示为:
L(9bshp+bsh+2abssp+abss +2bshp) = Lbshp[16+2/p+(as/h)(2+1/p)]
这里的公式表明,训练所需的内存大约是模型层数(L)与批次大小、序列长度、隐藏层维度和精度的函数。这个表达式提供了一个理论下界,即在训练基于Transformer的大模型时,内存需求的一个基本估计。
模型的层数 x 训练批次的大小 x 序列长度 x 隐藏层的维度 x 精度 x 大于16的整数
基于Transformer的大模型在训练时的内存需求取决于多个因素,包括模型的复杂性、数据的规模和精度。通过上述公式,我们可以对所需的内存进行初步的估计,以确保训练过程的顺利进行。
有了大模型参数对内存的要求, 可以进一步估算大模型在训练和推理中所需的GPU数量。但由于GPU数量估算依赖的参数稍多,有人(Dr. Walid Soula,https://medium.com/u/e41a20d646a8)给出了一个粗略估算的简单公式, 在工程上同样有一定的参考意义。
其中,
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 , 当然,这些只是一般意义的粗略估计。
深入理解大型模型参数的构成及其对内存和GPU资源的需求,对于掌握分布式训练在实际工程中所面临的挑战至关重要。
使用TensorFlow或PyTorch等专为分布式训练设计的框架,可以极大地简化分布式训练策略的实施。这些框架提供了丰富的工具和API,帮助开发者更高效地进行训练。例如,通过梯度累积技术,我们可以在更新模型之前累积多个批次的梯度;而梯度压缩技术则可以减少节点间的数据传输量,有效降低通信成本。同时,确定分布式训练中的最优批次大小(即参数b)也非常关键,因为批次大小过小会增加通信开销,而过大则可能导致内存不足。
LLMOps(大型语言模型操作)的重要性日益增加。定期监控分布式训练的性能指标,调整超参数、分区策略和通信设置以优化性能,是提升训练效率的关键步骤。此外,实施模型的检查点机制并在发生故障时进行有效恢复,可以确保训练过程在无需重新开始的情况下继续进行。
换句话说,大型模型的训练和推理本质上是分布式系统架构工程的挑战,包括但不限于:
通信开销:在执行梯度计算和数据更新时,节点间的通信时间可能会影响整体的加速效果。
同步复杂性:在多台机器并行训练时,同步操作的复杂性需要精心设计以避免瓶颈。
容错与资源管理:单点故障对模型训练和推理的影响,以及CPU与GPU资源的分配与调度策略,都是需要考虑的问题。
掌握大型模型编程的范式,特别是面向Prompt的编程,可以通过阅读相关文献如《解读提示工程(Prompt Engineering)》、《Agent 应用于提示工程》以及《提示工程中的10个设计模式》来深入了解。
在使用大型模型生成文本时,我们可以通过调节三个关键参数来优化输出:Temperature、Top-K和Top-P。
1. Temperature参数:这个参数常被误认为仅控制模型的创造性,但实际上它更深层次地调节了概率分布的平滑度。当Temperature值较高时,概率分布变得更加平滑和均匀,这有助于模型产生多样化和富有创造性的文本。而当Temperature值较低时,概率分布会变得更加集中,模型倾向于生成与训练数据更相似的文本。
2. Top-K参数:此参数通过限制模型在每个步骤中只考虑最可能的Top-K个标记来减少输出中的不连贯或无意义内容。这种方法在保持输出的高可能性一致性的同时,也允许一定程度的创造性。
3. 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将在这36个标记中进一步筛选,直到累积概率达到0.7。最后,这个筛选后的集合将被重新归一化,用于模型的采样过程。
在工程应用中,深入理解大型模型的参数至关重要。这些参数是模型功能和表现的核心,它们决定了模型的运作方式、效率、成本以及对资源的依赖程度。掌握大型模型的参数,意味着要深入探讨模型的复杂性、效能以及它们之间的相互关系。通过从存储和计算的角度出发,合理地配置和调整这些参数,我们可以在实际的工程任务中更精准地选择和调整模型,以满足特定的任务需求和在有限资源条件下实现最优性能。
推荐阅读
?AI大模型50个变现应用场景。 百度创始人、董事长兼首席执行官李彦宏呼吁:“大家不要卷模型,要卷应用!”
? 智能交通信号:为何高德、百度导航能告诉你还有几秒变绿灯?你还以为是有关系接入交警系统了吗?这篇专利来揭晓答案!
? 震惊!OpenAI突然封杀中国,背后竟是这位美国神秘将军?
如果你觉得“小迪说AI”公众号或这篇文章对你有帮助,别忘了给我点赞、在看、转发分享给更多的朋友。有任何问题或者想法,欢迎在评论区留言和我一起讨论。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-05-28
2024-04-26
2024-08-21
2024-08-13
2024-04-11
2024-07-09
2024-07-18
2024-10-25
2024-07-01
2024-06-16