对于神经网络,在进行终端部署时,需要考虑内存消耗问题,大体来说:
resnet内存=模型大小+特征图消耗
resnet+FPN
1、模型大小指的是模型参数所占的比特数,参数的不同量化方式会影响大小。
以resnet18为例,原始的resnet18模型的参数所占空间约为45M,但是经过8bit量化后,所占空间为12M。
2、特征图消耗指的是网络在前向推理时中间或者最后的计算结果。
- 最后的计算结果即输出,比如FPN的输出结果,需要存下来,因此需要纳入到内存消耗的计算中去;
- 中间的输出结果,即各层的特征图,由于送到下一层进行计算后,此结果可以丢掉,对于这些特征图的内存消耗,程序往往开设一块大的内存空间,可以进行复用。因此这部分内存空间的消耗,我们可以取空间消耗最大的那层特征层进行粗略估算。
比如对于832*448*3图像输入到resnet18+FPN,中间特征层最大消耗为(832/2)*(448/2)*64*4=23M,64为通道数;输出结果为FPN各层输出,(832/4)*(448/4)*64*4 + (832/8)*(448/8)*64*4 + ....=6M + 1.5M + ...
所以为了减小神经网络的内存消耗,可以考虑以下几个方面:
- 低比特量化
- 减小网络通道数或层数
- 减小输入大小
- 根据实际情况,可能只需取FPN的某个尺度输出结果即可。比如目标都很大,只取FPN最后P5和P4层输出结果就行了。
网友评论