当我增加批量大小时,为啥 tensorflow GPU 内存使用量会减少?

Posted

技术标签:

【中文标题】当我增加批量大小时,为啥 tensorflow GPU 内存使用量会减少?【英文标题】:Why tensorflow GPU memory usage decreasing when I increasing the batch size?当我增加批量大小时,为什么 tensorflow GPU 内存使用量会减少? 【发布时间】:2018-05-10 08:05:20 【问题描述】:

最近我使用 Tensorflow 和 PyTorch 实现了一个 VGG-16 网络,数据集是 CIFAR-10。每张图片为32 * 32 RGB。

我一开始使用 64 的批大小,而我发现 PyTorch 使用的 GPU 内存比 tensorflow 少得多。然后我做了一些实验,得到了一个数字,贴在下面。

经过一番研究,我知道了使用 BFC 算法管理内存的 tensorflow。所以它可以解释为什么 tensorflow 的内存使用减少或增加 2048、1024、... MB 并且有时当批处理大小更大时内存使用不增加。

但我仍然很困惑,为什么当批处理大小为 512 时,内存使用量比批处理大小为 384、448 等时的内存使用量更低,而批处理大小较小。与batch size为1024到1408,batch size为2048到2688时相同。

这是我的源代码:

PyTorch:https://github.com/liupeng3425/tesorflow-vgg/blob/master/vgg-16-pytorch.py

张量流:https://github.com/liupeng3425/tesorflow-vgg/blob/master/vgg-16.py


编辑: 我的电脑上有两台 Titan XP,操作系统:Linux Mint 18.2 64 位。

我使用命令 nvidia-smi 确定 GPU 内存使用情况。

我的代码在我的代码中定义的 GPU1 上运行:

os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = "1"

而且我确信只有一个应用程序使用 GPU1。

GPU 内存使用情况可以通过下面的应用程序列表来确定。 例如,就像下面发布的屏幕截图一样,进程名称为/usr/bin/python3,其 GPU 内存使用量为 1563 MiB。

【问题讨论】:

你是如何确定内存使用的?默认情况下,TensorFlow 分配all available GPU memory。 @aseipel 感谢您的建议!我已经更新了我的问题。 TensorFlow 在开始时会分配所有可用的 GPU 内存,因此使用 nvidia-smi 进行测量不会给出准确的测量结果。相反,您应该使用 RunMetadata 进行测量:***.com/questions/36123740/… 你得到答案了吗?我的代码也有类似的问题。当我采用批量大小为 128 和 256 时,分配了相同数量的 GPU 内存,它从 64 增长到 128,从 256 增长到 512。 【参考方案1】:

如 cmets 中所述,默认情况下,TensorFlow 总是占用 GPU 上的所有内存。我假设您已为此测试禁用了该功能,但它确实表明算法通常不会尝试最小化保留的内存,即使它并未全部用于计算。

为了找到适合您的设备和代码的最佳配置,TensorFlow 通常会多次运行(部分)第一个计算。我怀疑这包括将数据预加载到 GPU 上的设置。这意味着您看到的数字恰好是您的设备和配置的最佳值。

由于 TensorFlow 不介意使用更多内存,因此此处的“最佳”是通过速度而非内存使用量来衡量的。

【讨论】:

以上是关于当我增加批量大小时,为啥 tensorflow GPU 内存使用量会减少?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我将其大小初始化为 5 并且只给出 5 个元素时,向量的大小会增加到 10?

为啥用于预测的 Keras LSTM 批量大小必须与拟合批量大小相同?

随着批量大小的变化,学习率应该如何变化? [关闭]

tensorflow C++ 批量推理

为啥我运行应用程序时 jar 文件的大小会增加?

当我使用 RELU 激活时,为啥我的 TensorFlow 网络权重和成本为 NaN?