Keras + Tensorflow 和 Python 中的多处理
Posted
技术标签:
【中文标题】Keras + Tensorflow 和 Python 中的多处理【英文标题】:Keras + Tensorflow and Multiprocessing in Python 【发布时间】:2017-07-19 04:23:40 【问题描述】:我使用 Keras 和 Tensorflow 作为后端。
我试图在我的主进程中保存一个模型,然后在另一个进程中加载/运行(即调用model.predict
)。
我目前只是尝试使用文档中的简单方法来保存/加载模型:https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model。 所以基本上:
model.save()
在主进程中
model = load_model()
在子进程中
model.predict()
在子进程中
但是,它只是挂在load_model
调用上。
四处搜索我发现了这个可能相关的答案,表明 Keras 只能在一个进程中使用:using multiprocessing with theano 但我不确定这是否属实(似乎找不到太多关于此的内容)。
有没有办法实现我的目标?非常感谢高级描述或简短示例。
注意:我尝试了将图表传递给流程的方法,但失败了,因为似乎 tensorflow 图表不可挑选(此处相关的 SO 帖子:Tensorflow: Passing a session to a python multiprocess)。如果确实有办法将张量流图/模型传递给子进程,那么我也对此持开放态度。
谢谢!
【问题讨论】:
【参考方案1】:根据我的经验 - 问题在于将 Keras
加载到一个进程,然后在 keras
加载到您的主环境时生成一个新进程。但是对于某些应用程序(例如训练Keras
models 的混合),最好将所有这些东西放在一个过程中。所以我的建议是以下(有点麻烦 - 但对我有用)方法:
不要将 KERAS 加载到您的主要环境中。如果您想加载 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()
不同的方法只是为不同的模型动作准备不同的脚本。但这可能会导致内存错误,尤其是当您的模型消耗内存时。 注意,由于这个原因,最好严格按顺序执行。
【讨论】:
Marcin,非常感谢您的回答。附带问题:上面的 SO 问题源于我希望跨多个 GPU 并行化一个模型的预测。不久前我问了一个关于这个的问题,但没有运气:***.com/questions/42409884/…。你介意试一试吗?先感谢您。如果需要更多细节,请告诉我。 我去看看。这也是我感兴趣的事情——但我还没有实施这样的解决方案。我实现了一个类似守护进程的进程,它接收要由混合 keras 深度 CNN 处理的图像,这就是我的示例的来源。 创建子进程并没有帮助我解决这个问题。当我中断 keras 模型拟合时,我得到了很多挂起的过程。在调查过程中,我发现多处理池没有用 try-except 和池终止包装。 github.com/keras-team/keras/blob/master/keras/utils/…我认为这是 keras 的问题,但我不确定importlib.reload(keras)
在函数里面,但是没用【参考方案2】:
我创建了一个简单的示例来展示如何在具有多个 GPU 的多个进程中运行 Keras 模型。希望这个样本可以帮助你。 https://github.com/yuanyuanli85/Keras-Multiple-Process-Prediction
【讨论】:
【参考方案3】:我创建了一个装饰器来修复我的代码。
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"""
【讨论】:
这里面有很多事情要做。首先是在 python 中创建一个装饰器,这让我可以创建具有类似行为的新函数。对于这个装饰器,行为作为子进程运行。如果您以前没有制作过装饰器,请在此处阅读更多信息:realpython.com/primer-on-python-decorators 除了工作函数只是通过使用 python 多处理来执行装饰函数func
。此代码在继续之前等待子进程完成。去这里了解更多关于multiprocessing
:docs.python.org/3/library/multiprocessing.html以上是关于Keras + Tensorflow 和 Python 中的多处理的主要内容,如果未能解决你的问题,请参考以下文章