【问题标题】:Multithreading in tensorflow/keras张量流/keras 中的多线程
【发布时间】:2017-09-01 10:36:22
【问题描述】:

我想在一个 python 应用程序中使用 model.fit() 并行训练一些不同的模型。使用的模型没有必要的共同点,它们是在不同的时间在一个应用程序中启动的。

首先,我在单独的线程中启动一个没有问题的 model.fit(),然后是主线程。如果我现在想启动第二个 model.fit(),我会收到以下错误消息:

Exception in thread Thread-1:
tensorflow.python.framework.errors_impl.InvalidArgumentError: Node 'hidden_1/BiasAdd': Unknown input node 'hidden_1/MatMul'

它们都是通过相同的代码行从一个方法开始的:

start_learn(self:)
   tf_session = K.get_session()  # this creates a new session since one doesn't exist already.
   tf_graph = tf.get_default_graph()

   keras_learn_thread.Learn(learning_data, model, self.env_cont, tf_session, tf_graph)
   learning_results.start()

调用的类/方法如下所示:

def run(self):
    tf_session = self.tf_session  # take that from __init__()
    tf_graph = self.tf_graph  # take that from __init__()

    with tf_session.as_default():
        with tf_graph.as_default():
            self.learn(self.learning_data, self.model, self.env_cont)
            # now my learn method where model.fit() is located is being started

我想我必须以某种方式为每个线程分配一个新的 tf_session 和一个新的 tf_graph。但我不太确定。我会为每一个简短的想法感到高兴,因为我现在坐这个太久了。

谢谢

【问题讨论】:

    标签: python multithreading tensorflow keras


    【解决方案1】:

    我不知道你是否解决了你的问题,但这看起来像是另一个问题I recently answered

    • 需要先在主线程中完成图创建 开始其他人。
    • 在 keras 的情况下,图在第一次调用 fit 或 predict 函数时被初始化。您可以通过调用模型的一些内部函数来强制创建图形:

      model._make_predict_function()
      model._make_test_function()
      model._make_train_function()
      

      如果这不起作用,请尝试通过调用虚拟数据来预热模型。

    • 完成图创建后,在主图上调用 finalize(),以便它可以安全地与不同线程共享(这将使其成为只读)。

    • 完成图表还可以帮助您找到您的图表被无意修改的其他地方。

    希望对你有所帮助。

    【讨论】:

      【解决方案2】:

      张量流 2.x

      假设你有更新的 tensorflow(问题是旧的),我曾经这样定义会话。这是为了防止一个应用程序占用整个 gpu 内存:P

      import tensorflow as tf
      config = tf.compat.v1.ConfigProto()
      config.gpu_options.allow_growth = False  # can be true, to increase memory allocation
      config.gpu_options.per_process_gpu_memory_fraction = 0.2  # fraction of memory used
      sess = tf.compat.v1.Session(config=config) 
      

      但如果你想并行执行,你应该在某个时候close session。 为此,您可以选择更适合您的风格。上下文管理器似乎更合理

      正常方式:

      sess = tf.compat.v1.Session(config=config) 
      # do stuff here
      sess.close()
      

      或使用上下文管理器:

      with tf.compat.v1.Session(config=config):
          # do stuff here
      

      Keras

      这与一个模型兼容,我认为它可以正确地与多会话一起使用

      Session documentaion

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        • 1970-01-01
        相关资源
        最近更新 更多