I am working on LSTM model with stateful using keras (Tensorflow backend); I cannot parallelize it on multi-GPU platform. here is link to code. I am getting following error.
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [256,75,39] vs. [512,75,39]
[[Node: training/cna/gradients/loss/concatenate_1_loss/mul_grad/BroadcastGradientArgs = BroadcastGradientArgs[T=DT_INT32, _class=["loc:@loss/concatenate_1_loss/mul"], _device="/job:localhost/replica:0/task:0/gpu:0"](training/cna/gradients/loss/concatenate_1_loss/mul_grad/Shape, training/cna/gradients/loss/concatenate_1_loss/mul_grad/Shape_1)]]
[[Node: replica_1/sequential_1/dense_1/truediv/_473 = _Recvclient_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:1", send_device_incarnation=1, tensor_name="edge_3032_replica_1/sequential_1/dense_1/truediv", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]]
I am using 2 GPU with batch size of 256. Please help.
Thanks in advance.
答案 0 :(得分:2)
这个错误似乎只是因为您将两个较小批次大小为256的原始批次划分为512。
有状态图层需要固定的批量大小(请参阅模型开头的参数batch_shape
或batch_input_shape
)。
您可以尝试重新创建将batch_shape
(或batch_input_shape
)更改为256(如果它当前为512)的模型。或者反过来说如果我误解了当前的价值。
如果您已经拥有一个训练有素的模型,您可以创建另一个具有相同类型的图层和相同形状的模型,只更改输入形状。然后你可以newModel.set_weights(oldModel.get_weights())
那就是说,我认为并行化有状态模型是不安全的。在有状态模型中," batch2"是" batch1"的续集。两个批次代表相同的"相同"顺序,顺序是绝对重要的。如果batch1在batch1之前被处理,您将输入一个反向序列,您的模型将会错误地理解它。
除非您发现Keras文档明确声明您可以安全地并行化有状态模型,否则如果并行化模型始终提供与单个GPU模型相同的结果,您可能会仔细检查(经过多次尝试)。
答案 1 :(得分:0)
我目前正致力于stateful_multi_gpu,这是一个为多GPU培训构建有状态RNN模型的实验性工具。
与Daniel Möller's answer相反,我认为您可以明确说明顺序:在哪个GPU上处理哪个子批次以及如何将结果重新组合在一起。
我仍然需要测试它是否正确训练多个GPU,以及它是否可以并行化任意状态模型。因此,我对任何人使用此实用程序的经验感兴趣!