web-dev-qa-db-ja.com

daskワーカーの数を設定する際のベストプラクティス

クラスターにワーカーを設定するときにdaskとdask.distributedで使用される異なる用語に少し混乱しています。

私が出くわした用語は、スレッド、プロセス、プロセッサー、ノード、ワーカー、スケジューラーです。

私の質問は、それぞれの数をどのように設定するか、そしてこれらのいずれかに厳密な関係または推奨される関係があるかどうかです。例えば:

  • ノードごとに1つのワーカー、ノード上のn個のコアに対してn個のプロセス
  • スレッドとプロセスは同じ概念ですか? dask-mpiでは、nthreadを設定する必要がありますが、クライアントではプロセスとして表示されます

他に何か提案はありますか?

15
kristofarkas

「ノード」とは、通常、物理マシンまたは仮想マシンを意味します。そのノードは、一度に複数のプログラムまたはプロセスを実行できます(私のコンピューターがWebブラウザーとテキストエディターを同時に実行できるのと同じように)。各プロセスは、それ自体の中で多くのスレッドと並列化できます。プロセスには分離されたメモリ環境があります。つまり、プロセス内でのデータの共有は無料ですが、プロセス間でのデータの共有にはコストがかかります。

通常、ノードをいくつかのプロセスに分割し、各プロセスに複数のスレッドがある場合、より大きなノード(36コアなど)で最適に機能します。プロセスの数にスレッドの数を掛けたものをコアの数と等しくする必要があります。したがって、たとえば、36コアマシンに対して次のようなことを行うことができます。

  • それぞれ9つのスレッドを持つ4つのプロセス
  • それぞれ3つのスレッドを持つ12のプロセス
  • 36スレッドの1つのプロセス

通常、ワークロードに基づいてこれらの選択肢を決定します。ここでの違いは、Pythonのグローバルインタープリターロックによるものです。これは、特定の種類のデータの並列処理を制限します。 PythonでNumpy、Pandas、Scikit-Learn、またはその他の数値プログラミングライブラリを主に使用している場合は、GILについて心配する必要はなく、おそらくいくつかのプロセスを好むでしょう。それぞれに多くのスレッドがあります。これは、データがすべて同じプロセスに存在するため、コア間を自由に移動できるため役立ちます。ただし、ほとんどの場合、純粋なPythonプログラミング、テキストデータ、辞書/リスト/セット、およびほとんどの計算をタイトなPython forループで実行する場合は、スレッド数が少ない多くのプロセスを使用することをお勧めします。これにより、追加の通信コストが発生します。ただし、GILをバイパスできます。

つまり、ほとんどがnumpy/pandasスタイルのデータを使用している場合は、プロセスで少なくとも8つのスレッドを取得するようにしてください。それ以外の場合は、プロセス内の2つのスレッドのみを使用する可能性があります。

13
MRocklin