Keras中CPU和GPU的混合使用

问题描述 投票:2回答:2

我正在Keras上构建一个神经网络,包括多层LSTM,Permute和Dense。

似乎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)
python tensorflow keras
2个回答
1
投票

正如您可能读到的here - tf.device是一个上下文管理器,它将默认设备切换为在其创建的上下文(块)中作为其参数传递的内容。所以这段代码应该在'/cpu:0'运行所有CPU设备并在GPU上运行。

问题是它加速你的训练真的很难回答,因为它取决于你使用的机器 - 但我不希望计算更快,因为设备的每次更改都会使数据在GPU RAM和机器RAM之间被复制。这甚至可能会减慢您的计算速度。


0
投票

我创建了一个使用2个LSTM和1个密集层的模型,并在我的GPU(NVidia GTX 10150Ti)中训练它。这是我的观察。

  1. 使用CUDA LSTM https://keras.io/layers/recurrent/#cudnnlstm
  2. 如果我使用非常小的批量(2-10),则使用可以帮助更多GPU并行性的浴槽尺寸,不使用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))
© www.soinside.com 2019 - 2024. All rights reserved.