TensorFlow:如何记录GPU内存(VRAM)利用率?

dan*_*451 16 python vram tensorflow cudnn

TensorFlow总是(预)在我的显卡上分配所有空闲内存(VRAM),这是好的,因为我希望我的模拟在我的工作站上尽可能快地运行.

但是,我想记录TensorFlow真正使用的内存(总之).另外,如果我还可以记录单个张量器使用的内存量,那将是非常好的.

此信息对于衡量和比较不同ML/AI架构所需的内存大小非常重要.

有小费吗?

Yar*_*tov 18

更新,可以使用TensorFlow操作来查询分配器:

# maximum across all sessions and .run calls so far
sess.run(tf.contrib.memory_stats.MaxBytesInUse())
# current usage
sess.run(tf.contrib.memory_stats.BytesInUse())
Run Code Online (Sandbox Code Playgroud)

您还可以通过查看获得有关session.run呼叫的详细信息,包括run呼叫期间所有内存分配RunMetadata.IE就是这样的

run_metadata = tf.RunMetadata()
sess.run(c, options=tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE, output_partition_graphs=True), run_metadata=run_metadata)
Run Code Online (Sandbox Code Playgroud)

这是一个端到端的例子 - 采用列向量,行向量并添加它们以获得添加矩阵:

import tensorflow as tf

no_opt = tf.OptimizerOptions(opt_level=tf.OptimizerOptions.L0,
                             do_common_subexpression_elimination=False,
                             do_function_inlining=False,
                             do_constant_folding=False)
config = tf.ConfigProto(graph_options=tf.GraphOptions(optimizer_options=no_opt),
                        log_device_placement=True, allow_soft_placement=False,
                        device_count={"CPU": 3},
                        inter_op_parallelism_threads=3,
                        intra_op_parallelism_threads=1)
sess = tf.Session(config=config)

with tf.device("cpu:0"):
    a = tf.ones((13, 1))
with tf.device("cpu:1"):
    b = tf.ones((1, 13))
with tf.device("cpu:2"):
    c = a+b

sess = tf.Session(config=config)
run_metadata = tf.RunMetadata()
sess.run(c, options=tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE, output_partition_graphs=True), run_metadata=run_metadata)
with open("/tmp/run2.txt", "w") as out:
  out.write(str(run_metadata))
Run Code Online (Sandbox Code Playgroud)

如果你打开run.txt你会看到这样的消息:

  node_name: "ones"

      allocation_description {
        requested_bytes: 52
        allocator_name: "cpu"
        ptr: 4322108320
      }
  ....

  node_name: "ones_1"

      allocation_description {
        requested_bytes: 52
        allocator_name: "cpu"
        ptr: 4322092992
      }
  ...
  node_name: "add"
      allocation_description {
        requested_bytes: 676
        allocator_name: "cpu"
        ptr: 4492163840
Run Code Online (Sandbox Code Playgroud)

所以在这里你可以看到ab分配了52个字节(13*4),结果分配了676个字节.

  • TF 2.0 版本会好吗?那里不存在 Contrib。 (6认同)
  • 是否有一种方便的方法来捕获整个设备的分配?我的意思是,我的设备的可用内存中已分配了多少比例? (2认同)
  • 顺便说一下,在C++ API中有[此调用](https://github.com/tensorflow/tensorflow/blob/64edd34ce69b4a8033af5d217cb8894105297d8a/tensorflow/core/kernels/stack_ops.cc#L223),它允许查看分配的总内存.它看起来还没有包装,可以从Python访问,这将是一个很好的功能添加 (2认同)
  • 顺便说一句,我只是将C++调用包装成一个可以从Python调用的操作,这里是使用说明 - https://github.com/yaroslavvb/memory_probe_ops (2认同)
  • @YaroslavBulatov 你应该更新这个答案。你的`memory_probe_ops` 现在在`tf.contrib` 中,这是一种非常简单的获取内存使用情况的方法,即通过`tf.contrib.memory_stats.MaxBytesInUse()`。 (2认同)