01 背景
各个公司相继推出大模型, 有开源和不开源,有些技术爱好者也开始心痒难耐,萌生了私有本地模型,甚至有伙伴构建大模型并进行训练的想法, 大模型不仅比拼技术, 也是比拼爹(资源)的存在, 我个人在实战经历经常问自己,到底需要什么样配置才能跑起来这个模型, 完成这个实验目标, 由此引发对估算大模型需要的GPU显存的进一步了解.
02 模型参数量
如下图(来源于网络), 我们经常会看到模型名称带70B、14B、32B等字眼,这些就是表示模型参数的个数, 反映出模型大小, b代表英文单词“billio****n”的意思, 也就是10亿. 所以70B就是700亿个参数左右, 14B就是140亿个参数左右, 32B就是320亿个参数左右. 在大模型以前的时代, 也有一些比较小模型,单位一般都是M(百万)为计算单位, LLM出现之后, 基本模型参数数量基本是以亿为基本单位.
03 参数精度
影响模型占用显存大小,除了参数量, 还有参数精度,所谓参数精度,就是参数的数据类型. 我们之前在《Transformer原理》中学到Transformer, 神经网络一般都是用具体数字表示, 所以我们这里所说的参数数据类型都是浮点数, 常见浮点数的精度类型有以下几种:
类型 | 描述 | 说明 |
float64 | 双精度浮点数 (64位) | 双精度浮点数提供更高的精度,适用于需要更高数值精度的应用,但会占用更多的内存。占用8个字节(64位) |
float32 | 单精度浮点数 (32位) | 单精度浮点数用于表示实数,具有较高的精度,适用于大多数深度学习应用。4字节(32位) |
float16 | 半精度浮点数 (16位) | 半精度浮点数用于表示实数,但相对于单精度浮点数,它的位数较少,因此精度稍低。然而,它可以在某些情况下显著减少内存占用并加速计算。字节数:2字节(16位) |
int32, int64 | 整数 (通常为32位或64位) | 整数用于表示离散的数值,可以是有符号或无符号的。在某些情况下,例如分类问题中的标签,可以使用整数数据类型来表示类别。 字节数:通常为4字节(32位)或8字节(64位 |
int4 | 量化技术:int4 (4位整数) | int4使用4位二进制来表示整数。在量化过程中,浮点数参数将被映射到一个有限的范围内的整数,然后使用4位来存储这些整数。 |
int8 | 量化技术 int8(8位整数) | 含义:int8使用8位二进制来表示整数。在量化过程中,浮点数参数将被映射到一个有限的范围内的整数,然后使用8位来存储这些整数。 字节数:1字节(8位) |
模型参数精度的选择往往是一种权衡。使用更高精度的数据类型可以提供更高的数值精度,但会占用更多的内存并可能导致计算速度变慢。相反,使用较低精度的数据类型可以节省内存并加速计算,但可能会导致数值精度损失. 关于量化技术,等后面单独给大家仔细讲解.以下一张图可以先大概了解量化的过程:
上图来源于网络
有了参数个数和每个参数的数据类型, 我们就可以开始估算GPU显存大小, 但是推理和训练又不太一样. 推理一般相对训练需要的资源要少, 接下来我们分为2大块内容介绍一下,在推理和训练分别需要的资源是多少?
03 推理显存组成
3.1 模型权重: 主要由模型的参数个数* 参数的数据类型占用字节数
3.2 输入数据大小: 数据维度和batchsize(批次大小), 所以现在大模型api一般都用输入token和输出token进行收费
3.3 推理中间结果:在模型的推理过程中,可能会产生一些中间计算结果,这些中间结果也会占用一定的显存。
04 训练显存组成
4.1 模型权重: 主要由模型的参数个数* 参数的数据类型占用字节数。
4.2 梯度 : 计算梯度用于更新模型的参数值, 梯度数量与模型参数是相同。
4.3 优化器参数: 一般优化器需要保存一些参数状态,以便更新调整,不同的优化器占用的显存大小是不一样的,比如SGD和参数数量是一样的, 而AdamW是参数的2倍
4.4 输入数据: 数据维度和batchsize(批次大小)
4.5 训练中间结果:在模型的训练前向传播和后向传播过程中,可能会产生一些中间计算结果,这些中间结果也会占用一定的显存。
05估算LLama3-8b
假设参数精度是float32,那就是4个字节:
5.1模型参数
如果显存不够,可以用FP16精度,或者更低,一般都是2倍关系
5.2梯度大小:一般和模型一样的大小29.8GB
5.3 优化器参数: 以Adamw 为例优化器参数是模型参数的2倍, 29.8*2GB
5.4 中间激活:对于每一层,都会有一些中间的激活值。这些激活值的数量通常与模型的宽度和输入数据的大小有关。假设每层的激活需X个浮点数,那么激活的总大小为:X*4字节
5.5 输入数据的激活大小: 假设批次大小为B, B*X*4字节,
所以如果是推理的话基本是29.8GB+中间激活+输入数据激活大小即可, 差不多在30GB左右,但是如果训练的话, 那就4倍以上.
06 总结
上面所说的推理大小也是不考虑用户并发的情况,如果考虑并发的情况永不止这些. 由于训练所需要的资源是巨大,现在为了让普通人也能训练大模型, 行业内已经出现一些相关技术,比如上面所说量化,如果使用量化int8,基本是上面计算的1/4左右, 模型切分、混合精度计算、微调框架等等.
有人说,那每一次我要估算资源,都要充分了解模型结构,然后再计算, 当然不用了,现在HuggingFace的官方库Accelerate直接推出了一个在线大模型显存消耗资源估算工具Model Memory Calculator, 有在线版和官方版本,可以帮大家快速计算出来, 即使有工具,我们也要知道其中原理, 这样我们才能知其然知其所以然也.
注意: 如果有需要工具如何使用,可以关注我的公众号, 回复“大模型显存计算工具Model Memory Calculator”
感谢您完成阅读
推荐阅读:
【小白入门篇1】GPT到底是怎样练成?
【小白入门篇2】总有一款AI工具适合你
【小白入门篇3】还是GPT4更香
【小白入门篇4】兄弟,你还在网上盗图吗
【小白入门篇5】哪些免费GPU羊毛可以薅?