【问题标题】:Training broke with ResourceExausted error训练因 ResourceExausted 错误而中断
【发布时间】:2018-06-09 00:45:26
【问题描述】:

我是 TensorFlow 和机器学习的新手。最近我在做一个模型。我的模型如下,

  1. 字符级嵌入向量 -> 嵌入查找 -> LSTM1

  2. 字级嵌入向量->嵌入查找-> LSTM2

  3. [LSTM1+LSTM2]->单层MLP->softmax层

  4. [LSTM1+LSTM2]->单层MLP->WGAN判别器

  5. 循环模型代码

当我在这个模型上工作时,我收到了以下错误。我以为我的批次太大了。因此,我尝试将批量大小从 20 减少到 10,但它不起作用。

ResourceExhaustedError(回溯见上文):分配时出现 OOM 形状为 [24760,100] [[节点: 字符/双向_rnn/bw/bw/while/bw/lstm_cell/split = 拆分[T=DT_FLOAT, num_split=4, _device="/job:localhost/replica:0/task:0/device:GPU:0"](gradients_2/Add_3/y, chars/bidirectional_rnn/bw/bw/while/bw/lstm_cell/BiasAdd)]] [[节点: bi-lstm/bidirectional_rnn/bw/bw/stack/_167 = _Recvclient_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_636_bi-lstm/bidirectional_rnn/bw/bw/stack", tensor_type=DT_INT32, _device="/job:localhost/replica:0/task:0/device:CPU:0"]]

张量 shape[24760,100] 表示 2476000*32/8*1024*1024 = 9.44519043 MB 内存。我在 Titan X(11 GB) GPU 上运行代码。会出什么问题?为什么会出现这种错误?

* 额外信息 *:LSTM1 的大小为 100。对于双向 LSTM,它变为 200。 LSTM2 的大小为 300。对于双向 LSTM,它变为 600。

*注意*:错误发生在 32 epoch 之后。我的问题是为什么在 32 epoch 之后会出现错误。为什么不在初始时期。

【问题讨论】:

标签: python tensorflow batch-processing


【解决方案1】:

这些天我一直在调整很多来解决这个问题。

最后,我还没有解开问题中描述的内存大小之谜。我想在计算梯度时,tensoflow 会为计算梯度积累大量额外的内存。我需要检查 tensorflow 的来源,这在这个时候看起来很麻烦。您可以通过以下命令从终端检查您的模型使用了多少内存,

nvidia-smi

从这个命令你可以猜出你可以使用多少额外的内存。

但这类问题的解决方案在于减少批量大小,

对于我的情况,将批次的大小减少到 3 个作品。这可能会有所不同 模型到模型。

但是,如果您使用的模型中嵌入矩阵要大得多而无法将它们加载到内存中呢?

解决办法是写一些痛苦的代码。

您必须查找嵌入矩阵,然后将嵌入加载到模型中。简而言之,对于每个批次,您必须将查找矩阵提供给模型(通过 sess.run() 中的 feed_dict 参数提供它们)。

接下来你将面临一个新问题,

您不能以这种方式制作嵌入trainable。解决方案是使用placeholder 中的嵌入并将它们分配给Variable(例如A)。每批训练后,学习算法更新变量A。然后通过 tensorflow 计算A 向量的输出,并将它们分配给模型之外的嵌入矩阵。 (我说过程很痛苦)

现在您的下一个问题应该是,如果您无法将嵌入查找提供给模型,因为它太大了怎么办。这是一个你无法回避的根本问题。这就是为什么 NVIDIA GTX 1080、1080ti 和 NVIDA TITAN Xp 价格差异如此之大的原因,尽管 NVIDIA 1080ti 和 1080 具有更高的执行频率。

【讨论】:

  • 训练时,您是否观察到使用大批量时资源使用量增加?使用nvidia-smitop?
  • 不,我没有检查资源大小是否在增加。但我一定会检查并通知您。
  • @DylanF 资源占用好像没有增加。
【解决方案2】:

*注意*:错误发生在 32 epoch 之后。我的问题是为什么在 32 epoch 之后会出现错误。为什么不在初始时期。

这是图表在执行期间不是静态的主要线索。我的意思是,您可能会使用 sess.run(tf.something) 而不是

my_something = tf.something
with tf.Session() as sess: 
    sess.run(my_something)

我在尝试实现有状态 RNN 时遇到了同样的问题。我偶尔会重置状态,所以我在做sess.run([reset if some_condition else tf.no_op()])。只需将nothing = tf.no_op() 添加到我的图表并使用sess.run([reset if some_condition else nothing]) 即可解决我的问题。

如果您可以发布训练循环,就更容易判断这是不是出了什么问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    相关资源
    最近更新 更多