首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TensorFlow/Keras多线程模型拟合

TensorFlow/Keras多线程模型拟合
EN

Stack Overflow用户
提问于 2017-02-19 09:35:18
回答 1查看 15.8K关注 0票数 27

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

代码语言:javascript
复制
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内存分配中训练的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-23 23:24:37

Tensorflow图不是线程安全的(参见https://www.tensorflow.org/api_docs/python/tf/Graph),当您创建一个新的Tensorflow会话时,它默认使用默认的图。

你可以通过在你的并行化函数中创建一个带有新图的新会话,并在那里构建你的keras模型来解决这个问题。

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

代码语言:javascript
复制
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)
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42322698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档