有没有办法减少GPU内存使用?

时间:2016-09-17 08:03:35

标签: caffe

我喜欢caffe,但是gpu内存使用量大于mxnet(我使用mxnet-memonger在ResNet-50中测试)。是否有任何想法,方向或替代定制caffe为我减少使用的gpu内存量。想法和方向已经足够,我将尝试详细实施它。

2 个答案:

答案 0 :(得分:2)

简短回答:减少Caffe使用的内存的最简单方法是减少批量大小,同时启用梯度累积以获得相同的有效批量大小,您可以使用求解器的batch_size和iter_size参数来执行此操作。例如,让我们说当前的batch_size参数设置为128并且您希望将内存减少一半,然后您将在求解器的原型中设置:

batch_size: 64
iter_size: 2

长答案:Caffe中占用大部分内存的不是层的权重(这些是固定成本),而是层之间的中间计算,它与批量大小成线性比例。这就是减小批量大小会减少内存使用量的原因。当然,只是减小批量大小会损害性能,因为它会增加梯度估计的方差。

然而,我们可以通过使用梯度累积来减少每个前后迭代的批量大小而不影响梯度估计。这意味着,对于每个前后步骤,我们使用小批量B,而我们仅每N次迭代更新一次权重并累积自上次更新以来的所有梯度。这将为我们提供有效的批量大小NxB。

最后,您可能想知道使用此方法是否会损害培训网络的运行时性能。虽然理论上它可能会损害性能,如果前后步骤将并行处理批处理中的每个元素,实际上这不是Caffe的实现方式(*),并且批处理中的每个元素按顺序处理每个层,所以最终结果对运行时性能几乎没有影响。

(*)作为旁注,过去我已经为Caffe添加了对此的支持,实际上你可以在训练期间获得轻微加速(~1.5x),但代价是加倍记忆

答案 1 :(得分:2)

facebook-caffe看起来像你想要的那样?

通过在安全的情况下自动重用中间激活来优化内存使用。对于AlexNet风格的模型,这可以将中间激活所需的内存量减少大约50%,对于GoogLeNet风格的模型,大约减少75%。

哦,顺便说一句,我之前没试过。