Tensorflow倾向于在GPU上预分配整个可用内存。对于调试,是否有办法判断实际使用了多少内存?
gajydyqb1#
(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 --打印-GPU-跟踪矩阵Mul更多详情请点击此处:http://docs.nvidia.com/cuda/profiler-users-guide/#abstract
ubof19bj2#
这里有一个对我来说很实用的解决方案:使用TF会话配置禁用GPU内存预分配:
config = tf.ConfigProto() config.gpu_options.allow_growth=True sess = tf.Session(config=config)
运行nvidia-smi -l(或其他实用程序)以监控GPU内存消耗。使用调试工具逐步执行程式码,直到您看到非预期的GPU内存消耗。
tpgth1q73#
tensorflow.contrib.memory_stats中有一些代码可以帮助实现这一点:
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))
z0qdvdin4#
TensorFlow分析器改进了基于真实的GPU内存分配器信息的内存时间线https://github.com/tensorflow/tensorflow/tree/master/tensorflow/core/profiler#visualize-time-and-memory
bweufnob5#
tf.config.experimental.get_memory_info('GPU:0')
目前传回下列机码:
'current': The current memory used by the device, in bytes. 'peak': The peak memory used by the device across the run of the program, in bytes.
5条答案
按热度按时间gajydyqb1#
(1)Timeline对记录内存分配有一些有限的支持。下面是一个用法示例:
您可以使用MNIST示例(mnist with summaries)尝试给予此代码
这将生成一个名为timeline的跟踪文件,您可以使用chrome://tracing打开该文件。请注意,这只提供了一个近似的GPU内存使用统计信息。它基本上模拟了GPU执行,但无法访问完整的图形元数据。它也无法知道有多少变量被分配给了GPU。
(2)对于GPU内存使用情况的非常粗略的测量,nvidia-smi将在您运行命令时显示总的设备内存使用情况。
nvprof可以显示CUDA内核级别的片上共享内存使用情况和寄存器使用情况,但不能显示全局/设备内存使用情况。
以下是一个示例命令:nvprof --打印-GPU-跟踪矩阵Mul
更多详情请点击此处:http://docs.nvidia.com/cuda/profiler-users-guide/#abstract
ubof19bj2#
这里有一个对我来说很实用的解决方案:
使用TF会话配置禁用GPU内存预分配:
运行nvidia-smi -l(或其他实用程序)以监控GPU内存消耗。
使用调试工具逐步执行程式码,直到您看到非预期的GPU内存消耗。
tpgth1q73#
tensorflow.contrib.memory_stats
中有一些代码可以帮助实现这一点:z0qdvdin4#
TensorFlow分析器改进了基于真实的GPU内存分配器信息的内存时间线https://github.com/tensorflow/tensorflow/tree/master/tensorflow/core/profiler#visualize-time-and-memory
bweufnob5#
目前传回下列机码: