【问题标题】:Keras Model With CuDNNLSTM Layers Doesn't Work on Production Server具有 CuDNNLSTM 层的 Keras 模型在生产服务器上不起作用
【发布时间】:2018-06-13 15:17:59
【问题描述】:

我已经使用 AWS p3 实例使用 GPU 加速来训练以下模型:

x = CuDNNLSTM(128, return_sequences=True)(inputs)
x = Dropout(0.2)(x)
x = CuDNNLSTM(128, return_sequences=False)(x)
x = Dropout(0.2)(x)
predictions = Dense(1, activation='tanh')(x)
model = Model(inputs=inputs, outputs=predictions)

训练后,我使用 Keras 的 save_model 函数保存了模型,并将其移至没有 GPU 的单独生产服务器。

当我尝试在生产服务器上使用模型进行预测时,它失败并出现以下错误:

没有注册 OpKernel 以支持具有这些属性的 Op 'CudnnRNN'。注册设备:[CPU],注册内核:

我猜这是因为生产服务器不支持 GPU,但我希望这不会成为问题。有什么方法可以在没有 GPU 的生产服务器上使用这个模型?

【问题讨论】:

  • 您仍然可以使用CuDNNLSTM 层进行训练,但在您的预测服务器上,它们必须替换为LSTM。你可以尝试在GPU机器上使用save_weights(而不是save_model),在CPU机器上使用load_weights
  • 似乎没有解决办法,@Yu-Yang 的解决方案有效

标签: python tensorflow keras tensorflow-gpu


【解决方案1】:

不,你不能,CuDNN 需要使用 CUDA GPU。您必须将 CuDNNLSTM 层替换为标准 LSTM 层。

【讨论】:

  • 用 LSTM 层替换 CuDNNLSTM 层不会得到正确的结果,因为格式不同。
  • 是的,你可以。结帐this answer
【解决方案2】:

试试

pip install tensorflow-gpu

【讨论】:

  • 它不能解决问题。没有GPU,它仍然是一样的。结帐this answer
【解决方案3】:

您绝对可以在 CuDNNLSTM 上进行训练,然后在 LSTM 上运行推理。

诀窍是在加载 h5 文件之前,在 .json 文件中将层架构从 CuDNNLSTM 更改为 LSTM。当您加载 h5 文件时,CuDNNLSTM 权重中的 2x 偏差会自动转换,但 Keras 不会自动为您更改 .json 文件。

换句话说,只需打开您保存的 .json 模型,将所有 CuDNNLSTM 实例更改为 LSTM,保存 .json 文件,然后加载您的 .h5 文件。然后您应该能够对模型进行推理。

【讨论】:

  • 还需要更改reccurrent_activation checkout this answer
【解决方案4】:

简短回答: 是的你可以。

只需要使用 LSTM 层而不是 CuDNNLSTM 重新创建您的架构。

您的代码应如下所示:

x = LSTM(128, return_sequences=True, recurrent_activation='sigmoid')(inputs)
x = Dropout(0.2)(x)
x = LSTM(128, return_sequences=False, recurrent_activation='sigmoid')(x)
x = Dropout(0.2)(x)
predictions = Dense(1, activation='tanh')(x)
model = Model(inputs=inputs, outputs=predictions)

然后

model.load_weights(path_to_your_weights_file)

注意recurrent_activation='sigmoid'。这很重要。

详细解释:

LSTM 和 CuDNNLSTM 相互兼容,因此您可以毫无问题地将重量从一个加载到另一个。但是,它们的激活函数的默认值略有不同。正如here 所报告的那样,有时它会导致两者之间的微小差异,但也可能会导致非常大的差异。

CuDNNLSTM [...] 的 [激活值] 在 CuDNN 中是硬编码的,无法从 Keras 更改。它们对应于activation='tanh' 和recurrent_activation='sigmoid'(与[LSTM] Keras 中的默认hard_sigmoid 略有不同)。 ref

【讨论】:

  • 惊人的方法。将权重从 gpu 模型加载到 cpu 空模型,它适用于我。
【解决方案5】:

解决这个问题的最简单方法是 用常规的 keras 层替换 CuDNN 层, IE。将 CudNNLSTM 转换为 LSTM 等

如果使用 Google Colab,请转到运行时>更改运行时设置并将加速器设置为 GPU

【讨论】:

    猜你喜欢
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2019-10-09
    • 2020-05-20
    • 2014-06-15
    • 1970-01-01
    • 2019-05-13
    相关资源
    最近更新 更多