caffe blobs 共享内存分析

来源:互联网 发布:bsb的网络意思是什么 编辑:程序博客网 时间:2024/06/05 13:32

caffe blobs 共享内存分析

    1、caffe中内存分配情况

        caffe层间的输入输出是以Blob为单位,每个Blob中存储有训练数据和梯度,caffe也给出了Blob级的接口函数。caffe在初始化阶段就会创建所有需要的内存,内存的消耗很大。尤其是对只做前向计算的情况,不必对所有的Blob都分配内存,前向计算过程中可以使用重用已经计算完成的Blob的内存,即:Blob间共享内存。

     在说明Blob直接共享内存之前,先看下caffe的需要哪些内存:(caffe中memory_used_统计需要的内存是不完全的)

     1、data_:存储计算过程层间输入和输出的中间结果,这个数据是caffe中memory_used_统计的数据。

     2、diff_:存储反向计算过程中的梯度数据。

     3、参数数据:计算模型参数,例如,卷积层和全连接等层的W、B的数据。

     4、中间数据:例如:卷积层中im2col需要存储空间,pooling层中的max_index_需要的存储空间

     5、其他一些数据:除了上面的数据其它的一些存储空间。


2、Blob间内存共享分析

    由于在caffe的计算是一层一层串行执行的,所以当前层计算时,其它层开辟的空间是闲置的。所以考虑共享内存,即:后面层的计算重用前面层已经开辟的内存空间。具体就是输入和输出Blob的内存共享。

   然而Blob中的data_执向的是syncMemory,syncMemory指向的才是真正的内存空间(见下图),所以如果共享内存,是不能再Blob级间共享的,需要在syncMemory间共享内存。


       如上图(a)所示,blob1和blob2共享内存。blob级的共享实质是共享的syncMemory,顺带着共享了内存(红色区域)。如果blob2要调整空闲内存的空间,就会出现图(b)的情况,会为blob2重新分配一块内存空间。此时blob间就不在共享内存了。由于每层的输入和输出blob所需要的内存大小多数情况是不一致的。因此从blob级共享内存是不行,只能从syncMemory级共享内存。如下图:



   上图(a)中blob1和blob2共享内存,是blob中syncMemory共享内存。当blob2需要更大的内存时,blob2就重新创建了一个大的Memroy2,并释放了之前的memory1。使得blob1和blob2重新指向一个新的内存。

   因此如果要想实现共享内存,则必须是syncMemory级的共享内存。


(完)



0 0
原创粉丝点击