小编典典

Keras + Tensorflow和Python中的多处理

python

我正在使用Keras与Tensorflow作为后端。

我正在尝试在主流程中保存模型,然后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电话。

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

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

谢谢!


阅读 246

收藏
2020-12-20

共1个答案

小编典典

根据我的经验,问题在于加载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()

不同的方法只是为不同的模型动作准备不同的脚本。但这可能会导致内存错误,尤其是在模型消耗内存的情况下。 请注意
,由于这个原因,最好使您的执行严格按顺序执行。

2020-12-20