Keras+;Python中的Tensorflow和多处理
我使用Keras和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只能在一个过程中使用:但我不确定这是否属实(在这方面似乎
model.predict
)
我目前正在尝试文档中的简单方法来保存/加载模型:。所以基本上:
model.save()
model=load\u model()
在子进程中model.predict()
load\u model
调用
通过四处搜索,我发现了一个可能相关的答案,这表明Keras只能在一个过程中使用:但我不确定这是否属实(在这方面似乎找不到太多)
有没有办法实现我的目标?一个高层次的描述或简短的例子是非常感谢
注意:我尝试过向进程传递一个图的方法,但失败了,因为tensorflow图似乎不可拾取(这里有相关的帖子:)。如果确实有办法将tensorflow图/模型传递给子进程,那么我也愿意这样做
谢谢 根据我的经验-问题在于将
Keras
加载到一个进程,然后在Keras
加载到主环境后生成一个新进程。但对于某些应用程序(例如,训练混合的Keras
模型),最好将所有这些都放在一个过程中。因此,我建议采用以下方法(有点麻烦,但适合我):
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
。此代码等待子进程完成后再继续。转到此处了解有关多处理的更多信息: