gpt4 book ai didi

multithreading - TensorFlow/Keras 多线程模型拟合

转载 作者:行者123 更新时间:2023-12-03 11:28:42 28 4
gpt4 key购买 nike

我正在尝试训练多个 keras使用多个线程(和 tensorflow 后端)具有不同参数值的模型。我已经看到了在多个线程中使用相同模型的一些示例,但在这种特殊情况下,我遇到了有关冲突图等的各种错误。这是我希望能够执行的一个简单示例:

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

产生的错误是 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). .我还尝试在线程中初始化模型,这会导致类似的失败。

关于解决此问题的最佳方法有什么想法吗?我完全不依赖于这个确切的结构,但我更喜欢能够使用多个线程而不是进程,因此所有模型都在相同的 GPU 内存分配中进行训练。

最佳答案

Tensorflow Graph 不是线程安全的(请参阅 https://www.tensorflow.org/api_docs/python/tf/Graph ),并且当您创建新的 Tensorflow session 时,它默认使用默认图。

您可以通过在并行化函数中使用新图形创建新 session 并在那里构建 keras 模型来解决此问题。

下面是一些在每个可用 GPU 上并行创建和拟合模型的代码:

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)

关于multithreading - TensorFlow/Keras 多线程模型拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42322698/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com