【问题标题】:Is there a way of determining how much GPU memory is in use by TensorFlow?有没有办法确定 TensorFlow 使用了多少 GPU 内存?
【发布时间】:2016-07-07 12:44:42
【问题描述】:

Tensorflow 倾向于在其 GPU 上预分配全部可用内存。对于调试,有没有办法知道实际使用了多少内存?

【问题讨论】:

    标签: gpu tensorflow


    【解决方案1】:

    (1) Timeline 对记录内存分配的支持有限。以下是它的用法示例:

        run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
        run_metadata = tf.RunMetadata()
        summary, _ = sess.run([merged, train_step],
                              feed_dict=feed_dict(True),
                              options=run_options,
                              run_metadata=run_metadata)
        train_writer.add_run_metadata(run_metadata, 'step%03d' % i)
        train_writer.add_summary(summary, i)
        print('Adding run metadata for', i)
        tl = timeline.Timeline(run_metadata.step_stats)
        print(tl.generate_chrome_trace_format(show_memory=True))
        trace_file = tf.gfile.Open(name='timeline', mode='w')
        trace_file.write(tl.generate_chrome_trace_format(show_memory=True))
    

    您可以使用 MNIST 示例 (mnist with summaries) 尝试此代码

    这将生成一个名为timeline 的跟踪文件,您可以使用chrome://tracing 打开它。请注意,这仅提供了近似的 GPU 内存使用统计信息。它基本上模拟了 GPU 执行,但无法访问完整的图形元数据。它也不知道有多少变量分配给了 GPU。

    (2) 对于 GPU 内存使用情况的粗略测量,nvidia-smi 将显示您运行命令时的总设备内存使用情况。

    nvprof 可以显示 CUDA 内核级别的片上共享内存使用情况和寄存器使用情况,但不显示全局/设备内存使用情况。

    这是一个示例命令:nvprof --print-gpu-trace matrixMul

    这里有更多细节: http://docs.nvidia.com/cuda/profiler-users-guide/#abstract

    【讨论】:

    • 从 chrome://tracing 中哪里可以看到总的设备分配?
    【解决方案2】:

    这是一个对我很有效的实用解决方案:

    使用 TF 会话配置禁用 GPU 内存预分配:

    config = tf.ConfigProto()  
    config.gpu_options.allow_growth=True  
    sess = tf.Session(config=config)  
    

    运行 nvidia-smi -l(或其他一些实用程序)来监控 GPU 内存消耗。

    使用调试器逐步检查您的代码,直到您看到意外的 GPU 内存消耗。

    【讨论】:

    【解决方案3】:

    tensorflow.contrib.memory_stats 中有一些代码可以帮助解决这个问题:

    from tensorflow.contrib.memory_stats.python.ops.memory_stats_ops import BytesInUse
    with tf.device('/device:GPU:0'):  # Replace with device you are interested in
      bytes_in_use = BytesInUse()
    with tf.Session() as sess:
      print(sess.run(bytes_in_use))
    

    【讨论】:

    【解决方案4】:

    TensorFlow 分析器改进了基于真实 gpu 内存分配器信息的内存时间线 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/core/profiler#visualize-time-and-memory

    【讨论】:

    • 链接已损坏。
    • 链接已损坏。
    猜你喜欢
    • 1970-01-01
    • 2011-07-31
    • 2018-10-02
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多