【问题标题】:using cuDNN kernel for LSTM为 LSTM 使用 cuDNN 内核
【发布时间】:2020-05-27 13:54:37
【问题描述】:

我想使用 Cudnn 训练我的 RNN 模型:

max_length <- 140 
embedding_dim <- 128

model <- keras_model_sequential()

# define model
model %>% 
  # layer input
  layer_embedding(
    name = "input",
    input_dim = num_words,
    input_length = max_length,
    output_dim = embedding_dim, 
    embeddings_initializer = initializer_random_uniform(minval = -0.05, maxval = 0.05, seed = 2)
  ) %>%
  # layer dropout
  layer_spatial_dropout_1d(
    name = "embedding_dropout",
    rate = 0.2
  ) %>%
  # layer lstm 1
  bidirectional(layer_lstm(
    name = "lstm",
    units = 64,
    unroll = FALSE,
    dropout = 0.2,
    use_bias = TRUE,
    recurrent_dropout = 0,
    return_sequences = TRUE
  )) %>% 
  layer_batch_normalization() %>%
  # layer output
  layer_dense(
    name = "output",
    units = 3,
    activation = "softmax"
  )

当我运行它时,我得到了这种温暖:

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

我想我已经关注了所有requirements,不确定我错过了什么。

会话信息:

R version 4.0.0 (2020-04-24)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18363)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] keras_2.3.0.0

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.4.6     lattice_0.20-41  zeallot_0.1.0    rappdirs_0.3.1  
 [5] grid_4.0.0       R6_2.4.1         jsonlite_1.6.1   magrittr_1.5    
 [9] tfruns_1.4       whisker_0.4      Matrix_1.2-18    reticulate_1.15 
[13] generics_0.0.2   tools_4.0.0      xfun_0.14        compiler_4.0.0  
[17] base64enc_0.1-3  tensorflow_2.2.0 knitr_1.28   

【问题讨论】:

    标签: r tensorflow keras


    【解决方案1】:

    我遇到了同样的问题,并通过手动设置选项来修复它,以使用指定的here 的 cuDNN 兼容实现。

    “根据可用的运行时硬件和约束,该层将选择不同的实现(基于cuDNN或纯TensorFlow)以最大化性能。如果GPU可用并且该层的所有参数都满足CuDNN的要求内核(详见下文),该层将使用快速 cuDNN 实现。”

    使用 cuDNN 实现的要求是:

    1. 激活 == tanh
    2. recurrent_activation == sigmoid
    3. recurrent_dropout == 0
    4. 展开是假的
    5. use_bias 为真
    6. 输入,如果使用掩码,严格右填充。
    7. 在最外层启用了急切执行 上下文。

    特别是,我必须指定recurrent_activation == sigmoid。我安装的 Keras/TF 版本默认为recurrent_activation == hard_sigmoid

    【讨论】:

    • 我为LSTM 层指定了activation="relu"。阅读答案并删除规范后解决了问题。
    • 对我来说也一样。但现在你有一种不同的行为,也许你不想发生这种情况
    • 超级有用的答案,感谢您指出。 model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2)) 会给我错误,但将 recurrent_dropout = 0 参数更改为 0 有助于实现 cuDNN。
    • 我最初使用的是 activation ='relu' 我将其更改为 activation ='tanh' 并为我解决了
    猜你喜欢
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 2020-10-31
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    相关资源
    最近更新 更多