私はバックエンドとして Tensorflow と Keras を使用しています。
メインプロセスでモデルを保存し、model.predict
別のプロセス内でロード/実行 (つまり、呼び出し) しようとしています。
私は現在、モデルを保存/読み込むためにドキュメントの単純なアプローチを試しています:https://keras.io/getting-started/faq/#keras モデルを保存するにはどうすればよいですか?。
だから基本的に:
model.save()
メインプロセス中model = load_model()
子プロセス内model.predict()
子プロセス内
ただし、load_model
通話はそのまま切断されます。
検索してみると、Keras は 1 つのプロセスでのみ利用できることを示唆する、関連性のある回答が見つかりました。theano でマルチプロセスを使用するしかし、これが本当かどうかはわかりません(これについてはあまり情報が見つからないようです)。
私の目標を達成する方法はありますか? 概要的な説明または短い例をいただければ幸いです。
注: プロセスにグラフを渡すというアプローチを試みましたが、Tensorflow グラフは選択できないようで失敗しました (関連する SO の投稿はこちら:Tensorflow: Python マルチプロセスにセッションを渡す)。Tensorflow グラフ/モデルを子プロセスに渡す方法が実際にある場合は、それも検討します。
ありがとう!
ベストアンサー1
私の経験から言うと、問題は 1 つのプロセスにロードし、メイン環境にロードされたKeras
ときに新しいプロセスを生成することにあります。ただし、一部のアプリケーション (たとえば、複数のモデルをトレーニングするなど) では、これらすべてを 1 つのプロセスにまとめる方がはるかに優れています。そのため、私がお勧めするのは、次の (少し面倒ですが、私にとってはうまく機能する) アプローチです。keras
Keras
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()
別のアプローチは、異なるモデルアクションに対して異なるスクリプトを準備するだけです。ただし、特にモデルがメモリを消費している場合は、メモリ エラーが発生する可能性があります。注記このため、実行は厳密に順次行う方がよいでしょう。