Keras + Tensorflow和Python中的多处理
keras
neural-network
python
tensorflow
4
0

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

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

我目前正在尝试从文档中使用天真的方法来保存/加载模型: https : //keras.io/getting-started/faq/#how-can-i-save-a-keras-model
所以基本上:

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

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

到处搜寻我发现这个可能相关的答案表明Keras只能在一个过程中使用与theano一起使用多处理程序,但是不确定这是否是正确的(似乎找不到很多)。

有没有办法实现我的目标?高度赞赏的描述或简短的示例将不胜感激。

注意:我已经尝试过将图形传递给流程的方法,但是失败了,因为看来tensorflow图是不可选的(相关的SO帖子在这里: Tensorflow:将会话传递给python multiprocess )。如果确实有一种方法可以将tensorflow图形/模型传递给子进程,那么我也对此持开放态度。

谢谢!

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

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

  1. 不要将KERAS加载到您的主要环境中 。如果要加载Keras / Theano / TensorFlow,请仅在功能环境中加载。例如要这样做:

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

    但请执行以下操作:

     def training_function(...): import keras ... 
  2. 在单独的过程中运行与每个模型相关的工作:我通常会创建正在完成工作的工作人员(例如培训,调整,评分),然后在单独的过程中运行他们。这样做的好处是,在您的进程完成后,该进程使用的全部内存都被完全释放 。这可以帮助您解决许多内存问题,这些问题通常是在使用多处理甚至在一个进程中运行多个模型时遇到的。所以这看起来像这样:

     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模型。希望此示例可以为您提供帮助。 https://github.com/yuanyuanli85/Keras-Multiple-Process-Prediction

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号