7000559616 * 4 /1024/1024/1024 = 26.08G
这个数字就有点尴尬,专注游戏的Geforce系列最高只有24G,运行不起来,至少得上Tesla系列了。
好在我们可以才用半精度的FP16/BF16
来加载,这样每个参数只占2个字节,所需显存就降为一半,只需要13.04G。游戏学习两不误。
半精度是个不错的选择,显存少了一半,模型效果因为精度的原因会略微降低,但一般在可接受的范围之内。
如果有个3070显卡,8G显存,还有的玩么?可以玩,采用int8的精度,显存再降一半,仅需6.5G,但是模型效果会更差一些。
我的PC机大概10年前配的,GTX 960 4G,当时最顶配!然而现在只能玩玩int4精度,显存再降一半,仅需3.26G。当年我可是花了千把块买的,虽说只能勉强推理7B的大模型,但是也算是上车了。
目前int4就是最低精度了,再往下效果就很难保证了。比如百川给的量化结果对比如下:
注意上面只是加载模型到显存,模型运算时的一些临时变量也需要申请空间,比如你beam search的时候。所以真正做推理的时候记得留一些Buffer,不然就容易OOM。
如果显存还不够,就只能采用Memery Offload的技术,把部分显存的内容给挪到内存,但是这样会显著降低推理速度。
懒人记法表(粗估,有误差)
dtype | 每10亿参数需要占用内存 |
---|
float32 | 4G |
fp16/bf16 | 2G |
int8 | 1G |
int4 | 0.5G |
我还想训练
训练的话就有点复杂了,因为模型训练的时候显存使用包括如下几部分:
-
模型权重,计算方法和上面一样。
-
优化器。
-
如果你采用AdamW,每个参数需要占用8个字节,因为需要维护两个状态。也就说优化器使用显存是全精度(float32)模型权重的2倍。
-
如果采用bitsandbytes优化的AdamW,每个参数需要占用2个字节,也就是全精度(float32)模型权重的一半。
-
如果采用SGD,则优化器占用显存和全精度模型权重一样。
-
梯度
-
计算图内部变量(有时候也叫Forward Activations)
-
比如下面代码
y = self.net_a(x)
z = self.net_b(y)
-
这里面中间的x, y, z都需要存储,但是如果写成下面这样,y就不用存储了。
z = self.net_b(selt.net_a(x))
-
理论上一个net block可以完全用函数给包裹起来,不使用中间变量。下一代计算框架是函数式编程语言?
-
所以这一部分跟模型具体的实现有关系,而且 正比于batch_size 。batch_size越大,这一部分占用的越多。同样的结论也适用于sequence length。
-
一些临时显存占用,先不计算。
所以说,如果模型想要训练,只看前3部分,需要的显存是至少推理的3-4倍。7B的全精度模型加载需要78G ~ 104G。
然后计算图内部变量这一部分只能在运行时候观测了,可以两个不同的batch的占用显存的差值大概估算出来。
以上就是根据模型参数估计显存的大概方法,实际影响显存占用的因素还有很多,所以只能粗略估计个数量级。
剖析完训练时显存占用情况后,优化的思路也就有了,目前市面上主流的一些计算加速的框架如DeepSpeed, Megatron等都在降低显存方面做了很多优化工作,比如量化,模型切分,混合精度计算,Memory Offload等等,大家感兴趣后续可以再给大家分享。
显存容量=显示分辨率×颜色位数/8bit
注意,图片在
显存中的占用空间和存储时的占用空间,是不同的概念,
显存主要是解码后的每个点的数据,文件数据要看你的格式、压缩比、文件头、附加信息等等,因此文件数据和图片在内存和
显存中的数据差别可能会很大。
以下图为例
【深度学习】参数量、模型大小、显存对于一个深度学习神经网络来说,其通常包含很多卷积层,用于不断提取目标的特征,或对目标进行最终定位或者分类。
1 数据存储精度与存储空间
在深度学习神经网络中,最常见的数据格式是float32,占4个字节(Byte)。类似地,float16,占2个字节。1024个字节为1KB,1024x1024个字节为1MB。那么存储10000个参数需要的内存大小为10000x4 Bytes,约为39KB。存储100万个参数需要的内存大小为39x100/......
每次一加载模型GPU的显存就疯狂增加,看了卷积神经网络中参数量的计算与模型占用显存的计算原理才知道原因。之前还一直怀疑自己写的有bug。
感谢https://www.jianshu.com/p/b8d48c99a47c的分享。
下面是我自己结合文章做的一些总结。
占用显存的计算
也就是说我们的模型占用的显存在不同阶段的计算方式是不同的,下面以Vgg16为例。
1.load model
(1)计算...
计算量和参数量都会对显存需求产生影响,但是影响的方式稍有不同。
当计算量增加时,比如模型进行更复杂的计算或处理更大规模的数据,通常会导致显存需求增加。这是因为显存需要存储中间计算结果和临时变量,以支持模型的正向传播和反向传播过程。如果计算量很大,可能需要更多的显存来存储这些额外数据。
而当参数量增加时,通常会导致模型本身的体积变大,从而需要更多的显存来存储模型参数。参数量大意味着模型有更多的可调整参数,可以提供更丰富的表达能力和更精确的预测结果。但同时也需要更多的显存来存储这些参数。
总的来说,计算量和参数量都可能导致显存需求增加,但具体情况取决于模型的设计和任务的要求。在实际应用中,需要根据计算资源和显存限制来选择合适的模型大小和计算策略。
人工智能大模型讲师培训咨询叶梓:
超详细LLama2+Lora微调实战
人工智能大模型讲师培训咨询叶梓:
超详细LLama2+Lora微调实战
turtleSteps: