Python 为什么tensorflow.keras代码占用大量内存?
我有以下代码,需要3GB物理RAM和144GB虚拟RAM: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=
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来存储图像
- 您的代码是否加载其他数据?将代码占用降至培训所需的最小值,并查看是否仍需要相同的内存量
- 您确定正在使用int8吗?Keras后端通常使用float32或float64,较低的精度可能会导致精度问题。 如果后端使用float32,则每个映像使用208MB内存,一批50个映像使用10400MB而不是2600MB内存
- 您确定您的图像只有一个颜色通道吗?若它被加载为RBG,那个么你们需要三倍多的RAM来存储图像
- 您的代码是否加载其他数据?将代码占用降至培训所需的最小值,并查看是否仍需要相同的内存量