|
有一個NLP相關的代碼放在實驗室的服務器上跑的時候,剛開始非常快,幾分鐘可以跑70個例子,過了幾小時後就明顯變慢,甚至放在服務器上跑了一晚上,仍然只跑了幾個,因此,肯定不是代碼本身的功能或者例子本身的問題。
問了實驗室的同學,應該是發生了 內存洩漏(Memory Leak)是指程序中己動態分配的堆內存由於某種原因程序未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重後果。
我的程序正好有大量的循環,因此也給不斷累積的內存洩漏提供了條件。
如果是在服務器中,可以使用 那麼為了解決這個問題,最主要的還是要定位程序中哪一個部分發生了洩露,才可以做出修改。這裡要使用到objgraph。其中objgraph.show_growth()可以顯示出代碼執行過後增加的對象。
tuple 163411 +8749
list 4056757 +2709
dict 48076 +1665
Operation 5235 +429
_InputList 5235 +429
Tensor 5414 +423
TF_Output 4650 +372
Dimension 1528 +207
TensorShapeV1 988 +174
TraceableObject 3863 +120
這就是我每次循環過後增長的對象,可以看到內存洩漏的情況還是蠻嚴重的。 - objgraph.show_chain(objgraph.find_backref_chain(objgraph.by_type('list')[0],objgraph.is_proper_module),filename='list.dot' )
複製代碼 這句代碼可以將程序中的引用關係找出來,生成一個dot文件來記錄,使用graphviz軟件可以繪製成圖。
https://www.cnblogs.com/xybaby/p/7491656.html
這個博客有詳細的介紹。
最後問題發現在一個神經網絡相關的代碼中,由於tensorflow的圖是靜態圖,但是如果直接加載不同的圖(即不同的模型),應該都會存在內存中,原有的圖並不會釋放,因此造成了測試速度越來越慢。
我的代碼在每次循環時都會調用一次預測模型,可能是在這個過程中沒有註意導致了內存洩漏。
只要每次用完模型得到結果後就可以清除session。防止內存洩漏啦。之後運行,內存也基本穩定在3g左右了。
- from keras import backend as K
- K.clear_session()
複製代碼
文章出處
|
|