TensorFlow GPU上无法解释的过多内存分配(bi-LSTM和CRF)

时间:2017-05-15 13:40:40

标签: python tensorflow gpu tensorboard

我正在使用TensorFlow开发NLP模型。这是Tensorboard上显示的模型图。这个模型被称为“简单模型”。

enter image description here

为了改善结果,我想训练一个联合模型,我在上面的图中复制了标有“模板模型以复制”的块。该块包括两个双向LSTM。联合模型如下所示。

enter image description here

在关节模型中,我们有两个来自简单模型的模板块实例,在上面显示的联合模型图中用“REPLICA 1”和“REPLICA 2”标记。简单模型和联合模型之间的唯一区别在于,在联合模型中,“CRF”块的输入是两个副本的输出的平均值。因此,如果我们在关节模型中只有一个副本,那么它应该产生与简单模型相同的结果。

对于此平均值,我只使用tf.stacktf.reduce_mean,如下所示:

with tf.name_scope("average_logits"):
    # Stack the list of logits tensors with rank R into a single
    # tensor with rank R+1
    logits = tf.stack(logits,
                      axis=0,
                      name="stacked_logits")
    # Average out this tensor over dimension 0 (models dimension)
    self.logits = tf.reduce_mean(logits,
                                 axis=0,
                                 name="average_logits")

现在,在GPU上运行,简单模型占用大约700MB的空间,而联合模型占用大约4GB,我无法找到解释,因为“context_bi-lstm”和“chars”中的变量“块总共最多需要200MB。这个过度分配对我来说是一个问题,因为我有一个8GB的GPU并且想要运行一个包含2个以上副本的模型,并且会产生OOM错误。

所以我不知道记忆力的急剧增加来自何处。我可能会使用tf.stacktf.mean_reduce执行一些非常耗费内存的操作吗?

0 个答案:

没有答案