随着时间的推移,训练会逐渐变慢

时间:2020-08-24 23:34:36

标签: tensorflow keras

这是我第一次遇到此问题。我使用这种模型已有一段时间,但数据较少。问题在于,在前三个时期中,训练耗时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

1 个答案:

答案 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。

enter image description here


解决方案:

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))