Python 中的 Keras Tensorflow 和多处理

新手上路,请多包涵

我正在使用带有 Tensorflow 的 Keras 作为后端。

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

我目前只是尝试使用文档中的天真方法来保存/加载模型: https ://keras.io/getting-started/faq/#how-can-i-save-a-keras-model。

所以基本上:

  1. model.save() 在主进程中
  2. model = load_model() 在子进程中
  3. model.predict() 在子进程中

但是,它只是挂在 load_model 调用上。

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

有没有办法实现我的目标?非常感谢高级描述或简短示例。

注意:我尝试过将图形传递给进程的方法,但失败了,因为它似乎无法选择张量流图形(相关的 SO 帖子: Tensorflow: Passing a session to a python multiprocess )。如果确实有办法将张量流图/模型传递给子进程,那么我也对此持开放态度。

谢谢!

原文由 John Cast 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 422
2 个回答

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

  1. 不要将 KERAS 加载到您的主要环境 中。如果你想加载 Keras / Theano / TensorFlow,只能在函数环境中进行。例如 要这样做:
    import keras

   def training_function(...):
       ...

但请执行以下操作:

    def training_function(...):
       import keras
       ...

  1. 在单独的进程中运行与每个模型相关的工作: 我通常创建工作人员来完成工作(例如培训、调整、评分),并且我在单独的进程中运行它们。当您的进程完成时,此进程使用的整个内存将完全 释放,这有什么好处。这可以帮助您解决在使用多处理甚至在一个进程中运行多个模型时通常会遇到的大量内存问题。所以这看起来像这样:
    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 Możejko 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题