lstm は基準を満たしていないため、cuDNN カーネルを使用しません。GPU で実行する場合は、フォールバックとして汎用 GPU カーネルを使用します。質問する

lstm は基準を満たしていないため、cuDNN カーネルを使用しません。GPU で実行する場合は、フォールバックとして汎用 GPU カーネルを使用します。質問する

私は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.

GPU なしの場合よりもトレーニング速度がはるかに遅くなります。DBR 9.0 ML (Apache Spark 3.1.2、GPU、Scala 2.12 を含む) を使用していますが、これには追加のライブラリが必要ですか?

ベストアンサー1

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 上で実行されますが、スキャンおよび matmul 操作を使用して構築されるため、速度が大幅に低下します。私の経験では、CUDNN LSTM/GRU アクセラレーションは非常にうまく機能するため、このレイヤーははるかに単純であるにもかかわらず、これらのレイヤーは両方とも SimpleRNN レイヤー (CUDNN によってアクセラレーションされない) よりも高速に実行されます。

おすすめ記事