首页 > 解决方案 > 无法使用在 GPU 实例上训练的深度学习 RNN 模型来推断仅 CPU 实例

问题描述

我在 GPU 实例上训练了一个深度学习模型以加快训练过程。但不幸的是,我们的产品实例是纯 CPU 实例。当我尝试在纯 CPU 实例上使用带有 CuDNNGRU 的 GPU 训练模型时,出现以下错误。

ValueError: CuDNNGRU is not compatible with GRU(reset_after=False)

如果您使用 CuDNNLSTM,您会遇到类似的错误

ValueError: CuDNNLSTM is not compatible with LSTM(reset_after=False)

标签: pythontensorflowkeras

解决方案


不要使用 CuDNNGRU 或 CuDNNLSTM,而是使用带有以下选项的普通 GRU 或 LSTM

当在 GPU 上训练的 CuDNNGRU 或 CuDNNLSTM 模型在仅 CPU 实例上推理时抛出错误时抛出错误的代码。

库登格鲁

if tf.test.is_gpu_available():
    return tf.keras.layers.CuDNNGRU(units, 
                                    return_sequences=True, 
                                    return_state=True,
                                    recurrent_initializer='glorot_uniform')
else:
    return tf.keras.layers.GRU(units,
                               return_sequences=True,
                               return_state=True, 
                               recurrent_initializer='glorot_uniform')

或者

CuDNNLSTM

if tf.test.is_gpu_available():
    return tf.keras.layers.CuDNNLSTM(units, 
                                    return_sequences=True, 
                                    return_state=True,
                                    recurrent_initializer='glorot_uniform')
else:
    return tf.keras.layers.LSTM(units,
                               return_sequences=True,
                               return_state=True, 
                               recurrent_initializer='glorot_uniform')

请使用以下代码,以便您可以使用经过 GPU 训练的模型对仅 CPU 实例进行推理。

格鲁乌

if tf.test.is_gpu_available():
    return tf.compat.v1.keras.layers.CuDNNGRU(units,
                                              return_sequences=True,
                                              return_state=True,
                                              recurrent_initializer='glorot_uniform')
else:
    return tf.keras.layers.GRU(units, 
                               return_sequences=True,
                               return_state=True,
                               recurrent_activation='sigmoid',
                               reset_after='True',
                               recurrent_initializer='glorot_uniform')

或者

长短期记忆体

if tf.test.is_gpu_available():
    return tf.compat.v1.keras.layers.CuDNNLSTM(units,
                                              return_sequences=True,
                                              return_state=True,
                                              recurrent_initializer='glorot_uniform')
else:
    return tf.keras.layers.LSTM(units, 
                               return_sequences=True,
                               return_state=True,
                               recurrent_activation='sigmoid',
                               reset_after='True',
                               recurrent_initializer='glorot_uniform')

因此,只需使用reset_after=Truerecurrent_activation='sigmoid'选项,我的问题就解决了。


推荐阅读