Python 为什么tensorflow.keras代码占用大量内存?

Python 为什么tensorflow.keras代码占用大量内存?,python,tensorflow2.0,tensorflow2.x,Python,Tensorflow2.0,Tensorflow2.x,我有以下代码,需要3GB物理RAM和144GB虚拟RAM: model=Sequential() 添加(输入(形状=(输入形状,)) 添加(稠密(50,activation='relu',kernel\u initializer='he\u normal')) 模型。添加(辍学(0.1)) model.add(密集型(1,激活='sigmoid')) compile(optimizer='adam',loss='binary\u crossentropy',metrics=[AUC(curve=

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

model=Sequential()
添加(输入(形状=(输入形状,))
添加(稠密(50,activation='relu',kernel\u initializer='he\u normal'))
模型。添加(辍学(0.1))
model.add(密集型(1,激活='sigmoid'))
compile(optimizer='adam',loss='binary\u crossentropy',metrics=[AUC(curve='PR'),
name='auc')])
es=提前停止(监视器='val_auc',耐心=10,模式='max',详细=1)
历史=模型拟合(X\U序列、y\U序列、批量大小=50、详细度=0、,
验证(拆分=0.2,回调=[es],纪元=500)
eval_auc=max(history.history['val_auc']))
ix=np.argmax(history.history['val_auc']))
打印(“交互次数:”,ix)
打印(eval_auc)

X_列车的形状为(44000233),其数据类型为
np.int8
。它需要52MB的内存空间。我使用的是tensorflow V2.2。为什么要占用这么多空间?我应该如何减少内存使用?

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

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

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

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

52MB/图像=52000000*50=2600MB/批

添加(稠密(50,activation='relu',kernel\u initializer='he\u normal'))

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

模型。添加(辍学(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来存储图像

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


52MB/图像=52000000*50=2600MB/批

添加(稠密(50,activation='relu',kernel\u initializer='he\u normal'))

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

模型。添加(辍学(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来存储图像

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


嗨!你能给我们一个最小的可复制的例子,这样我们就可以复制粘贴这个代码,并在工作中看到它。如果你把它放在一个我们可以直接使用的共享google colab中,那就更好了。是的,你可以在这个链接的“Overfit MLP With Early stop”部分运行这个程序:在AWS EC2上,它显示使用了140+GB的虚拟内存。在我的MacPro上,它显示使用了超过100GB的虚拟内存。我使用“htop”来监控执行情况。您可能需要将n_样本增加到一个较大的数量来观察它;e、 从100到1000。使用的物理RAM只有200MB。我不确定我是否理解。在你发布的链接中,当你提到1233维度时,他们会谈论2D数据。最简单的方法是,如果你我可以复制粘贴一些代码,你会发现错误。嗨!你能给我们一个最小的可复制的例子,这样我们就可以复制粘贴这个代码,并在工作中看到它。如果你把它放在一个我们可以直接使用的共享google colab中,那就更好了。是的,你可以在这个链接的“Overfit MLP With Early stop”部分运行这个程序:在AWS EC2上,它显示使用了140+GB的虚拟内存。在我的MacPro上,它显示使用了超过100GB的虚拟内存。我使用“htop”来监控执行情况。您可能需要将n_样本增加到一个较大的数量来观察它;e、 从100到1000。使用的物理RAM只有200MB。我不确定我是否理解。在你发布的链接中,当你提到1233维度时,他们会谈论2D数据。最简单的方法是,如果你我可以复制粘贴一些代码,你就会发现错误。问题存在于不使用GPU的情况下。另外,请根据tensorflow V2.x和tf.keras发表评论。谢谢。这个问题不使用GPU就存在了。另外,请根据tensorflow V2.x和tf.keras发表评论。非常感谢。