这是我第一次遇到此问题。我使用这种模型已有一段时间,但数据较少。问题在于,在前三个时期中,训练耗时11秒/步(31k样本/ 128批大小),而在第4个时期中,培训耗时18秒/步。第五步大约需要45秒/步。我使用的是Keras,没有做任何自定义循环的恶作剧。
有人可以解释这种放缓吗?该模型尚未被中断。我正在使用TF 2.3
CreateObject("WScript.Shell").Run "C:\Test.vbs"
编辑:我只是对数据的一个非常小的样本(20个项目/类别)运行了此步骤,并且步长时间不会增加。 proof
编辑2:模型摘要
Epoch 1/1200
248/248 [==============================] - 2727s 11s/step - loss: 2.3481 - acc: 0.3818 - top3_acc: 0.5751 - recall: 0.2228 - precision: 0.6195 - f1: 0.3239 - val_loss: 0.9020 - val_acc: 0.8085 - val_top3_acc: 0.8956 - val_recall: 0.5677 - val_precision: 0.9793 - val_f1: 0.7179
Epoch 2/1200
248/248 [==============================] - 2712s 11s/step - loss: 1.0319 - acc: 0.7203 - top3_acc: 0.8615 - recall: 0.5489 - precision: 0.9245 - f1: 0.6865 - val_loss: 0.5547 - val_acc: 0.8708 - val_top3_acc: 0.9371 - val_recall: 0.7491 - val_precision: 0.9661 - val_f1: 0.8435
Epoch 3/1200
248/248 [==============================] - 4426s 18s/step - loss: 0.7094 - acc: 0.8093 - top3_acc: 0.9178 - recall: 0.6830 - precision: 0.9446 - f1: 0.7920 - val_loss: 0.4399 - val_acc: 0.8881 - val_top3_acc: 0.9567 - val_recall: 0.8140 - val_precision: 0.9606 - val_f1: 0.8808
Epoch 4/1200
18/248 [=>............................] - ETA: 3:14:16 - loss: 0.6452 - acc: 0.8338 - top3_acc: 0.9223 - recall: 0.7257 - precision: 0.9536 - f1: 0.8240
答案 0 :(得分:3)
症状:
由于泄漏,这似乎是内存问题。首先,对于具有完整数据的小批量BUT,您可以在恒定的纪元时间内运行模型,纪元时间逐渐增加(时间/步长也增加!)。我假设随着内存不足,由于资源有限,这会导致时间增加。通过大量的网络搜索,似乎其他在喀拉斯语中出现内存泄漏的人也有类似的“症状”,时间间隔很短。。
例如,选中此link-
帖子标题-“训练Keras LSTM模型以对图像序列进行二进制分类时,内存不足”
Using TensorFlow backend.
Epoch 1/60
1/1 [==============================] - 16s 16s/step - loss: 0.7258 - acc: 0.5400 - val_loss: 0.7119 - val_acc: 0.6200
Epoch 2/60
1/1 [==============================] - 18s 18s/step - loss: 0.7301 - acc: 0.4800 - val_loss: 0.7445 - val_acc: 0.4000
Epoch 3/60
1/1 [==============================] - 21s 21s/step - loss: 0.7312 - acc: 0.4200 - val_loss: 0.7411 - val_acc: 0.4200
(...training continues...)
注意到纪元时间逐渐增加吗?
诊断:
检查内存使用情况(不使用tensorboard)的一种方法是使用回调。这是我制作的一个伪代码,可以帮助您在每个时期使用回调获取内存使用情况。
import numpy as np
import tensorflow.keras as keras
import resource
class MemoryCallback(keras.callbacks.Callback):
def on_epoch_end(self, epoch, log={}):
print(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
def build_model(shape):
f_input = keras.layers.Input(shape=(shape[1],)) # (100,)
d1 = keras.layers.Dense(50, activation='tanh')(f_input)
d1 = keras.layers.Dense(50, activation='tanh')(d1)
softmax = keras.layers.Dense(10, activation='softmax')(d1)
return keras.Model(f_input, softmax)
data = np.random.random((1000, 100))
model = build_model(data.shape)
model.compile(loss='mse', optimizer='SGD')
model.fit(x=data, y=np.random.random((1000,)), verbose=0, epochs=10, callbacks=[MemoryCallback()])
312844288
312897536
312909824
312918016
312918016
312926208
312930304
312934400
312938496
312950784
确保在此处设置verbose=0
。确保重新启动内核/ python IDE,然后运行此程序,以便在检查之前清除内存。我假设您应该看到这个数字逐渐增加。
如果您使用的是Mac或Linux,您还可以在模型运行时使用HTOP查看内存使用情况。您应该看到最大内存上限。您可以在Mac上使用brew install
或在Linux上使用sudo apt-get
安装HTOP。
解决方案:
this stackoverflow post中提出了解决此问题的方法,该方法有助于限制tf使用的内存。
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.9 # fraction of memory
config.gpu_options.visible_device_list = "0"
set_session(tf.Session(config=config))