web-dev-qa-db-ja.com

スパイダー内のウィンドウ10を使用するKeras fit_generator()のマルチプロセッシングとワーカーに関する混乱

Fit_generator()(ドキュメント: https://keras.io/models/sequential/#fit_generator )のドキュメントでは、パラメータuse_multiprocessingがブール値を受け入れ、Trueに設定するとプロセスベースが許可されることを示していますスレッディング。

また、パラメーターworkerは、プロセスベースのスレッドを使用する場合に起動するプロセスの数を指定する整数であるとも述べています。どうやらデフォルトは1(単一プロセスベースのスレッド)で、0に設定されていると、メインスレッドでジェネレータを実行します。

これが意味することは、use_multiprocessing = Trueとworker> 0(例として6を使用しましょう)の場合、ジェネレーターを独立して実行する6つのプロセスを起動するということです。しかし、これをテストするとき、私は何かを誤解しているに違いないと思います(以下を参照)。

私の混乱は、use_multiprocessingをFalseに設定し、workers = 1の場合、タスクマネージャーで、12の仮想コアすべてがある程度均等に使用されており、モデルのトレーニング中に約50%のCPU使用率になっていることがわかります。 (参考までに、仮想化をサポートする6コアのi7-8750H CPUと、BIOSで仮想化を有効にしています)。ワーカーの数を増やすと、CPU使用率が100%になり、トレーニングがはるかに速くなります。ワーカーの数を0に減らしてメインスレッドで実行すると、すべての仮想コアがまだ使用されているように見えますが、やや不均一に見え、CPU使用率は約36%です。

残念ながら、multiprocessing = Trueを設定すると、brokenpipeエラーが発生します。私はまだこれを修正していませんが、ここで修正しようとしていることをよりよく理解したいと思います。

誰かがuse_multiprocessing = Trueとuse_multiprocessing = Falseのトレーニングの違いを説明できたら、そしてワーカーが= 0、1、および> 1の場合は非常に感謝します。問題がある場合は、IPythonコンソールを使用したSpyderでpython 3.6)を使用して、kerasのバックエンドとしてtensorflow(gpuバージョン)を使用しています。

私の疑いは、use_multiprocessingがTrueのときにマルチプロセッシングを実際に有効にしているのに対し、use_multiprocessing = Falseのときにworker> 1はスレッドの数を設定していますが、それは単なる推測です。

8
chemdatafarmer

私が知っている唯一のことは、use_multiprocessing=Falseおよびworkers > 1、多くの並列データロードスレッドがあります(これらの名前、スレッド、プロセスなどはあまり得意ではありません)。ただし、キューにデータをロードする5つの並列フロントがあります(したがって、データのロードは高速ですが、モデルの速度には影響しません。これは、データのロードに時間がかかりすぎる場合に適しています)。

私が試したときはいつでもuse_multiprocessing=True、すべてがフリーズしました。

6
Daniel Möller