2017-06-25 41 views
2

我在CPU上運行一個簡單的帶有TensorFlow的卷積神經網絡,使用Python/Numpy從磁盤加載數據並進行準備。 Python/Numpy部分消耗的內存非常少,因爲我只加載了32個1MB圖像。內存高效的設計技巧TensorFlow NN

但是,在運行sess.run(AdamOptimizer)內存使用率達到天文數字峯值時,可以看到在memory_profiler以下輸出,顯示了4個訓練週期和一個測試周期。 TensorFlow memory usage, 4 training cycles one test cycle, from https://pypi.python.org/pypi/memory_profiler

12GB峯值限制了我批量的大小,同時訓練網絡的數量或我的圖層大小。我相信這個峯值與從Python到TF或者正向激活的數據傳輸有關,因爲它在sess.run(accuracy)聲明中等同存在。

我可能設計得不好CNN圖嗎?有人可以指出我應該記住的設計規則,特別是內存?有可能及時塗抹這個嗎? - 如果12GB峯值增長了兩倍並且是一半的話,這將是一個進步。最後是否有一種方法可以表示峯值開始和結束時間,以便我可以管理多個網絡來進行隔行掃描? (請注意,在單個sess.run()聲明中發生的縮小的2秒鐘峯值大約需要20秒)

回答

1

如果別人有任何要添加的內容,我會很樂意將答案轉移。只是想分享我發現的東西。

似乎tf.nn.conv2d尤其是內存飢餓,也許它總是感覺不知何故,但對我來說,它比預期的方式。下面這個簡單的程序使用5.5GB,我不希望超過數100 MB的更多:

x = tf.placeholder(tf.float32, shape=[None, 256, 256, 4]) 
w = tf.Variable(tf.truncated_normal([f, f, 4, 8], stddev=0.1)) 
outp = tf.nn.conv2d(x, w, strides=[1,1,1,1], padding='SAME') 

outp_v = sess.run(outp, 
     feed_dict={x:np.ones(32*256*256*4).reshape(32,256,256,4)}) 

與內存分析器發現: https://pypi.python.org/pypi/memory_profiler/0.47 output. 該輸出我用了相當大量f = 16,但我發現內存使用情況與其無關。除了在足夠小的情況下,計算速度如此之快以至於它低於內存配置實用程序的時間分辨率,並且只有一個尖峯(沒有平臺)保留在任意高度。

其他人發現的內存使用情況類似: tensorflow conv2d memory consumption explain?