簡體   English   中英

Python中的Keras + Tensorflow和Multiprocessing

[英]Keras + Tensorflow and Multiprocessing in Python

我正在使用帶有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只能在一個過程中使用與theano一起使用多處理但不確定這是否屬實(似乎在這方面似乎找不到多少)。

有沒有辦法實現我的目標? 非常感謝高級別描述或簡短示例。

注意:我嘗試了將圖形傳遞給流程的方法但是失敗了,因為似乎張流圖不可選(這里有相關的SO帖子: Tensorflow:將會話傳遞給python多進程 )。 如果確實有一種方法可以將張量流圖/模型傳遞給子進程,那么我也對此持開放態度。

謝謝!

根據我的經驗 - 問題在於將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() 

不同的方法就是為不同的模型操作准備不同的腳本。 但這可能會導致內存錯誤,尤其是當您的模型耗費內存時。 請注意 ,由於這個原因,最好使您的執行嚴格按順序執行。

我創建了一個簡單的例子來展示如何在具有多個gpus的多個進程中運行Keras模型。 希望這個樣本可以幫到你。 https://github.com/yuanyuanli85/Keras-Multiple-Process-Prediction

我創建了一個修復我的代碼的裝飾器。

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"""

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM