SLURMがインストールされたHPCクラスタがあります。自分でノードとコアを適切に割り当てることができます。私は割り当てられているすべてのコアを彼らがいるノードに関係なく使用することができるようにしたいと思います。このスレッドで見たように、multiprocessing
でこれを達成することはできません。割り当て済みのすべてのノードをHPCクラスタ上でPythonで使用する方法
私のスクリプトは、この(単純化バージョン)のようになります。
def func(input_data):
#lots of computing
return data
parallel_pool = multiprocessing.Pool(processes=300)
returned_data_list = []
for i in parallel_pool.imap_unordered(func, lots_of_input_data)
returned_data_list.append(i)
# Do additional computing with the returned_data
....
このスクリプトは完全に正常に動作SLURMが私のために3つのノードを割り当てた場合でも同様に、しかし、私はマルチプロセッシングを述べたように、私にとっては良いツールではありませんマルチプロセッシングでは1つしか使用できません。私の知る限り、これはマルチプロセッシングの限界です。
私はSLURMのsrun
プロトコルを使うことができましたが、同じスクリプトをN回実行するので、並列処理の出力で追加の計算が必要になります。私はもちろん、出力をどこかに格納して戻すこともできますが、もっと洗練されたソリューションが必要です。
上記のスレッドには、jug
のような提案がありますが、私はそれを読んでいたので、自分で解決策を見つけました。
py4mpi
は私の解決策ですか?そのチュートリアルは非常に面倒です、私はそこに私の問題のための特定の解決策を見つけることはありません。 (mpiと並列に関数を実行し、スクリプトを続行する)。
私はsubprocess
コールを試しましたが、multiprocess
コールと同じ方法で動作するように見えるので、それらは1つのノードでのみ実行されます。私はこれを確認していませんので、これは私の試行錯誤によるものです。
どうすればこの問題を解決できますか?現在、300以上のコアを使用することができますが、1つのノードには32しかないので、ソリューションを見つけることができれば、プロジェクトを約10倍高速で実行できます。
おかげ
ノード間の通信は通常mpiですが、マルチプロセッシングのようなAPIでラップするライブラリはわかりません –