TensorFlow:如何测量每个张量占用多少 GPU 内存?

TensorFlow: How to measure how much GPU memory each tensor takes?

我目前正在实施 YOLO in TensorFlow and I'm a little surprised on how much memory that is taking. On my GPU I can train YOLO using their Darknet 批量大小为 64 的框架。在 TensorFlow 上,我只能使用批量大小 6 执行此操作,而 8 我已经 运行 内存不足。对于测试阶段,我可以 运行 批量大小为 64 而不会 运行 内存不足。

  1. 我想知道如何计算每个张量消耗了多少内存?默认情况下所有张量都保存在 GPU 中吗?我可以简单地将总内存消耗计算为形状 * 32 位吗?

  2. 我注意到因为我使用了动量,所以我所有的张量也有一个 /Momentum 张量。会不会也占用了很多内存?

  3. 我正在使用一种方法 distorted_inputs 扩充我的数据集,与 CIFAR-10 tutorial 中定义的方法非常相似。难道这部分占用内存很大?我相信 Darknet 会在 CPU.

  4. 中进行修改

参见本文中的描述 (commit)。 内存分配是原始信息,尽管它需要一个脚本以易于阅读的形式收集信息。

抱歉回复慢。不幸的是,现在设置日志级别的唯一方法是编辑 tensorflow/core/platform/logging.h 并重新编译,例如

#define VLOG_IS_ON(lvl) ((lvl) <= 1)

有一个 bug 1258 可以更优雅地控制日志记录。

MemoryLogTensorOutput 条目在每个 Op 执行结束时记录,并指示保存 Op 输出的张量。了解这些张量很有用,因为直到下游 Op 消耗张量时才会释放内存,这在大图中可能要晚得多。

现在1258已经关闭,可以在导入TensorFlow前通过设置环境变量在Python中启用内存记录:

import os
os.environ['TF_CPP_MIN_VLOG_LEVEL']='3'
import tensorflow as tf

因此会有 很多 的日志记录。您需要 grep 结果以找到合适的行。例如:

grep MemoryLogTensorAllocation train.log