首页 > 解决方案 > cudnnLSTM 不会恢复为 cudnnCompatibleLSTM

问题描述

我正在尝试使用 TF 1.9 / 1.10 在 GPU 机器(AWS p3x2,Volta)上训练一个基本网络。不是 Keras——只有 TF。

根据 [相当有限的] 文档,我的目标是使用 cudnnLSTM 单元进行训练,保存检查点,然后恢复以在 CPU 上进行推理。根据这个目标,我认为 cudnnCompatibleLSTM 是可行的方法,因为它应该从 GPU 特定的 LSTM 实现中吸收权重。

无论我尝试什么,我都会收到以下错误:

NotFoundError (see above for traceback): Key caseTesting/testbed/rnn/multi_rnn_cell/cell_0/cudnn_compatible_lstm_cell/bias not found in checkpoint   [[Node: caseTesting/testbed/save/RestoreV2 = RestoreV2[dtypes=[DT_FLOAT, DT_FLOAT],
_device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_ caseTesting/testbed/save/Const_0_0, caseTesting/testbed/save/RestoreV2/tensor_names, caseTesting/testbed/save/RestoreV2/shape_and_slices)]]

另一个相关问题是 cudnnCompatibleLSTM 和 cudnnLSTM 在数学上并不相同。对于初始化的单元格,我得到不同的结果。[由一些 tf.constant() 作为初始化程序初始化,不保存/恢复]。似乎 cudnnLSTM 确实依赖于随机种子 [dropout 为零],这意味着正在进行一些独特的张量/张量初始化,将其与 cudnnCompatibleLSTM 分开。

有人有线索吗?

标签: tensorflow

解决方案


一些答案:

假设您已阅读有关 cudnnLSTM + cudnnCompatibleLSTM 的文档 [很遗憾,它主要是代码中的文档]

  1. 构建两个图形替代方案,每个一个
  2. 不要给实际的 LSTM 单元命名[无范围]
  3. with tf.variable_scope("cudnn_lstm"):为 cudnnCompatible 块添加范围
  4. 要保存检查点,请使用不限于可训练的保护程序(仔细控制保护程序构造的位置可以做到这一点,实际上,如果你真的需要它)
  5. 恢复:似乎您必须使用古老的方法进行恢复,而不是使用元文件。

关于 cudnnLSTM 和标准 LSTM 的数学不等式,没什么好说的。尚不确定如何将遗忘门初始化为 1.0,尽管我确信这可以通过一些黑客攻击来完成。


推荐阅读