CPU使用率とメモリに関するscikit-learn n_jobsパラメータ


11

scikit-learnのほとんどの推定器には、/を使用して並列ジョブを作成するためのn_jobsパラメーターがあります。これを設定すると、Pythonプロセスが1つだけ作成され、コアが最大になるため、CPU使用率が2500%を上回っていることに気付きました。これは、正の整数> 1に設定するのとはかなり異なります。これにより、使用率が100%を超える複数のPythonプロセスが作成されます。fitpredictjoblib-1

これを設定すると、マルチCPU LinuxサーバーのCPUとコアの使用にどのように影響しますか?(たとえば、n_jobs=88つのCPUが完全にロックされている場合、またはCPUが他のタスク/プロセス用にいくつかのコアをまだ予約しているかどうか)

さらに、大規模なデータセットをMemoryError設定n_jobs=-1するときに、たまに表示されます。ただし、メモリ使用量は通常、単一のPythonプロセスで約30〜40%です。の値に応じて、データとメモリはどのように管理/コピーされn_jobsますか?


1
また、これを-2に設定すると、使用可能なコアの1つを除くすべてが使用され、少なくともある程度は動作します。特にデータセットが大きい場合は特に、メモリの問題が多くのコアで問題になり始めます
Ken Syme 2018

回答:


4

の値が-1、利用可能になったときに利用可能なすべてのリソースを消費することを想像できます。話している関数によっては、ジョブごとにデータがコピーされるようです。データセットが十分に大きい場合、メモリの問題が発生する可能性があります。以下は、GridSearchCVのdocstringからの情報のスニペットです。

If `n_jobs` was set to a value higher than one, the data is copied for each
point in the grid (and not `n_jobs` times). This is done for efficiency
reasons if individual jobs take very little time, but may raise errors if
the dataset is large and not enough memory is available.  A workaround in
this case is to set `pre_dispatch`. Then, the memory is copied only
`pre_dispatch` many times. A reasonable value for `pre_dispatch` is `2 *
n_jobs`.

したがってpre_dispatch、メモリ使用量に上限を設定するために使用するのは良い考えかもしれません。

それ以外の場合、なぜそれをに設定するの-1ですか?タスクをマルチスレッド化できる場合は、マシンの物理コア数に設定するか、その数の2倍に設定する必要があります。

編集:

n_jobs=-1実際、設定はすべての物理コアを選択し、その使用を最大化するようです。見ていStackOverflowの上のこの回答のコメントを

設定していない場合pre_dispatchは、もちろんたくさんコピーしようとします。これがメモリ不足の理由です。4つのコアがある場合、デフォルトで、作成されたデータセットの8つのコピーが作成されます(引用で前述したとおり)。

これは別のスレッドで、パフォーマンスの側面を詳しく見ています


1
したがって、pre_dispatchを使用してデータのコピーを制限していますが、なぜ-1に設定するとメモリの問題が発生するのでしょうか。

1
@sweetyBaby-追加されたリンクをご覧ください。設定でn_jobs = -1はメモリは考慮されず、CPUのコアの数のみが考慮されます。これはもちろんメモリの問題につながる可能性があります。
n1k31t4 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.