Estoy trabajando en un modelo de aprendizaje por refuerzo implementado con Keras y Tensorflow. Tengo que hacer llamadas frecuentes a model.predict() en entradas individuales.
Mientras probaba la inferencia en un modelo preentrenado simple, noté que usar model.predict de Keras es MUCHO más lento que usar Numpy en pesos almacenados. ¿Por qué es tan lento y cómo puedo acelerarlo? Usar Numpy puro no es viable para modelos complejos.
import timeit import numpy as np from tensorflow.python.keras.models import Sequential from tensorflow.python.keras.layers import Dense w = np.array([[-1., 1., 0., 0.], [0., 0., -1., 1.]]).T b = np.array([ 15., -15., -21., 21.]) model = Sequential() model.add(Dense(4, input_dim=2, activation='linear')) model.layers[0].set_weights([wT, b]) model.compile(loss='mse', optimizer='adam') state = np.array([-23.5, 17.8]) def predict_very_slow(): return model.predict(state[np.newaxis])[0] def predict_slow(): ws = model.layers[0].get_weights() return np.matmul(ws[0].T, state) + ws[1] def predict_fast(): return np.matmul(w, state) + b print( timeit.timeit(predict_very_slow, number=10000), timeit.timeit(predict_slow, number=10000), timeit.timeit(predict_fast, number=10000) ) # 5.168972805004538 1.6963867129435828 0.021918574168087623 # 5.461319456664639 1.5491559107269515 0.021502970783442876Un poco tarde, pero tal vez útil para alguien:
Reemplace model.predict(X) con model.predict(X, batch_size=len(X))
Deberias hacer eso.
¿Está ejecutando su modelo de Keras (con el backend de TensorFlow) en un bucle? Si es así, Keras tiene un problema de pérdida de memoria identificado aquí: ENLACE
En este caso tienes que importar lo siguiente:
import keras.backend.tensorflow_backend import tensorflow as tf from keras.backend import clear_sessionFinalmente, debe poner lo siguiente al final de cada iteración de un ciclo después de que haya terminado de hacer sus cálculos:
clear_session() if keras.backend.tensorflow_backend._SESSION: tf.reset_default_graph() keras.backend.tensorflow_backend._SESSION.close() keras.backend.tensorflow_backend._SESSION = NoneEsto debería ayudarlo a liberar memoria al final de cada ciclo y, eventualmente, acelerar el proceso. Espero que esto ayude.
El problema de pérdida de memoria parece persistir en Keras. Las siguientes líneas de código mencionadas en ese problema me ayudaron:
import ... as K import gc model = .... del model K.clear_session() gc.collect()