TensorFlowは常にグラフィックカードにすべての空きメモリ(VRAM)を(事前に)割り当てます。これは、私のワークステーションでシミュレーションを可能な限り高速に実行したいためです。
ただし、TensorFlowが実際に使用しているメモリ(合計)の量を記録したいと思います。さらに、シングルテンソルが使用するメモリの量もログに記録できれば、それは本当にすばらしいでしょう。
この情報は、さまざまなML/AIアーキテクチャに必要なメモリサイズを測定して比較するために重要です。
任意のヒント?
更新。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
を参照することにより、RunMetadata
呼び出し中に割り当てられているすべてのメモリを含むsession.run
呼び出しに関する詳細情報を取得できます。 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)
これがエンドツーエンドの例です-列ベクトル、行ベクトルを取り、それらを追加して追加の行列を取得します。
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.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
したがって、ここでは、a
とb
がそれぞれ52バイト(13 * 4)を割り当て、結果が676バイトを割り当てていることがわかります。