【问题标题】:Why does this tensorflow.keras code take huge amount of memory?为什么这个 tensorflow.keras 代码会占用大量内存?
【发布时间】:2020-09-20 11:29:59
【问题描述】:

我有以下代码需要 3GB 物理 RAM 和 144GB 虚拟 RAM:

model = Sequential()
model.add(Input(shape=(input_shape,)))
model.add(Dense(50, activation='relu', kernel_initializer='he_normal'))
model.add(Dropout(0.1))
model.add(Dense(1, activation='sigmoid'))

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=[AUC(curve='PR', 
                                                        name='auc')])

es = EarlyStopping(monitor='val_auc', patience=10, mode='max', verbose=1)

history = model.fit(X_train, y_train, batch_size=50, verbose=0, 
         validation_split=0.2, callbacks=[es], epochs=500)   
eval_auc = max(history.history['val_auc'])
ix=np.argmax(history.history['val_auc'])
print("Number of interations: ", ix)
print(eval_auc)

X_train 的形状为 (44,000, 1,233),其数据类型为 np.int8。它需要 52MB 的内存空间。我正在使用张量流 V2.2。为什么要占用这么多空间?我应该怎么做才能减少内存使用?

【问题讨论】:

  • 嗨!您能否给我们一个最小的可重现示例,以便我们可以复制粘贴此代码并查看它的工作情况。如果你把它放在我们可以直接使用的共享 google colab 中,那就更好了。
  • 是的,您可以在此链接的“Overfit MLP With Early Stopping”部分运行程序:machinelearningmastery.com/…
  • 在 AWS EC2 上,它显示使用了 140+GB 的虚拟内存。在我的 MacPro 上,它显示已使用超过 100GB 的虚拟内存。我使用'htop'来监控执行。您可能需要将 n_samples 增加到一个较大的数字来观察它;例如,从 100 到 1000。使用的物理 RAM 只有 200MB。
  • 我不确定我是否理解。在您发布的链接中,当您提到 1233 个维度时,他们谈论的是 2D 数据。
  • 最简单的方法是,如果您我可以复制粘贴您拥有的一些代码,这些代码会给出您注意到的错误。

标签: python tensorflow2.0 tensorflow2.x


【解决方案1】:

默认情况下,TensorFlow 会预先分配几乎所有可用的 GPU 内存,这对各种用例不利,尤其是生产和内存分析。当 keras 使用 tensorflow 作为其后端时,它会继承此行为。
TensorFlow 允许您更改其分配 GPU 内存的方式,并设置允许分配多少 GPU 内存的限制。

## keras example imports
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Embedding
from keras.layers import LSTM

## extra imports to set GPU options
import tensorflow as tf
from keras import backend as k

###################################
# TensorFlow wizardry
config = tf.ConfigProto()

# Don't pre-allocate memory; allocate as-needed
config.gpu_options.allow_growth = True

# Only allow a total of half the GPU memory to be allocated
config.gpu_options.per_process_gpu_memory_fraction = 0.5

# Create a session with the above options specified.
k.tensorflow_backend.set_session(tf.Session(config=config))
###################################

model = Sequential()
model.add(Embedding(max_features, output_dim=256))
model.add(LSTM(128))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

model.fit(x_train, y_train, batch_size=16, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=16)

要进一步减少相关的内存,您可以从密集(完整)矩阵创建稀疏矩阵。

【讨论】:

  • 不使用 GPU 存在问题。另外,请根据 tensorflow V2.x 和 tf.keras 发表评论。谢谢。
【解决方案2】:

每张图片 52MB = 52000000 * 50 = 每批 2600MB

model.add(Dense(50, activation='relu', kernel_initializer='he_normal'))

权重:50 * 52MB * 4 = 10400MB(每个输出 * 每个输入 * 4 字节,我假设为 float32 权重。实际上,层值需要 50x4 字节,但谁在乎几个字节)

model.add(Dropout(0.1))

1040MB

model.add(Dense(1, activation='sigmoid'))

1040MB

总内存:2600 + 10400 + 1040 + 1040 = 15080MB = 14.7GB

  • 您确定您使用的是 int8 吗? Keras 后端通常使用 float32 或 float64,较低的精度会导致精度问题。 如果后端使用float32,那么每张图片使用208MB内存,一批50张图片使用10400MB而不是2600MB。

  • 您确定您的图像只有一个颜色通道吗?如果它被加载为 RBG,那么你需要三倍的 RAM 来存储图像。

  • 您的代码是否加载其他数据?将代码占用量降至训练所需的最低限度,看看您是否仍需要相同数量的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多