2017-09-22 212 views
2

我在Keras上構建了一個神經網絡,包括多層LSTM,Permute和Dense。Keras中CPU和GPU的混合使用

看來LSTM是GPU不友好的。所以,我沒有研究和使用

With tf.device('/cpu:0'): 
    out = LSTM(cells)(inp) 

但基於我對with理解,withtry...finally塊,以確保清理代碼被執行。我不知道以下CPU/GPU混合使用代碼是否有效?他們會加快培訓速度嗎?

With tf.device('/cpu:0'): 
    out = LSTM(cells)(inp) 
With tf.device('/gpu:0'): 
    out = Permute(some_shape)(out) 
With tf.device('/cpu:0'): 
    out = LSTM(cells)(out) 
With tf.device('/gpu:0'): 
    out = Dense(output_size)(out) 
+0

你面臨同樣的問題,因爲我......但你不會需要,爲了這個,例。重塑層非常非常輕,他們幾乎不做任何事。 –

回答

1

您可能讀here - tf.device是上下文管理器,其切換的缺省設備到此作爲其在上下文中(塊)由它創建的參數傳遞。所以這段代碼應該在CPU處運行所有'/cpu:0'設備,並在GPU處運行。

這個問題會加快你的培訓真的很難回答,因爲它取決於你使用的機器 - 但我不希望計算速度更快,因爲每次更改設備都會使數據在GPU RAM和機器RAM。這甚至可能會減慢你的計算速度。

+0

是的。這肯定會加快培訓。我製作了兩個版本的模型。版本CPU + GPU在30秒內訓練批次。純粹的GPU版本花費的時間比我幾分鐘的耐心還要大。 –

+0

你能提供一個比較的源代碼/筆記本嗎? –

+0

創建一個常規的卷積模型並在最後堆疊幾個LSTM層。讓一個模型使用cpu作爲LSTM層。 ---更新:純粹的GPU模型只是炸燬了GPU的內存。 –

0

我創建使用2 LSTM和1緻密層模型,並在我的GPU(英偉達GTX 10150Ti)這是我的意見訓練有素的它。

  1. 使用CUDA LSTM https://keras.io/layers/recurrent/#cudnnlstm
  2. 使用浴缸尺寸,這有助於更多的GPU的並行性,如果我用一個非常小的批量大小不被利用(2-10)GPU的多核心處理器;所以我用100作爲批處理大小
  3. 如果我在GPU上訓練我的網絡並嘗試將其用於CPU預測,它在編譯和運行方面工作良好,但預測很奇怪。在我的情況下,我也有使用GPU進行預測的好處。
  4. 爲多層LSTM,需要使用

這裏是一些示例代碼段

model = keras.Sequential() 
model.add(keras.layers.cudnn_recurrent.CuDNNLSTM(neurons 
       , batch_input_shape=(nbatch_size, reshapedX.shape[1], reshapedX.shape[2]) 
       , return_sequences=True 
       , stateful=True))