tensorflow lstm不会使用cuDNN内核,因为它不符合标准,当在GPU上运行时,它将使用通用GPU内核作为后备

fzwojiic  于 2023-11-21  发布在  其他
关注(0)|答案(3)|浏览(277)

我正在使用GPU在Databricks上运行以下LSTM代码

model = Sequential()
model.add(LSTM(64, activation=LeakyReLU(alpha=0.05), batch_input_shape=(1, timesteps, n_features), 
    stateful=False, return_sequences = True))
model.add(Dropout(0.2))
model.add(LSTM(32))
model.add(Dropout(0.2))
model.add(Dense(n_features))
model.compile(loss='mean_squared_error', optimizer=Adam(learning_rate = 0.001), metrics='acc')
model.fit(generator, epochs=epochs, verbose=0, shuffle=False)

字符串
但以下警告不断出现

WARNING:tensorflow:Layer lstm will not use cuDNN kernels since it doesn't meet the criteria. It will use a generic GPU kernel as fallback when running on GPU.


我使用的是DBR 9.0 ML(包括Apache Spark 3.1.2,GPU,Scala 2.12)我需要额外的库吗?

x3naxklr

x3naxklr1#

CUDNN具有专门加速LSTM和GRU层的功能。这些GRU/LSTM层只有在满足特定条件时才能加速。在您的情况下,问题是您正在使用LeakyReLU激活。CUDNN LSTM加速仅在激活为tanh时有效。
引用文档(https://www.tensorflow.org/api_docs/python/tf/keras/layers/LSTM

The requirements to use the cuDNN implementation are:

activation == tanh
recurrent_activation == sigmoid
recurrent_dropout == 0
unroll is False
use_bias is True
Inputs, if use masking, are strictly right-padded.
Eager execution is enabled in the outermost context.

字符串
你的LSTM仍然应该在GPU上运行,但它将使用scan和matmul操作来构建,因此要慢得多。根据我的经验,CUDNN LSTM/GRU加速工作得很好,这两个层的运行速度都比SimpleRNN层(CUDNN没有加速)快,尽管这一层要简单得多。

5vf7fwbs

5vf7fwbs2#

这是Keras库的创建者,tensorflow框架的主要贡献者Francois Chollet在他的书Deep Learning with Python 2nd edition中关于RNN运行时性能的说法。
参数很少的递归模型,比如本章中的那些,在多核CPU上的速度往往比在GPU上快得多,因为它们只涉及小的矩阵乘法,而且由于存在for循环,乘法链不能很好地并行化。
当在GPU上使用Keras LSTM或GRU层时,使用默认关键字参数时,您的层将利用cuDNN内核,这是一种高度优化的底层算法实现,由NVIDIA提供。与往常一样,cuDNN内核是喜忧参半:它们速度很快,但也是可行的--如果你试图做任何默认内核不支持的事情,你将遭受一个戏剧性的减速,例如,LSTM和GRU cuDNN内核不支持递归dropout,因此将其添加到层中会迫使运行时退回到常规的TensorFlow实现,这通常会在GPU上慢两到五倍(即使其计算成本相同)。
当你无法使用cuDNN时,为了加快RNN层的速度,你可以尝试展开它。展开for循环包括删除循环并简单地将其内容内联N次。在RNN的for循环中,展开可以帮助TensorFlow优化底层计算图。但是,它也会大大增加RNN的内存消耗-因此,它只适用于相对较小的序列(大约100步或更少)。另外,请注意,只有当模型预先知道数据中的时间步数时才能这样做(也就是说,如果您将没有任何None条目的形状传递给初始Input())。它的工作方式如下:

inputs = keras.Input(shape=(sequence_length, num_features))
    x = layers.LSTM(32, recurrent_dropout=0.2, unroll=True)(inputs)

字符串

4xrmg8kj

4xrmg8kj3#

删除activation='relu'解决了我的问题。我更改了我的模型:

model = tf.keras.models.Sequential([
tf.keras.layers.LSTM(units=50, return_sequences=True, activation='relu', input_shape=(X_train.shape[1], 1)),
tf.keras.layers.LSTM(units=50),
tf.keras.layers.Dense(1)

字符串
])
对此:

model = tf.keras.models.Sequential([
tf.keras.layers.LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1)),
tf.keras.layers.LSTM(units=50),
tf.keras.layers.Dense(1)


])

相关问题