標籤:
Python語言 越來越廣泛的應用於機器學習/ 深度學習領域,是目前最火的該領域程式設計語言,各大深度學習架構基本都支援 python 介面。在TensorFlow 訓練模型的過程中,一般資料載入分情景各有不同。1. 當資料量能直接全部載入記憶體時,當然最是方便,直接全部載入記憶體,然後訓練即可。2. 資料無法全部載入記憶體時,有多種方法。介紹其中 2 種用的多的,其一是邊訓練邊讀取(可以用多線程進行最佳化),其二是隨機打亂所有訓練資料的索引然後隨機播放部分資料進行訓練測試。第2 類情景中,有可能由於對 Python 的 GC 機制理解不深( Me… ),出現記憶體泄露。比如下面的第 12 行的列表就無法釋放,導致記憶體泄露,而 11 行則不會出現記憶體泄露。import numpy as np import gc import psutil import osdef get_memory_usage():process = psutil.Process(os.getpid())return process.memory_info().rss/(1024*1024)print ’before load, memory: %d MB’ % get_memory_usage()#dataset = [np.zeros((6000,6000),dtype=np.float32) for _ in range(30000)]dataset = [(np.zeros((6000,6000),dtype=np.float32),np.zeros((200,200),dtype=np.int32)) for _ in range(10000)] print ’after load, memory: %d MB’ % get_memory_usage()print ’before release, memory: %d MB’ % get_memory_usage() del datasetdataset = Nonegc.collect() print ’after release, memory: %d MB’ % get_memory_usage()第11 行記憶體釋放結果:before load, memory: 25 MB after load, memory: 220 MB before release, memory: 220 MB after release, memory: 27 MB第12 行記憶體釋放結果:before load, memory: 23 MB after load, memory: 1406 MB before release, memory: 1406 MB after release, memory: 1170 MB可以看到第12 行記憶體泄露嚴重。出現這種記憶體泄露時,模型訓練基本只能訓練幾個 Epoch 就會出現 OOM 。大力出奇蹟這種問題當然最優的是從根源解決,即研究清楚Python 的 GC 機制,解決記憶體泄露。在時間比較緊或者問題比較麻煩時,有時粗暴快速的方法也不失為一種選擇。訓練模型的目標是根據訓練資料以及模型結構最佳化模型參數,因此只要達成目的,過程不重要。在這個例子中,可以直接每次只訓練1 個 Epoch ,然後重啟 Python 進程讀模數型進行 fine-tune 。與直接訓練若干個 Epoch 效果接近。# 訓練 50 個 epoch seq 50|xargs -i python train.py --model-path=./model
來源:網路
如何解決python訓練資料記憶體泄露問題?