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カーネルレベルでオンチップ共有メモリ使用量とレジスタ使用量を表示できますが、グローバル/デバイスメモリ使用量は表示しません。
コマンドの例を次に示します。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メモリ消費が表示されるまで、デバッガーでコードをステップ実行します。