【问题标题】:OOM error after variable initialization in tensorflowtensorflow中变量初始化后的OOM错误
【发布时间】:2018-05-30 14:40:27
【问题描述】:

这是我的错误:

OOM when allocating tensor of shape [7,7,512,4096] and type float
 [[Node: W6/Adam/Initializer/zeros = Const[dtype=DT_FLOAT, value=Tensor<type: float shape: [7,7,512,4096] values: [[[0 0 0]]]...>, _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]

在回溯中我可以看到它是由这一行引起的:

sess.run(tf.global_variables_initializer())

所有参数组合使用大约 1.5Gb 的内存。我有 4 Gb 的可用内存。

我已经试过了,没有成功:

config.gpu_options.allocator_type = 'BFC'
config.gpu_options.per_process_gpu_memory_fraction = 0.40
config.gpu_options.allow_growth = True

我该如何解决?

编辑:

我是如何计算已用内存量的?

    var_sizes = [np.product(list(map(int, v.shape))) * v.dtype.size
         for v in tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES)]
    print(sum(var_sizes) / (1024 ** 2), 'MB')

【问题讨论】:

  • 我猜你实际上需要超过 1.5Gb。你是怎么得到这个号码的?
  • 我添加了信息。不过应该不是问题。

标签: tensorflow


【解决方案1】:

在您的计算中,您计算​​保存变量所需的内存量。然而,这只是您需要的内存的一小部分。你特别缺少:

  • 神经元输出(即特征)。
  • 成本函数相对于模型参数和特征的梯度。

Tensorflow 确实会尽可能优化内存,但这会给你一个大概的估计。因此,如果您总共需要超过 4Gb,我不会感到惊讶。

【讨论】:

  • 好吧有道理。您知道一种预先计算所需内存量的方法吗?我可以让 tensorflow 将一些中间结果存储在 RAM 中并稍后再次使用它吗?
  • 为了在计算之前估计内存占用,我会根据这些元素(参数、输出和它们的梯度,如果它们很重要,也可以计算常量——希望不是)。如果您不想改变您的网络,减少批量大小有时可能是一个简单的解决方案。
  • 好的,所以我可以通过考虑梯度来使我的估计数量翻倍。关于特征图,我认为一旦不再需要它们就会被删除。所以 1.5GB*2 = 3GB + 1GB 的中间特征图应该足够了。
  • @siva 注意,通常需要特征图来计算梯度。它们一直保留到梯度向下游反向传播。
猜你喜欢
  • 1970-01-01
  • 2019-01-23
  • 2017-06-16
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
相关资源
最近更新 更多