Keras+;Python中的Tensorflow和多处理

Keras+;Python中的Tensorflow和多处理,python,tensorflow,neural-network,keras,python-multiprocessing,Python,Tensorflow,Neural Network,Keras,Python Multiprocessing,我使用Keras和Tensorflow作为后端 我试图在主进程中保存一个模型,然后在另一个进程中加载/运行(即调用model.predict) 我目前正在尝试文档中的简单方法来保存/加载模型:。 所以基本上: 主进程中的model.save() model=load\u model()在子进程中 子进程中的model.predict() 但是,它只是挂起load\u model调用 通过四处搜索,我发现了一个可能相关的答案,这表明Keras只能在一个过程中使用:但我不确定这是否属实(在这方面似乎

我使用Keras和Tensorflow作为后端

我试图在主进程中保存一个模型,然后在另一个进程中加载/运行(即调用
model.predict

我目前正在尝试文档中的简单方法来保存/加载模型:。
所以基本上:

  • 主进程中的
    model.save()
  • model=load\u model()
    在子进程中
  • 子进程中的
    model.predict()
  • 但是,它只是挂起
    load\u model
    调用

    通过四处搜索,我发现了一个可能相关的答案,这表明Keras只能在一个过程中使用:但我不确定这是否属实(在这方面似乎找不到太多)

    有没有办法实现我的目标?一个高层次的描述或简短的例子是非常感谢

    注意:我尝试过向进程传递一个图的方法,但失败了,因为tensorflow图似乎不可拾取(这里有相关的帖子:)。如果确实有办法将tensorflow图/模型传递给子进程,那么我也愿意这样做


    谢谢

    根据我的经验-问题在于将
    Keras
    加载到一个进程,然后在
    Keras
    加载到主环境后生成一个新进程。但对于某些应用程序(例如,训练混合的
    Keras
    模型),最好将所有这些都放在一个过程中。因此,我建议采用以下方法(有点麻烦,但适合我):

  • 不要将KERA加载到主环境中。如果要加载Keras/Theano/TensorFlow,请仅在函数环境中进行。例如,不要这样做:

    import keras
    
    def training_function(...):
        ...
    
    但要做到以下几点:

    def training_function(...):
        import keras
        ...
    
  • 在一个单独的流程中运行与每个模型相关的工作:我通常会创建负责工作的员工(如培训、调整、评分),并在单独的流程中运行他们。当您的进程完成时,该进程使用的整个内存被完全释放,这是一件好事。这有助于解决在一个进程中使用多进程甚至运行多个模型时经常遇到的大量内存问题。这看起来像这样:

    def _training_worker(train_params):
        import keras
        model = obtain_model(train_params)
        model.fit(train_params)
        send_message_to_main_process(...)
    
    def train_new_model(train_params):
        training_process = multiprocessing.Process(target=_training_worker, args = train_params)
        training_process.start()
        get_message_from_training_process(...)
        training_process.join()
    

  • 不同的方法只是为不同的模型操作准备不同的脚本。但这可能会导致内存错误,尤其是当您的模型占用内存时注意由于这个原因,最好严格按顺序执行。

    我创建了一个简单的示例来演示如何在多个进程中使用多个GPU运行Keras模型。希望这个样品能帮助你。

    我创建了一个修饰符来修复我的代码

    from multiprocessing import Pipe, Process
    
    def child_process(func):
        """Makes the function run as a separate process."""
        def wrapper(*args, **kwargs):
            def worker(conn, func, args, kwargs):
                conn.send(func(*args, **kwargs))
                conn.close()
            parent_conn, child_conn = Pipe()
            p = Process(target=worker, args=(child_conn, func, args, kwargs))
            p.start()
            ret = parent_conn.recv()
            p.join()
            return ret
    return wrapper
    
    @child_process
    def keras_stuff():
        """ Keras stuff here"""
    

    马辛,非常感谢你的回答。旁白:上面的问题源于我希望跨多个GPU并行化一个模型的预测。我刚才问了一个关于这件事的问题,运气不好。你介意试一试吗?先谢谢你。如果需要更多细节,请告诉我。我会看一看。这也是我感兴趣的事情——但我还没有实现这样的解决方案。我实现了一个类似于deamon的流程,它接收一个图像,由keras deep CNN混合处理,这就是我的示例的来源。创建子流程并没有帮助我解决这个问题。当我中断keras模型拟合时,我得到了很多悬挂过程。在调查期间,我发现多处理池并没有使用try-except和pool-termination包装。我认为这是keras的问题,但我不确定这里面会发生什么。第一件事是在python中创建一个decorator,这让我可以创建具有类似行为的新函数。对于此装饰程序,该行为作为子进程运行。如果您以前没有制作过decorator,请在此处阅读更多内容:除此之外,worker函数只是通过使用python多处理来执行修饰函数
    func
    。此代码等待子进程完成后再继续。转到此处了解有关多处理的更多信息: