Estoy usando Keras con Tensorflow como backend.
Estoy tratando de guardar un modelo en mi proceso principal y luego cargar/ejecutar (es decir, llamar a model.predict ) dentro de otro proceso.
Actualmente solo estoy probando el enfoque ingenuo de los documentos para guardar/cargar el modelo: https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model .
Así que básicamente:
model.save() en el proceso principalmodel = load_model() en proceso hijomodel.predict() en proceso hijo Sin embargo, simplemente cuelga de la llamada load_model .
Buscando, descubrí esta respuesta potencialmente relacionada que sugiere que Keras solo se puede utilizar en un proceso: usar multiprocesamiento con theano, pero no estoy seguro de si esto es cierto (parece que no puedo encontrar mucho sobre esto).
¿Hay alguna manera de lograr mi objetivo? Se agradece mucho una descripción de alto nivel o un ejemplo breve.
Nota: Intenté enfoques en la línea de pasar un gráfico al proceso, pero fallé porque parece que los gráficos de tensorflow no son seleccionables (publicación SO relacionada para eso aquí: Tensorflow: Passing a session to a python multiprocess ). Si de hecho hay una manera de pasar el gráfico/modelo de tensorflow al proceso secundario, entonces también estoy abierto a eso.
¡Gracias!
Según mi experiencia, el problema radica en cargar Keras en un proceso y luego generar un nuevo proceso cuando keras se ha cargado en su entorno principal. Pero para algunas aplicaciones (como, por ejemplo, entrenar una mezcla de modelos de Keras ), simplemente es mejor tener todas estas cosas en un solo proceso. Entonces, lo que aconsejo es el siguiente enfoque (un poco engorroso, pero funciona para mí):
NO CARGUE KERAS A SU ENTORNO PRINCIPAL . Si desea cargar Keras / Theano / TensorFlow, hágalo solo en el entorno de funciones. Por ejemplo , no hagas esto:
import keras def training_function(...): ...pero haz lo siguiente:
def training_function(...): import keras ...Ejecute el trabajo conectado con cada modelo en un proceso separado: por lo general, creo trabajadores que realizan el trabajo (como, por ejemplo, capacitación, ajuste, calificación) y los ejecuto en procesos separados. Lo bueno de esto es que toda la memoria utilizada por este proceso se libera por completo cuando finaliza el proceso. Esto lo ayuda con muchos problemas de memoria que generalmente encuentra cuando usa multiprocesamiento o incluso ejecuta múltiples modelos en un solo proceso. Entonces esto se ve, por ejemplo, así:
def _training_worker(train_params): import keras model = obtain_model(train_params) model.fit(train_params) send_message_to_main_process(...) def train_new_model(train_params): training_process = multiprocessing.Process(target=_training_worker, args = train_params) training_process.start() get_message_from_training_process(...) training_process.join()Un enfoque diferente es simplemente preparar diferentes scripts para diferentes acciones de modelos. Pero esto puede causar errores de memoria, especialmente cuando sus modelos consumen memoria. TENGA EN CUENTA que por esta razón es mejor hacer su ejecución estrictamente secuencial.
Creé un ejemplo simple para mostrar cómo ejecutar el modelo Keras en múltiples procesos con múltiples gpus. Espero que esta muestra pueda ayudarte. https://github.com/yuanyuanli85/Keras-Multiple-Process-Predicción
Creé un decorador que arregló mi código.
from multiprocessing import Pipe, Process def child_process(func): """Makes the function run as a separate process.""" def wrapper(*args, **kwargs): def worker(conn, func, args, kwargs): conn.send(func(*args, **kwargs)) conn.close() parent_conn, child_conn = Pipe() p = Process(target=worker, args=(child_conn, func, args, kwargs)) p.start() ret = parent_conn.recv() p.join() return ret return wrapper @child_process def keras_stuff(): """ Keras stuff here"""