1

我有以下代码需要 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。为什么要占用这么多空间?我应该怎么做才能减少内存使用?

4

2 回答 2

3

默认情况下,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)

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

于 2020-06-05T02:09:08.470 回答
0

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

model.add(密集(50,激活='relu',kernel_initializer='he_normal'))

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

model.add(辍学(0.1))

1040MB

model.add(密集(1,激活='sigmoid'))

1040MB

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

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

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

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

于 2020-06-11T22:10:10.527 回答