大模型推理和训练所占用的显存怎么估算?
原创 安泰Rolling AI有温度 2024年11月14日 00:00 上海
AI因你而升温,记得加个星标哦!
在当前开源大模型中,我们可以观察到一个普遍的现象:开源可下载模型的参数规模都集中在7B、13B、65B等特定的数值上,那这种现象背后有着怎样的原因呢?
匹配显卡显存
开源模型是为了让大家易部署易传播,所以模型参数量的设计主要是为了能匹配大众使用显卡的显存,让大家在消费级显卡上就可以把模型跑起来。
我们大众消费级显卡的显存一般为4/8/16/24G,那么大模型参数量和占用显存怎么换算?可分为两部分,大模型推理部署和大模型训练。
大模型推理部署所需显存
目前模型的参数绝大多数都是float32类型,即1个参数占用4个字节。所以一个粗略的计算方法就是,每10亿(1B)个参数,约占用4G显存(其中1G=1024M,1M=1024K,1K=1024字节。除了参数外,在推理时比如输入输出数据、计算图等还需消耗一定的显存):
所以1个7B的大模型部署,大约需要28G,两张16G显卡为32G,刚好可以满足。
如果想用1张显卡部署,就可以用半精度(FP16)来加载模型,这样每个参数只占2个字节,所需显存就降为一半,只需要14G显存,那么一张16G的显卡就可以部署了。
如果有块3070显卡,一般是8G显存,还能部署吗?当然可以!资本会为你考虑的。可以采用int8精度,显存再降一半,仅需7G显存。但是相对应的,随着精度越低,模型效果也会更差一些。
同理,如果使用目前int4的最低精度,有3.5G显存就能跑起来7B模型。
dtype | 每10亿(1B)参数需要占用内存 |
---|---|
float32 | 4G |
fp16/bf16 | 2G |
int8 | 1G |
int4 | 0.5G |
根据上表,就可以推算出大模型部署所需要的显存。比如:
-
13B模型使用全精度部署至少需要52G显存,一块80G显卡可以满足
-
13B模型使用半精度部署至少需要26G显存,一块40G显卡可以满足
-
65B模型使用全精度部署至少需要260G显存,四块80G显卡可以满足
所以说,模型参数量的设计和我们显卡的显存紧密相关。
大模型训练所需显存
模型训练的实质就是反向传播,公式如下:
-
为原始模型权重
-
为梯度值,若优化器为Adam,就由一阶动量和二阶动量计算得出
所以模型训练时候的显存使用主要包括如下几部分:
模型权重。这是最基本的,训练模型肯定得先把模型加载进来吧,模型权重所需的显存和模型部署所需的权重是一样的。
优化器。我们训练最常用的优化是Adam,而Adam需要同时维护参数的一阶动量和二阶动量两个状态的变量,也就说优化器使用显存是模型权重的2倍。如果采用梯度下降法(SGD),则优化器占用显存就和模型权重一样,因SGD只需维护参数的一阶动量。
梯度值。梯度占用显存空间与模型权重相同。
所以说,如果模型想要训练,只看这3部分,需要的显存是至少推理的3或4倍。除此之外,还有以下部分:
-
模型每层的激活值需要保存,具体看模型的层数与设计
-
batch_size越大,每次需要导入的数据就越多,所需显存就越大。同理,seq_len设计的约长,所需的显存也就越大
-
pytorch/tensorflow等框架采用图结构来计算,图节点也需要存储,所以也需要占用一定的显存
-
还有一些缓存和驱动等等也需要占用一部分显存
以上就是根据模型参数估计显存的大概方法,实际影响显存占用的因素还有很多,所以只能粗略估计个数量级。
如何优化?
目前很多工程师都在为降低显存做着优化工作,比如:
随着模型的变大,主要训练方法还是分布式计算:
标签:显存,训练,部署,占用,显卡,推理,模型 From: https://blog.csdn.net/zengxiaojian3/article/details/144161743