2017-10-16 6 views
1

最近変わったことに気づいたTensorflowは、変数を定数で初期化するときに多すぎるメモリを使用しているようです。誰かが私が下の例を理解するのを助けることができるか?定数を使用して初期化するときにTensorflowが多すぎるメモリを使用する

$ python -m memory_profiler test.py 
[0 1 2 3 4 5 6 7 8 9] 
Filename: test.py 

Line # Mem usage Increment Line Contents 
================================================ 
4 144.531 MiB 0.000 MiB @profile 
5        def go(): 
6 907.312 MiB 762.781 MiB a = np.arange(100000000) 
7 910.980 MiB 3.668 MiB s = tf.Session() 
8 1674.133 MiB 763.152 MiB b = tf.Variable(a) 
9 3963.000 MiB 2288.867 MiB s.run(tf.variables_initializer([b])) 
10 3963.145 MiB 0.145 MiB print(s.run(b)[:10]) 
+0

私は従いません。どのような '定数'あなたについて話している?どのメモリの増分が間違っていますか? – hpaulj

+0

は、100000000の定数のnumpy配列です。テンソルフロー変数bを作成してaと等しく設定し、variables_initializer()を呼び出してbを初期化します。それ自体は762 MBなので、bは、私が理解していないことはTFが4GBメモリを使用して終わる方法です。 –

+0

'a'は大きな配列です(それについては何も「定数」はありません)。 'b'は' a'sデータのコピーを作成する 'tf'オブジェクトです。 9行目にもそのデータの3つの 'コピー'が追加されているか、少なくとも同じサイズの3つのオブジェクトが作成されています。私はそれが 'initializer'のステップか' run'のステップかどうか分かりません。多分両方。 – hpaulj

答えて

2
  • あなたはnumpyの配列に格納された900メガバイトを持っています。
  • tf.Variable(a)はtf.Variable(tf.constant(a))と等価です。この定数を作成するために、Pythonクライアントは、Pythonランタイムでオブジェクトをグラフに900メガバイト定数を付加Session.runがTensorFlow Cランタイムにグラフを転送するTF_ExtendGraphをトリガ
  • 、別の900メガバイト
  • セッションがTensorFlowランタイム
  • b tf.Variableオブジェクトの900メガバイトを割り当てます

これは、3600MBのメモリ割り当てを行います。メモリを節約するために、代わりに次のようなことをすることができます。

a_holder = tf.placeholder(np.float32) 
b = tf.Variable(a_holder) 
sess.run(b.initializer, feed_dict={a_holder: np.arange(100000000)}) 

TLDR;大きな定数を作成しないでください。

+0

ありがとう!実際、少しだけ関連性の高いGitHubの問題で提供した同じ回避策を読んでいましたが、この回答はそのコメントよりも多くの洞察をもたらしました。また、将来同じ問題を探している人にとってはよりアクセスしやすくなります。ありがとう! –

関連する問題