2016-07-04 40 views
3

我想用cano-multiprocessing與神經網絡庫Keras使用theano。使用multianocessing與theano

我使用device=gpu標誌並加載keras模型。然後,爲了提取超過一百萬圖像的功能,即時通訊使用多處理池。

功能看起來是這樣的:

from keras import backend as K 

f = K.function([model.layers[0].input, K.learning_phase()], [model.layers[-3].output,]) 

def feature_gen(flz): 
    im = imread(flz) 
    cPickle.dump(f([im, 0])[0][0], open(flz, 'wb'), -1) 

pool = mp.Pool(processes=10) 
results = [pool.apply_async(feature_gen, args=(f,)) for f in filelist]] 

然而,這開始創建的GPU內存池和我的代碼失敗,內存錯誤。是否有可能強制多處理在CPU內存中創建線程,然後使用特定部分進行特徵提取,例如帶GPU的f([im, 0])[0][0]

如果沒有,是否有替代方案在python中並行執行相同的操作?

回答

0

如果其他進程不使用keras,則可以使用多個進程,據我所知,您需要將keras的使用限制爲單個進程。這似乎包括所有的keras類和方法,甚至那些似乎不使用gpu的類,例如ImageDataGenerator。

如果工作負載受GPU限制,也可以使用線程庫,該線程庫創建線程而不是進程,例如,在GPU處理前一批時加載數據,則限制不適用。由於全局解釋器鎖定,這不是CPU限制環境中的解決方案。

你的情況看起來像一個平行的[閱讀,在GPU上工作,寫]。這可以改造成流水線,例如,一些進程讀取,執行GPU工作的主要進程和一些進程寫入。

  1. 創建隊列對象進行輸入/輸出(threading.Queue或multiprocessing.Queue)
  2. 創建從磁盤讀取的數據的背景工作線程/進程和其饋送到輸入隊列
  3. 創建背景工作線程從輸出隊列將數據寫入磁盤/過程
  4. 主環路,它從輸入隊列中取出數據,創建批次,處理GPU上的數據,並填充輸出隊列