无法使用在GPU实例上训练的深度学习RNN模型来推断仅CPU实例

时间:2019-08-19 06:44:53

标签: python tensorflow keras

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

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

如果使用CuDNNLSTM,则会出现类似的错误

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

1 个答案:

答案 0 :(得分:1)

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

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

CuDNNGRU

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实例的推断。

GRU

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')

LSTM

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 = True recurrent_activation ='Sigmoid'选项,即可解决我的问题。