在Keras中混合使用CPU和GPU的方法

3

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

看起来LSTM在GPU上并不友好。所以我进行了研究并使用了

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

根据我对 with 的理解,with 是一个 try...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)

你面临的问题和我一样...但是在这个例子中你不需要它。重塑层非常轻,几乎什么都不做。 - Daniel Möller
2个回答

2

如您在此处所了解的那样,tf.device是一个上下文管理器,它在由其创建的上下文(块)中将默认设备切换为传递给它作为参数的设备。因此,此代码应该在CPU上运行所有'/cpu:0'设备,并在GPU上运行其余部分。

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


是的。它肯定会加速训练。我制作了两个版本的模型。CPU+GPU版本在30秒内训练一批数据。纯GPU版本需要的时间比我的耐心长几分钟,具体多久我不知道。 - Daniel Möller
你能提供一个源代码/笔记本来做比较吗? - Marcin Możejko
创建一个常规卷积模型并在末尾堆叠几个LSTM层。让其中一个模型使用CPU进行LSTM层的计算。--- 更新:纯GPU模型刚刚占用了GPU的内存。 - Daniel Möller
我以为你在谈论这个例子中的模型。你所说的过程被称为后期融合,Karpathy有一篇很棒的论文介绍了它。 - Marcin Możejko

0

我使用了2个LSTM和1个dense层创建了一个模型,并在我的GPU(NVidia GTX 10150Ti)上进行了训练。以下是我的观察结果。

  1. 使用CUDA LSTM https://keras.io/layers/recurrent/#cudnnlstm
  2. 使用适当的batch size可以更好地利用GPU并行性,如果使用非常小的batch size(2-10),则GPU多核心无法充分利用;因此我使用了100作为batch size
  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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接