multithreading concurrency tensorflow keras python-multithreading

multithreading - Adaptación del modelo de rosca múltiple TensorFlow/Keras



concurrency python-multithreading (1)

Los gráficos de Tensorflow no son seguros (consulte https://www.tensorflow.org/api_docs/python/tf/Graph ) y cuando crea una nueva sesión de Tensorflow, utiliza de manera predeterminada el gráfico predeterminado.

Puedes evitar esto creando una nueva sesión con un nuevo gráfico en tu función paralelizada y construyendo tu modelo keras allí.

Aquí hay un código que crea y ajusta un modelo en cada gpu disponible en paralelo:

import concurrent.futures import numpy as np import keras.backend as K from keras.layers import Dense from keras.models import Sequential import tensorflow as tf from tensorflow.python.client import device_lib def get_available_gpus(): local_device_protos = device_lib.list_local_devices() return [x.name for x in local_device_protos if x.device_type == ''GPU''] xdata = np.random.randn(100, 8) ytrue = np.random.randint(0, 2, 100) def fit(gpu): with tf.Session(graph=tf.Graph()) as sess: K.set_session(sess) with tf.device(gpu): model = Sequential() model.add(Dense(12, input_dim=8, activation=''relu'')) model.add(Dense(8, activation=''relu'')) model.add(Dense(1, activation=''sigmoid'')) model.compile(loss=''binary_crossentropy'', optimizer=''adam'') model.fit(xdata, ytrue, verbose=0) return model.evaluate(xdata, ytrue, verbose=0) gpus = get_available_gpus() with concurrent.futures.ThreadPoolExecutor(len(gpus)) as executor: results = [x for x in executor.map(fit, gpus)] print(''results: '', results)

Estoy intentando entrenar múltiples modelos de keras con diferentes valores de parámetros usando múltiples hilos (y el backend de tensorflow ). He visto algunos ejemplos del uso del mismo modelo en varios hilos, pero en este caso particular, me encuentro con varios errores relacionados con gráficos en conflicto, etc. Aquí hay un ejemplo simple de lo que me gustaría hacer:

from concurrent.futures import ThreadPoolExecutor import numpy as np import tensorflow as tf from keras import backend as K from keras.layers import Dense from keras.models import Sequential sess = tf.Session() def example_model(size): model = Sequential() model.add(Dense(size, input_shape=(5,))) model.add(Dense(1)) model.compile(optimizer=''sgd'', loss=''mse'') return model if __name__ == ''__main__'': K.set_session(sess) X = np.random.random((10, 5)) y = np.random.random((10, 1)) models = [example_model(i) for i in range(5, 10)] e = ThreadPoolExecutor(4) res_list = [e.submit(model.fit, X, y) for model in models] for res in res_list: print(res.result())

El error resultante es ValueError: Tensor("Variable:0", shape=(5, 5), dtype=float32_ref) must be from the same graph as Tensor("Variable_2/read:0", shape=(), dtype=float32). . También intenté inicializar los modelos dentro de los hilos, lo que da una falla similar.

¿Alguna idea sobre la mejor manera de hacerlo? No estoy para nada apegado a esta estructura exacta, pero preferiría poder usar varios hilos en lugar de procesos, de modo que todos los modelos estén entrenados dentro de la misma asignación de memoria GPU.