有没有办法确定 TensorFlow 使用了多少 GPU 内存?
Is there a way of determining how much GPU memory is in use by TensorFlow?
Tensorflow 倾向于在其 GPU 上预分配整个可用内存。对于调试,有没有办法告诉实际使用了多少内存?
(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内核级别的片上共享内存使用情况和寄存器使用情况,但不会显示global/device内存使用情况。
这是一个示例命令:nvprof --print-gpu-trace matrixMul
这里有更多详细信息:
http://docs.nvidia.com/cuda/profiler-users-guide/#abstract
TensorFlow 分析器改进了基于真实 gpu 内存分配器信息的内存时间线
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/core/profiler#visualize-time-and-memory
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))
这是一个对我很有效的实用解决方案:
使用 TF 会话配置禁用 GPU 内存预分配:
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
sess = tf.Session(config=config)
运行 nvidia-smi -l(或其他一些实用程序)监控 GPU 内存消耗。
使用调试器单步执行代码,直到看到意外的 GPU 内存消耗。
Tensorflow 倾向于在其 GPU 上预分配整个可用内存。对于调试,有没有办法告诉实际使用了多少内存?
(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内核级别的片上共享内存使用情况和寄存器使用情况,但不会显示global/device内存使用情况。
这是一个示例命令:nvprof --print-gpu-trace matrixMul
这里有更多详细信息: http://docs.nvidia.com/cuda/profiler-users-guide/#abstract
TensorFlow 分析器改进了基于真实 gpu 内存分配器信息的内存时间线 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/core/profiler#visualize-time-and-memory
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))
这是一个对我很有效的实用解决方案:
使用 TF 会话配置禁用 GPU 内存预分配:
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
sess = tf.Session(config=config)
运行 nvidia-smi -l(或其他一些实用程序)监控 GPU 内存消耗。
使用调试器单步执行代码,直到看到意外的 GPU 内存消耗。