【问题标题】:Why does this Keras model require over 6GB of memory?为什么这个 Keras 模型需要超过 6GB 的内存?
【发布时间】:2016-06-15 21:24:38
【问题描述】:

使用 Tensorflow 后端,这个 Keras 模型似乎需要 6GB 以上的 RAM。我粗略的计算表明,存储权重不应超过 500MB。怎么回事?

from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout, Flatten
from keras.layers.convolutional import Convolution2D, MaxPooling2D

IMAGE_SIZE = 128
print('Build model...')
model = Sequential()
# three color channels, 128x128
# 16 con filters, 3 rows, 3 columns
model.add(Convolution2D(16, 3, 3, input_shape=(3, IMAGE_SIZE, IMAGE_SIZE)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(1))
model.add(Dense(3 * IMAGE_SIZE * IMAGE_SIZE))


model.compile(loss='mse', optimizer='sgd')

这是一个连接到单个神经元的卷积层(16 个 3x3 过滤器),然后该单个神经元连接到大约 50k 个神经元。

我对 Keras 还很陌生,所以我想我的误解很根本,但我似乎无法弄清楚。

【问题讨论】:

  • 您是否尝试过其他后端来缩小错误的可能性?
  • 是的,我刚刚安装了 Theano(没有进行任何调整),内存使用率似乎也一样高。 Keras 内部是否有可能在使用后端之前就泄漏了?我对代码的了解还不够……
  • 显然,您需要一个更准确的信封。您对 500MB 的期望有什么依据?
  • 哈哈,听起来你可能比我更了解正在发生的事情。也许你可以分享你的计算?也许我的误解是 conv 网络的 num_filters (第一个)参数。我的理解是有O(filters * pixels) 权重从conv 网络到单个神经元,然后O(pixels) 权重到密集层。
  • 不,我不知道发生了什么;抱歉,如果我的笑话另有暗示。我想你知道 Big-O 表示法是一个忽略常数因素的比例函数。如果你告诉我,我对一个不熟悉的复杂 Python 包的内存使用量的估计值相差了 12 倍,我完全不会感到惊讶。

标签: python neural-network keras


【解决方案1】:

事实证明,我的问题是在我的 LD_CONFIG_PATH 中包含了 CUDA 7.5 的路径,但在 PATH 中包含了 CUDA 7.0 的路径。显然,这种尴尬的组合会产生一些未定义的行为,在我的情况下会产生内存泄漏。

在使用valgrind 检查代码后,我发现7.0 中的nvcc 本质上是跳入了CUDA (7.5) 库的无意义区域,这并不意外。实际上,它泄漏了内存而不是崩溃,这真是太神奇了,而且 Theano 也有同样的错误。

希望以后没有其他人会受到这个特定问题的困扰,但如果你是,请仔细检查你的版本路径!

在我的本地机器上,没有安装 GPU 的 Tensorflow,我仍然遇到内存泄漏,这似乎是以前 (0.7.0) 版本中的一个错误,已在 (0.7.1) 版本中解决。同样,我还没有弄清楚为什么我的非 GPU Theano 后端也会产生泄漏,但是在升级 TensorFlow 之后,Theano 后端也没有泄漏。这是一件很奇怪的事情,但我相信这个问题的一般解决方案是“升级”和“仔细检查你的环境”。

【讨论】:

  • 只是出于好奇,你有没有检查一下它最终使用了多少内存?
猜你喜欢
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多