有什么方法可以减少 GPU 内存 Caffe 的使用吗?
Is there any ways to reduce the GPU Memory Caffe use?
我喜欢 caffe,但是 caffe 使用的 gpu 内存量比 mxnet 大(我用 mxnet-memonger 在 ResNet-50 中测试)。是否有任何想法、方向或替代自定义 caffe 可以减少 gpu 内存 caffe 使用量。想法和方向就足够了,我会尝试详细实施它。
简短回答:减少 Caffe 使用的内存最直接的方法是减少批量大小,同时启用梯度累积以达到相同的有效批量大小,您可以使用 batch_size 和 iter_size 求解器的参数。例如,假设当前 batch_size 参数设置为 128,并且您希望将内存减少一半,那么您可以在求解器的 prototxt 中设置:
batch_size: 64
iter_size: 2
长答案:在 Caffe 中占用大部分内存的不是层的权重(这些大部分是固定成本),而是层之间的中间计算,它与批大小成线性比例。这就是为什么减小批处理大小会减少内存使用量的原因。当然,仅仅减小批量大小会损害性能,因为它会增加梯度估计的方差。
然而,我们可以通过使用梯度累积来减少每次前向-后向迭代的批量大小而不影响梯度估计。这意味着对于每个前向-后向步骤,我们使用小批量 B,而我们每 N 次迭代只更新一次权重,并累积自上次更新以来的所有梯度。这将为我们提供 NxB 的有效批量大小。
最后,您可能想知道使用这种方法是否会损害训练网络的运行时性能。虽然从理论上讲,如果前后向步骤并行处理批处理中的每个元素可能会损害性能,但实际上这不是 Caffe 的实现方式(*),批处理中的每个元素都按顺序处理每一层,所以最终结果对运行时性能几乎没有影响。
(*) 作为旁注,过去我为此添加了对 Caffe 的支持,实际上你可以在训练期间获得轻微的加速(~1.5 倍),但代价是内存翻倍.
facebook-caffe好像是你想要的?
通过在安全时自动重用中间激活来优化内存使用。对于 AlexNet 风格的模型,这将中间激活所需的内存量减少了大约 50%,对于 GoogLeNet 风格的模型,减少了大约 75%。
哦,对了,我还没试过
我喜欢 caffe,但是 caffe 使用的 gpu 内存量比 mxnet 大(我用 mxnet-memonger 在 ResNet-50 中测试)。是否有任何想法、方向或替代自定义 caffe 可以减少 gpu 内存 caffe 使用量。想法和方向就足够了,我会尝试详细实施它。
简短回答:减少 Caffe 使用的内存最直接的方法是减少批量大小,同时启用梯度累积以达到相同的有效批量大小,您可以使用 batch_size 和 iter_size 求解器的参数。例如,假设当前 batch_size 参数设置为 128,并且您希望将内存减少一半,那么您可以在求解器的 prototxt 中设置:
batch_size: 64
iter_size: 2
长答案:在 Caffe 中占用大部分内存的不是层的权重(这些大部分是固定成本),而是层之间的中间计算,它与批大小成线性比例。这就是为什么减小批处理大小会减少内存使用量的原因。当然,仅仅减小批量大小会损害性能,因为它会增加梯度估计的方差。
然而,我们可以通过使用梯度累积来减少每次前向-后向迭代的批量大小而不影响梯度估计。这意味着对于每个前向-后向步骤,我们使用小批量 B,而我们每 N 次迭代只更新一次权重,并累积自上次更新以来的所有梯度。这将为我们提供 NxB 的有效批量大小。
最后,您可能想知道使用这种方法是否会损害训练网络的运行时性能。虽然从理论上讲,如果前后向步骤并行处理批处理中的每个元素可能会损害性能,但实际上这不是 Caffe 的实现方式(*),批处理中的每个元素都按顺序处理每一层,所以最终结果对运行时性能几乎没有影响。
(*) 作为旁注,过去我为此添加了对 Caffe 的支持,实际上你可以在训练期间获得轻微的加速(~1.5 倍),但代价是内存翻倍.
facebook-caffe好像是你想要的?
通过在安全时自动重用中间激活来优化内存使用。对于 AlexNet 风格的模型,这将中间激活所需的内存量减少了大约 50%,对于 GoogLeNet 风格的模型,减少了大约 75%。
哦,对了,我还没试过