2016-05-14 5 views
2

私はWindows HPCクラスタ上でPythonスクリプトを実行しています。スクリプト内の関数は、multiprocessingパッケージのstarmapを使用して、特定の計算集約型プロセスを並列化します。HPCクラスタでのPythonマルチプロセッシングの使用

私は、単一の非クラスタマシンでスクリプトを実行すると、予想されるスピードブーストが得られます。ノードにログインしてスクリプトをローカルで実行すると、予想される速度向上が得られます。ただし、ジョブマネージャがスクリプトを実行すると、multiprocessingからの速度向上が完全に緩和されるか、時には2倍遅くなることもあります。 starmap関数が呼び出されたときにメモリページングが発生していることがわかりました。これは、Pythonのmultiprocessingの性質、すなわち、別のPythonインタプリタが各コアに対して開始されるという事実と関係していると考えられます。

コンソールから1つのノードから正常に実行されたため、HPC_CREATECONSOLE=Trueでスクリプトを実行しようとしましたが、役に立たなくなりました。

multiprocessingを使用するPythonスクリプトを実行する際に使用する必要があるジョブマネージャ内の設定はありますか? multiprocessingはHPCクラスタには不適切ですか?

答えて

0

残念ながら私はコミュニティで回答を見つけることができませんでした。しかし、実験を通じて、私は問題をよりよく分離し、実行可能な解決策を見つけることができました。

この問題は、Pythonのmultiprocessing実装の性質から発生します。 Poolオブジェクト(つまり、並列処理のための処理コアを制御するマネージャクラス)が作成されると、各コアに対して新しいPython実行時間が開始されます。 multiprocessingパッケージが使用され、Poolオブジェクトがインスタンス化されたコード内には複数の場所があります。必要なすべての関数が必要に応じてPoolオブジェクトを作成し、終了して終了します。したがって、コード内で関数を3回呼び出すと、8つのPythonインスタンスがスピンアップしてから3回閉じます。単一のマシン上では、このオーバーヘッドは関数の計算負荷に比べて全く重要ではありませんでした...しかし、HPCではそれはばかげて高かったです。

Poolオブジェクトがプロセスの呼び出しの最初に作成され、必要に応じて各関数に渡されるようにコードを再設計しました。これは、プロセス全体の終了時に閉じられ、結合され、終了されます。

各ノードでPoolオブジェクトの作成に大部分の時間が費やされていました。これは改善でした。なぜなら、これは一度だけ作成されたからです!その結果、複数のノードがネットワーク経由で同じ場所でPythonに同時にアクセスしようとしていたという根本的な問題があることがわかりました(これはヘッドノードにのみインストールされていました)。私たちはPythonとアプリケーションをすべてのノードにインストールしましたが、問題は完全に修正されました。

この解決策は試行錯誤の結果でした...残念なことに、クラスタコンピューティングの知識はかなり低いです。私はより多くの洞察を得ることができるように批判されることを期待してこの答えを共有しています。あなたの時間をありがとう。

関連する問題