我正在尝试使用经过稍微修改的SegNet-basic
模型Caffe训练网络。
我知道我遇到的Check failed: error == cudaSuccess (2 vs. 0) out of memory
错误是由于我的GPU内存用完了。但是,令我感到困惑的是:
我的“旧”训练尝试效果很好。该网络已初始化并运行,并具有以下内容:
Memory required for data: 1800929300
(这是按批次大小计算的,因此这里是4x
个样本大小)7x7
的过滤器。让我感到惊讶的是,我的“新”网络内存不足,并且由于减小了批处理大小,所以我不知道正在保留额外的内存是什么
Memory required for data: 1175184180
(=样本大小)参数的数量由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
。旧网络不具有conv0
,conv0_bn
和pool0
层,而其他层相同。 “旧”网络还将batch_size
设置为4
,而不是1
。
EDIT2:每个请求,甚至更多信息:
769x1025
,因此始终输入4x769x1025
。out of memory
。没有一个迭代运行。答案 0 :(得分:0)
请记住,caffe实际上为两个网络副本分配了空间:“训练阶段”网络和“测试阶段”网络。因此,如果数据占用1.1GB,则需要将该空间增加一倍。
此外,您需要为参数分配空间。每个参数都需要存储其梯度。此外,求解器会跟踪每个参数的“动量”(有时甚至是第二时刻,例如在ADAM求解器中)。因此,即使增加很小的参数数量,也可能显着增加训练系统的内存占用量。