Caffe内存不足,在哪里使用?

时间:2019-03-01 15:07:57

标签: neural-network deep-learning conv-neural-network caffe

我正在尝试使用经过稍微修改的SegNet-basic模型Caffe训练网络。

我知道我遇到的Check failed: error == cudaSuccess (2 vs. 0) out of memory错误是由于我的GPU内存用完了。但是,令我感到困惑的是:

我的“旧”训练尝试效果很好。该网络已初始化并运行,并具有以下内容:

  • 批次大小4
  • Memory required for data: 1800929300(这是按批次大小计算的,因此这里是4x个样本大小)
  • 参数总数:1418176
  • 网络由4x(卷积,ReLU,合并)和4x(上采样,解卷积)组成;每层64个内核大小为7x7的过滤器。

让我感到惊讶的是,我的“新”网络内存不足,并且由于减小了批处理大小,所以我不知道正在保留额外的内存是什么

  • 批次大小1
  • Memory required for data: 1175184180(=样本大小)
  • 参数总数:1618944
  • 输入大小沿每个维度增加了一倍(预期的输出大小不会改变),因此,参数数量增加的原因是网络开始时又增加了一组参数(卷积,ReLU,池化)。

参数的数量由this script进行计数,方法是对各层参数求和,方法是将各层的维数相乘得到。

假设每个参数需要4个字节的内存,与新的data_memory+num_param*4相比,旧设置memory_old = 1806602004 = 1.68GB仍然为memory_new = 1181659956 = 1.10GB提供更高的内存需求。

我已经接受可能在某处需要额外的内存,并且如果我找不到具有更多内存的GPU,则必须重新考虑我的新设置并降低输入的采样率,但是我确实在尝试了解需要更多的内存以及为什么我的新设置内存不足的原因。


编辑:对于每个请求,以下是每个网络的层尺寸以及通过它的数据大小:

“旧”网络:

                            Top shape: 4 4 384 512 (3145728)
('conv1', (64, 4, 7, 7))           --> 4 64 384 512 (50331648)
('conv1_bn', (1, 64, 1, 1))        --> 4 64 384 512 (50331648)
('conv2', (64, 64, 7, 7))          --> 4 64 192 256 (12582912)
('conv2_bn', (1, 64, 1, 1))        --> 4 64 192 256 (12582912)
('conv3', (64, 64, 7, 7))          --> 4 64 96 128 (3145728)
('conv3_bn', (1, 64, 1, 1))        --> 4 64 96 128 (3145728)
('conv4', (64, 64, 7, 7))          --> 4 64 48 64 (786432)
('conv4_bn', (1, 64, 1, 1))        --> 4 64 48 64 (786432)
('conv_decode4', (64, 64, 7, 7))   --> 4 64 48 64 (786432)
('conv_decode4_bn', (1, 64, 1, 1)) --> 4 64 48 64 (786432)
('conv_decode3', (64, 64, 7, 7))   --> 4 64 96 128 (3145728)
('conv_decode3_bn', (1, 64, 1, 1)) --> 4 64 96 128 (3145728)
('conv_decode2', (64, 64, 7, 7))   --> 4 64 192 256 (12582912)
('conv_decode2_bn', (1, 64, 1, 1)) --> 4 64 192 256 (12582912)
('conv_decode1', (64, 64, 7, 7))   --> 4 64 384 512 (50331648)
('conv_decode1_bn', (1, 64, 1, 1)) --> 4 64 384 512 (50331648)
('conv_classifier', (3, 64, 1, 1))

对于“新”网络,最上面的几层有所不同,其余部分完全相同,只是批大小是1而不是4:

                            Top shape: 1 4 769 1025 (3152900)
('conv0', (64, 4, 7, 7))           --> 1 4 769 1025 (3152900) 
('conv0_bn', (1, 64, 1, 1))        --> 1 64 769 1025 (50446400)
('conv1', (64, 4, 7, 7))           --> 1 64 384 512 (12582912)
('conv1_bn', (1, 64, 1, 1))        --> 1 64 384 512 (12582912)
('conv2', (64, 64, 7, 7))          --> 1 64 192 256 (3145728)
('conv2_bn', (1, 64, 1, 1))        --> 1 64 192 256 (3145728)
('conv3', (64, 64, 7, 7))          --> 1 64 96 128 (786432)
('conv3_bn', (1, 64, 1, 1))        --> 1 64 96 128 (786432)
('conv4', (64, 64, 7, 7))          --> 1 64 48 64 (196608)
('conv4_bn', (1, 64, 1, 1))        --> 1 64 48 64 (196608)
('conv_decode4', (64, 64, 7, 7))   --> 1 64 48 64 (196608)
('conv_decode4_bn', (1, 64, 1, 1)) --> 1 64 48 64 (196608)
('conv_decode3', (64, 64, 7, 7))   --> 1 64 96 128 (786432)
('conv_decode3_bn', (1, 64, 1, 1)) --> 1 64 96 128 (786432)
('conv_decode2', (64, 64, 7, 7))   --> 1 64 192 256 (3145728)
('conv_decode2_bn', (1, 64, 1, 1)) --> 1 64 192 256 (3145728)
('conv_decode1', (64, 64, 7, 7))   --> 1 64 384 512 (12582912)
('conv_decode1_bn', (1, 64, 1, 1)) --> 1 64 384 512 (12582912)
('conv_classifier', (3, 64, 1, 1))

这将跳过合并和上采样层。这是“新”网络的train.prototxt。旧网络不具有conv0conv0_bnpool0层,而其他层相同。 “旧”网络还将batch_size设置为4,而不是1


EDIT2:每个请求,甚至更多信息:

  • 所有输入数据都具有相同的维度。它是4个通道的堆栈,每个通道的大小为769x1025,因此始终输入4x769x1025
  • caffe培训日志为here:如您所见,在网络初始化之后,我得到了out of memory。没有一个迭代运行。
  • 我的GPU具有8GB的内存,而我刚刚发现(在另一台计算机上尝试)该新网络需要9.5GB的GPU内存。
  • 仅重申一下,我试图了解我的“旧”设置如何适合8GB内存,而“新”设置却不适合,以及为什么附加数据所需的内存量是〜比保存输入所需的内存大8倍。但是,既然我已经确认“新”设置仅占用9.5GB,那么它与“旧”设置相比可能不会像我所怀疑的那样大(不幸的是,GPU当前正在被其他人使用,所以我不能检查确切的旧设置需要多少内存)

1 个答案:

答案 0 :(得分:0)

请记住,caffe实际上为两个网络副本分配了空间:“训练阶段”网络和“测试阶段”网络。因此,如果数据占用1.1GB,则需要将该空间增加一倍。
此外,您需要为参数分配空间。每个参数都需要存储其梯度。此外,求解器会跟踪每个参数的“动量”(有时甚至是第二时刻,例如在ADAM求解器中)。因此,即使增加很小的参数数量,也可能显着增加训练系统的内存占用量。