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.