ChatGPT量化分析

文章探讨了随着深度学习模型规模扩大带来的计算资源需求,模型量化技术如何在保持性能的前提下压缩模型,降低存储需求。重点介绍了Transformer结构的模型参数分析、量化方法和不同阶段(训练和推理)的存储占用情况,展示了在实际应用中解决资源限制的重要性。
摘要由CSDN通过智能技术生成

背景

        当今,随着深度学习模型规模的不断增大和计算资源的不断提升,大模型已经成为了人工智能领域的一项重要趋势。大模型在各种任务中展现出了卓越的性能,例如自然语言处理、计算机视觉、语音识别等领域。然而,随着模型规模的增加,模型的计算量和参数数量也随之增长,导致了对计算资源的巨大需求。因此,为了在有限的计算资源下使用大模型,模型量化技术变得至关重要。

        模型量化是指将深度学习模型的参数和计算过程转化为低比特位的表示形式,从而在减少计算资源消耗的同时尽可能地保持模型的性能和精度。通过模型量化,我们可以将原本占用大量内存和计算资源的大型模型压缩成更小、更高效的形式,使其能够在资源受限的环境下运行,例如个人PC设备、移动设备、嵌入式系统等。因此,模型量化技术对于推动人工智能技术在实际应用中的普及和发展具有重要意义。在本篇博客中,我们将探讨模型量化的背景、意义以及一些常见的量化方法和应用场景。

模型结构 

基于Transformer结构的encoder-decoder模型如图:

 encoder编码器将输入词序列(x_1,x_2,...,x_n)转换成一个向量序列(z_1,z_2,...,z_n),decoder解码器生成输出词序列(y_1,y_2,...,y_n)。解码时一个个词按顺序解码,在解码y_i时,根据(z_1,z_2,...,z_n)(y_1,y_2,...,y_{i-1}),生成y_i。 ChatGPT的基础模型为Transformer,采用的是decoder-only结构。

参数量分析

Embedding层

变量定义:d_{model}:词的embedding size;n_{vocab}:词表大小;n_{windows}:上文窗口

对于可训练的position embedding,其参数量为n_{windows}d_{model},一般在整体中占比不大,并且很多模型都为固定参数,因此将它忽略。 所以,embedding层的参数量为:

n_{embedding params}=n_{vocab}d_{model}

 Transformer Blocks层

transformer block计算图如下,每个transformer block的参数分布在两部分中,既multi-head attention和mlp。

 

Multi-head Attention

multi-head attention结构如图:

 变量定义:

d_k:headQ\K矩阵的维度

d_v:head V矩阵的维度

d_{head}d_kd_v往往一样,都表示为d_{head}

n_{heads}:head数量

n_{layers}:transformer block数量

multi-head attention的计算逻辑为:

MultiHead(Q,K,V)=Concat(head_1,head_2,...,head_n)W^o

head_i=Attention(EW_i^Q,EW_i^K,EW_i^V) =softmax(\frac{EW_i^Q(EW_i^K)^T}{\sqrt{d_{head}}})EW_i^V 

MLP

multi-head attention后面,接两层的全连接网络,计算逻辑为:

FFN(x)=gelu(xW_1+b_1)W_2+b_2 

 其中,W_1\in R^{d_{ffn}\times d_{model}}, b_1\in R^{d_{ffn}},W_2\in R^{d_{ffn}\times d_{model}},b_2\in R^{d_{model}}.

所以,mlp的参数量为:n_{mlp params}=2d_{ffn}d_{model}+d_{ffn}+d_{model}

Transformer Block参数量

根据multi-head attention和mlp,n_{layers}个transformer block参数量为:

n_{transformer multi blocks params}=n_{layers}(4n_{heads}d_{model}d_{head}+2d_{ffn}d_{model}+d_{ffn}+d_{model})

 模型总参数量:

n_{params}=n_{vocal}d_{model}+n_{layers}(4n_{heads}d_{model}d_{head}+2d_{ffn}d_{model}+d_{ffn}+d_{model})

 根据GPT3 175B的模型参数配置,并假设n_{vocab}=50000,代入公式计算得到的参数量为174566473728,与175B非常接近。

 各个参数对模型大小的影响力度不同,这里需要特别注意d_{ffn}的配置,如果d_{ffn}=d_{model},GPT3 175B大小的模型将会降低至87B,可见d_{ffn}对模型参数量的影响力度非常大,但它对模型效果影响在论文中并没有提及。

存储占用分析

n_{params}:模型参数量

n_{memory}:存储占用,以byte为单位

 

训练阶段

在训练阶段,采用Adam优化器,Adam超参数:

  • 学习率 \eta \in (0,+\infty ) \left [ default = 0.001 \right ]
  • 惯性项 \rho_1 \in \left [ 0,1\right) \left [ default = 0.9 \right ]
  • 惯性项 \rho_2 \in \left [ 0,1\right) \left [ default = 0.999 \right ]
  • 衰减率 \gamma \in \left [ 0,1\right] \left [ default = 1-10^{-8} \right ]

Adam更新公式:init:m_0=0,v_0=0,t=0

t=t+1

\rho _{1,t}=\rho _1\cdot \lambda ^{t-1}

g_t=\bigtriangledown _mf_t(w_{t-1}))

m_t=\rho _{1,t}\cdot m_{t-1}+(1-\rho _{1,t})\cdot g_t

v_t=\rho _2\cdot v_{t-1}+(1-\rho _2)\cdot g_t^2

\widehat{m_t}=\frac{m_t}{(1-\rho _2^t)}

\widehat{v_t}=\frac{v_t}{(1-\rho _2^t)}

w_t=w_{t-1}-\eta \cdot \frac{\widehat{m_t}}{\sqrt{\widehat{v_t}}+\varepsilon }

 Adam中有m和v两个动量累积值,因此每个模型训练参数会对应4个浮点值,包括参数本身、梯度值、Adam两个动量累积值。这部分参数对精度要求较高,需要用到float32(4 bytes)存储,每个参数占用存储16 bytes。 因此,训练阶段全部模型参数共占用存储为:

n_{params memory}=16n_{params}

 GPT3 175B模型,训练阶段参数存储占用为2595GB。

推理阶段

推理阶段只有前向过程,用float16存储的话,存储占用为:

n_{params memory}=2n_{params}

 

GPT3 175B模型,推理阶段参数存储占用为324GB。可以看到,A100单卡80G也无法放下,需要更低的存储精度或者多级存储方案,或者单机多卡。

中间激活

变量定义:

n_{batch}:样本batch size

n_{sequence}:样本序列长度

TensorFlow、PyTorch、MXNet等深度学习框架以逻辑计算图描述模型,以运行时计算图启动计算,计算图以Tensor(数据)和Operatopn(算子)组织,Operation依赖输入Tensor,通过内部计算得到输出Tensor。更具体一点,前向计算过程中,Operation接收上一Operation产出的激活Tensor和本Operation模型参数Tensor,计算得到激活Tensor给下游Operation,既:

tensor_{output activation}=forwardOperation(tensor_{input activation},tensor_{param})

后向计算过程,除上述Tensor外,还有下游Operation后向传回来的梯度Tensor,既:

tensor_{input\ activation\ grad}, tensor_{param\ grad}\\=backwardOperation( tensor_{input\ activation}, \\tensor_{output\ activation},tensor_{input\ activation\ grad},tensor_{param})

其中,需要tensor_{input\ activation\ grad}传给上游Operation用于后向传播的梯度计算,tensor_{param\ grad}tensor_{param}传给优化器用于梯度更新。模型参数param和其梯度param grad在上一节内容已经包括在内,所以本节只考虑activation相关的Tensor存储占用即可。Operation内部也有中间变量,这些临时变量生命中期较短,因此本文讨论存储占用时,不考虑这部分,只考虑计算图中Operation之间的Tensor。一个Operation的输出Tensor是下游多个Operation的输入Tensor,此Tensor只占用一份存储即可,因此下文统计存储时只考虑Operation的输出Tensor。中间激活也和Operation的数量或粒度有关,细粒度Operation接口的激活值更多,粗粒度Operation将部分激活转化成了内部临时变量,因此接口的激活值更少。

下面按Operation进行分析。训练阶段经常使用混合精度训练,推理阶段也会采用量化,因此下面统一以半精度float16(2 bytes)进行浮点存储和计算。

Embedding

embedding层是lookup操作,输入是词序列,输出形状是\left [ n_{batch},n_{sequence},d_{model} \right ],存储占用为:n_{embending\ memory}=2n_{batch}n_{sequence}d_{model}

Transformer Blocks

transformer block的计算图如下,每个transformer block主要包含四部分,既multi-head attention和mlp,以及两个add&norm。

 

Multi-head Attention

multi-head attention结构如图:

 变量定义:

d_k:headQ、K矩阵的维度

d_v:headV矩阵的维度

d_{head}d_kd_v往往一样,都表示为d_{head}

n_{head}:head数量

n_{layers}:transformer block数量

multi-head attention的计算逻辑为:

MultiHead(Q,K,V)=Concat(head_1,head_2,...,head_n)W^o

head_i=Attention(EW_i^Q,EW_i^K,EW_i^V) =softmax(\frac{EW_i^Q(EW_i^K)^T}{\sqrt{d_{head}}})EW_i^V 

其中W_i^Q\in R^{d_{model}\times d_{head}},W_i^K\in R^{d_{model}\times d_{head}},W_i^V\in R^{d_{model}\times d_{head}}W_i^O\in R^{n_{heads}d_{head}\times d_{model}}

  • 矩阵乘法算子EW_i^Q的输入激活Tensor是E,E在第一个block是词本身embedding和position embedding之和,在其他block是上游block的输出,E的形状为\left [ n_{batch},n_{sequence},d_{model} \right ],乘法输出Tensor形状为\left [ n_{batch},n_{sequence},d_{head} \right ],因此存储占用为2n_{batch}n_{sequence}d_{head}EW_i^KEW_i^VEW_i^Q
  • Softmax算子的输入Tensor为EW_i^QEW_i^K,输出形状为\left [ n_{batch},n_{sequence},d_{model} \right ],存储占用为2n_{batch}n_{sequence}d_{model}
  • softmaxEW_i^V的输入Tensor为\left [ n_{batch},n_{sequence},d_{sequence} \right ]\left [ n_{batch},n_{sequence},d_{head} \right ],输出为\left [ n_{batch},n_{sequence},d_{model} \right ],存储为2n_{batch}n_{sequence}d_{head}
  • 每个head的存储为6n_{batch}n_{sequence}d_{head}+2n_{batch}n_{sequence}d_{sequence}+2n_{batch}n_{sequence}d_{head},共n_{heads}个head,存储占用为n_{heads(6n_{batch}n_{sequence}d_{head}+2n_{batch}n_{sequence}d_{sequence}+2n_{batch}n_{sequence}d_{head})}:;
  • concat的输入为n_{heads}\left [ n_{batch},n_{sequence},d_{head} \right ],输出为\left [ n_{batch},n_{sequence},d_{head}n_{heads} \right ],存储为2n_{batch}n_{sequence}d_{head}n_{heads}
  • concatW^O输入为激活\left [ n_{batch},n_{sequence},d_{head}n_{heads} \right ]和参数\left [ d_{head}n_{heads},d_{model} \right ],输出为\left [ n_{batch},n_{sequence},d_{model} \right ],因此存储为2n_{batch}n_{sequence}d_{model}

实际实现时,往往不会使用concat,而是将多头的Q、K、V合并成大矩阵,因此将concat存储忽略。综上,multi-head attention的输入存储总占用为:

n_{nulti-head\ atttention\ memory}=n_{batch}n_{sequence}(8n_{heads}d_{head}+2n_{heads}d_{sequence}+2d_{model})

 

MLP

multi-head attention后面,接两层的全连接网络,计算逻辑为:

FFN(x)=g(xW_1+b_1)W_2+b_2

其中W_1\in R^{d_{ffn}\times d_{model}},b_1\in R^{ffn}W_2\in R^{d_{ffn}\times d_{model}},b_2\in R^{ffn}

  • 矩阵乘法算子xW_1的输入激活Tensor x是multi-head attention输出,形状为\left [ n_{batch},n_{sequence},d_{model} \right ],输出Tensor形状为\left [ n_{batch},n_{sequence},d_{ffn} \right ],因此存储占用为2n_{batch}n_{sequence}d_{ffn}
  • xW_1+b_1加法部分输入是激活\left [ n_{batch},n_{sequence},d_{ffn} \right ]和参数\left [ d_{ffn},1 \right ],输出是\left [ n_{batch},n_{sequence},d_{ffn} \right ],存储占用为2n_{batch}n_{sequence}d_{ffn}
  • gelu输入和输出都是\left [ n_{batch},n_{sequence},d_{ffn} \right ],输入存储为2n_{batch}n_{sequence}d_{ffn}
  • geluW_2的输入是激活\left [ n_{batch},n_{sequence},d_{ffn} \right ]和参数\left [ d_{ffn},d_{model} \right ],输出是\left [ n_{batch},n_{sequence},d_{model} \right ],输入存储为2n_{batch}n_{sequence}d_{ffn}
  • 加法部分输入是激活\left [ n_{batch},n_{sequence},d_{model} \right ]和参数\left [ d_{model},1 \right ],输出是\left [ n_{batch},n_{sequence},d_{model} \right ],输入存储占用为2n_{batch}n_{sequence}d_{ffn}

综上,mlp部分的存储占用为:

n_{mlp\ memory}=n_{batch}n_{sequence}(6d_{ffn}+4d_{model})

Add&Norm

add部分的输入激活可以与multi-head attention和mlp里的输入共享存储,因此不用计算。norm的输入和输出都是\left [ n_{batch},n_{sequence},d_{model} \right ],两个norm的存储占用为4 n_{batch}n_{sequence}d_{model}。 所以,add&norm部分的存储占用为:

n_{add-norm\ memory}=4 n_{batch}n_{sequence}d_{model}

 

中间激活存储占用

综上,每个transformer block的存储占用为:

n_{transformer\ block\ memory}=n_{multi-head\ attention\ memory}+n_{mlp\ memory}+n_{add-norm\ memory}\\ =n+{batch}n_{sequence}(8n_{heads}d_{head}+2n_{heads}n_{sequence}+10d_{model}+6d_{ffn})

n_{layers}个block,因此总存储占用为:

n_{transformer\ multi\ block\ memory}=n_{layers}n_{multi-head\ attention\ memory}+n_{mlp\ memory}+n_{add-norm\ memory}\\ =n+{batch}n_{sequence}(8n_{heads}d_{head}n_{layers}+2n_{heads}n_{sequence}n_{layers}+10d_{model}+6d_{ffn}n_{layers})

训练阶段

在训练阶段,中间激活需要保留用于反向传播的梯度计算,并且每个激活tensor都对应一个梯度tensor,因此存储占用翻倍,既2n_{transformer\ multi\ block\ memory}。 按GPT3 175B配置计算:

n_{GPT3\ 175B\ train\ memory}= 2n_{transformer\ multi\ block\ memory}\\ =n_{batch}n_{sequence}(99090432+36864n_{sequence})

按sequence=2048的话,每种n_{batch}的存储占用为: 

n_{batch}中间激活存储(GB)
12842624
512170496
1024340992
40961363968

这里将较小的embedding存储忽略,可以看到,相比模型参数部分占用的2595GB,中间激活存储占比更大,需要借助混合并行(数据并行、流水并行、模型并行)、recompute、ZeRO等技术来解决。在batch为128时,存储消耗2595+42624G,需要近600张A100 80G卡。

推理阶段

在推理阶段,中间激活使用完成后可以立即释放。多个block串行计算,block间可以共享内存。block内部有些tensor也串行依赖,tensor使用完成后即可释放。因此,推理阶段最大存储占用比单block存储大小更小一点。 按GPT3 175B配置计算:

n_{gpt3\ 175B\ predict\ memory}< n_{transformer\ block\ memory}\\ =n_{batch}n_{sequence}(516096+192n_{sequence})

n_{batch}=1,n_{sequnce}=2048的话,约为1.7G,相比于模型参数占用324G很小,因此推理阶段存储主要消耗在模型参数上。

参考资料

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ChatGPT是一种强大的自然语言生成模型,它可以用于量化交易领域。量化交易是一种基于数学和统计模型的交易策略,它利用大数据和计算机算法来分析市场数据和交易机会,以进行高频、高效的交易操作。 ChatGPT可以在量化交易中发挥重要作用。首先,它可以通过对市场数据和交易信号的大规模分析,识别出可能的交易机会。ChatGPT可以对大量历史数据进行深入的学习和模式识别,从而识别出市场走势、价格波动等与交易相关的重要特征。 其次,ChatGPT可以进行预测和风险评估。通过对过去数据的学习,它可以生成对未来市场走势和价格波动的预测。这些预测可以帮助量化交易者制定交易策略和决策,降低风险并优化交易利润。 此外,ChatGPT还可以用于量化交易的决策支持。基于对大量历史数据和交易策略的学习,它可以根据特定的市场条件和交易需求,生成与之匹配的交易决策和操作建议。这种智能化的决策支持可以帮助交易者更加理性和高效地进行交易操作。 需要注意的是,ChatGPT作为一个自然语言生成模型,其在量化交易中的应用还需要与其他技术和模型进行结合,如机器学习算法、深度学习模型等。通过综合应用各种模型和算法,可以提高量化交易的精确性和有效性。 总而言之,ChatGPT通过分析市场数据、进行预测和风险评估,以及提供决策支持,可以在量化交易中发挥重要作用。它可以帮助交易者识别交易机会、制定策略和决策,并提高交易的效果和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值