問題タブ [embarrassingly-parallel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Pythonマルチプロセッシングを使用した驚異的並列問題の解決
マルチプロセッシングを使用して、驚異的並列の問題にどのように取り組むのでしょうか。
驚異的並列問題は通常、次の3つの基本部分で構成されます。
- 入力データを読み取ります(ファイル、データベース、tcp接続などから)。
- 入力データに対して計算を実行します。各計算は他の計算から独立しています。
- 計算結果を(ファイル、データベース、tcp接続などに)書き込みます。
プログラムを2次元で並列化できます。
- 各計算は独立しているため、パート2は複数のコアで実行できます。処理の順序は関係ありません。
- 各パーツは独立して実行できます。パート1はデータを入力キューに配置し、パート2はデータを入力キューからプルして結果を出力キューに配置し、パート3は結果を出力キューからプルして書き出すことができます。
これは並行プログラミングの最も基本的なパターンのようですが、それを解決しようとするとまだ迷っています。そこで、マルチプロセッシングを使用してこれがどのように行われるかを示す標準的な例を書いてみましょう。
問題の例を次に示します。入力として整数の行を含むCSVファイルが与えられた場合、それらの合計を計算します。問題を3つの部分に分けます。これらはすべて、並行して実行できます。
- 入力ファイルを生データ(整数のリスト/反復可能ファイル)に処理します
- 並行してデータの合計を計算します
- 合計を出力します
以下は、これら3つのタスクを解決する従来の単一プロセスバインドPythonプログラムです。
このプログラムを書き直して、マルチプロセッシングを使用して上記の3つの部分を並列化してみましょう。以下は、この新しい並列化されたプログラムのスケルトンであり、コメントの部分に対処するために具体化する必要があります。
これらのコード、およびテスト目的でサンプルCSVファイルを生成できる別のコードは、githubにあります。
並行性の達人がこの問題にどのように取り組むかについて、ここで洞察をいただければ幸いです。
この問題について考えるときに私が持っていたいくつかの質問があります。いずれか/すべてに対処するためのボーナスポイント:
- データを読み込んでキューに入れるための子プロセスが必要ですか、それともメインプロセスがすべての入力が読み取られるまでブロックせずにこれを行うことができますか?
- 同様に、処理されたキューから結果を書き出すための子プロセスが必要ですか、それともメインプロセスがすべての結果を待たずにこれを行うことができますか?
- 合計操作に
プロセスプールを使用する必要がありますか?
- はいの場合、入力プロセスと出力プロセスもブロックせずに、入力キューに入ってくる結果の処理を開始するためにプールでどのメソッドを呼び出しますか?apply_async()?map_async()?imap()?imap_unordered()?
- データが入力されたときに入力キューと出力キューを吸い上げる必要はなかったが、すべての入力が解析され、すべての結果が計算されるまで待つことができたとします(たとえば、すべての入力と出力がシステムメモリに収まることがわかっているため)。アルゴリズムを何らかの方法で変更する必要がありますか(たとえば、I / Oと同時にプロセスを実行しないでください)?
java - JVM(恥ずかしいことに)並列処理ライブラリ/ツール
驚異的並列JVMコードをクラスター上で簡単に実行(正しくコーディング)できるものを探しています(Clojure + Incanterを使用できるようにするため)。
私は過去にParallelPythonを使用してこれを行いました。新しいPBSクラスターがあり、管理者は間もなくPBSをバックエンドとして使用するIPythonノードをセットアップします。これらのシステムはどちらも、クラスター内で特定の種類のコードを実行するのはほとんど簡単です。
私は過去にHadoopを使用するのを間違えました(Hadoopは、私が使用する種類のデータには適していません)-レイテンシーにより、わずかな実行でも1〜2分間実行されました。
JPPFまたはGridgainは、必要なものに適していますか?ここの誰かがどちらかで何か経験がありますか?他におすすめできることはありますか?
python - クラスター上で python と PBS を使用した「恥ずかしい並列」プログラミング
図形を生成する関数 (ニューラル ネットワーク モデル) があります。Torque を備えた標準クラスターで PBS を使用して、python からいくつかのパラメーター、メソッド、およびさまざまな入力 (関数の何百回もの実行を意味する) をテストしたいと考えています。
注: 私は parallelpython 、 ipython などを試しましたが、完全に満足することはありませんでした。クラスターは、私が変更できない特定の構成にあり、python + qsub を統合するこのようなソリューションは、コミュニティに確実に利益をもたらします。
物事を単純化するために、次のような単純な関数があります。
はinput
入力を表すオブジェクトinput.name
で、文字列であり、do_lots_number_crunching
数時間続く場合があります。
私の質問は次のようなパラメータのスキャンのようなものを変換する正しい方法はありますか?
関数へのすべての呼び出しに対してPBSスクリプトを起動する「何か」にmodel
?
PBS テンプレートをインクルードして Python スクリプトから呼び出す関数を考えていましたが、まだわかりませんでした (decorator?)。
c - 恥ずかしいほど並列ジョブを実行しているときに、並列ファイルシステムの過負荷を避ける最善の方法は何ですか?
恥ずかしいほど並列の問題があります。それぞれに異なるデータセットを使用して、単一のプログラムの多数のインスタンスを実行します。これを行うには、アプリケーションを毎回異なるパラメータでバッチ キューに何度も送信します。
ただし、多数のジョブがある場合、すべてのジョブが完了するわけではありません。キューの問題ではないようです。すべてのジョブが開始されています。
問題は、実行中のアプリケーションの多数のインスタンスで、多くのジョブがほぼ同時に終了し、そのためすべてのジョブがほぼ同時に並列ファイル システムにデータを書き込もうとすることです。
問題は、プログラムがファイルシステムに書き込むことができず、何らかの方法でクラッシュするか、書き込みを待っているだけで、長時間待機した後にバッチキューシステムがジョブを強制終了することです。(私が問題について収集したものから、すべてではないにしても、完了に失敗したジョブのほとんどは、コア ファイルを残しません)
この問題を回避するためにディスク書き込みをスケジュールする最善の方法は何ですか? 各プロセスが他のプロセスを認識していないという事実を強調するために、私たちのプログラムは恥ずかしいほど並列であることに言及します-何らかの方法で書き込みをスケジュールするために互いに通信することはできません。
私はプログラムのソースコードを持っていますが、私たちはそれを維持または開発していないので、可能であればこれを変更することなく問題を解決したいと考えています (コメントのほとんどはイタリア語です)。
私はこの問題についていくつかの考えを持っています:
- 各ジョブは、最初にノードのローカル (スクラッチ) ディスクに書き込みます。次に、どのジョブが完了したかをときどきチェックし、ファイルをローカル ディスクから並列ファイル システムに移動する別のジョブを実行できます。
- マスター/スレーブ システムでプログラムの周りに MPI ラッパーを使用します。マスターはジョブのキューを管理し、これらを各スレーブにファームします。スレーブ ラッパーはアプリケーションを実行し、例外をキャッチし (C++ または Java のファイル システム タイムアウトに対してこれを確実に実行できますか?)、ジョブを再実行するようにメッセージをマスターに送り返します。
それまでの間、エラー自体の詳細についてスーパーバイザーをせがむ必要があります。個人的にエラーに遭遇したことはありませんが、非常に多数のデータセットに対してプログラムを使用する必要はありませんでした (まだ)。
参考までに、SGE (Sun GridEngine) バッチ キュー システムを備えた HPC システムで Solaris を実行しています。ファイルシステムは NFS4 で、ストレージサーバーも Solaris を実行しています。HPC ノードとストレージ サーバーは、ファイバー チャネル リンクを介して通信します。
matlab - Matlab dfeval オーバーヘッド
私は、労働者間のコミュニケーションを必要としない恥ずかしいほど並行した仕事をしています。dfeval関数を使おうとしているのですが、オーバーヘッドが凄そうです。まず、ドキュメントから例を実行しようとしています。
後続の時間を実行すると、同様のタイミングが生成されます。だから私の質問は:
- 新しいインスタンスで matlabpool open を実行したのに、実行中の数値をゼロにするために matlabpool close force local を実行する必要があるのはなぜですか?
- このような些細な例に 5 秒のオーバーヘッドが本当に必要なのでしょうか? 特に、Matlab ワーカーが既に起動されていることを考えると?
bash - 途方もなく並列ワークフローが作成する出力ファイルが多すぎる
Linux クラスターでは、多くの ( N > 10^6
) 個の独立した計算を実行しています。各計算には数分しかかからず、出力は数行です。小さい頃N
は、後で解析するために各結果を個別のファイルに保存できました。ただし、大きいN
と、(ファイル作成のために)ストレージスペースを浪費していることにls
気付き、 bash: の内部制限により、次のような単純なコマンドには特別な注意が必要です-bash: /bin/ls: Argument list too long
。
各計算はqsub
スケジューリング アルゴリズムを実行する必要があるため、出力データを 1 つのファイルに単純に集約するマスター プログラムを作成することはできません。2 つのプログラムが同時に終了し、それらの出力をインターリーブすると、1 つのプログラムに追加する単純なソリューションは失敗します。クラスターへの管理者アクセス権がないため、システム全体のデータベースをインストールすることはできません。
途方もない並列計算からの出力データを管理不能になる前に照合するにはどうすればよいですか?
grid - Google Compute Engine (GCE) に相当する Starcluster はまだありますか?
GCEに相当するStarclusterがあるかどうか知っている人はいますか? Starcluster を EC2 で使用して、恥ずかしいほど並列ジョブを実行できて非常に満足しています。今、私はGCEを試してみたいと思っています。進行中のプロジェクトに喜んで貢献したいのですが、何も見つかりませんでした。
今のところ、必要なソフトウェア (つまり、Open Grid Engine) を手動でインストールし、コピー イメージを生成するだけでよいと思います。難しいことではありませんが、最初にここをチェックしておこうと思いました。
amazon-ec2 - マルチコア クラウド インスタンス (ec2、gce、ラックスペース) では、メモリを大量に消費するジョブのスケーリングがうまくいきませんか?
クラウドインスタンスのすべてのコアを使用するようにスケールアップして、メモリを大量に消費するジョブ (私の場合は 2.5GB) を使用するときに、ひどいパフォーマンスに気付いた人はいますか?
クワッド xeon チップでローカルにジョブを実行すると、1 つのコアを使用する場合と 4 つのコアすべてを使用する場合の違いは、すべてのコアで約 25% 遅くなります。これは、私が理解していることから予想されます。コアが使い果たされるにつれてクロック レートが低下するのは、マルチコア チップ設計の一部です。
しかし、マルチコア仮想インスタンスでジョブを実行すると、1 つのコアを使用する場合とすべてのコアを使用する場合で、処理時間が 2 倍から 4 倍遅くなります。GCE、EC2、および Rackspace インスタンスでこれを見てきました。そして、私は多くの異なるインスタンス タイプをテストしましたが、ほとんどが提供されている最速のものです。
この動作は、メモリ使用量がほぼ同じサイズのジョブを持つ他の人にも見られましたか?
私が実行しているジョブは fortran で書かれています。私はそれらを書きませんでしたし、私は実際には Fortran の人ではないので、それらについての知識は限られています。I/O のニーズが低いことはわかっています。実行中にtopを見ると、CPU バウンドのように見えます。それらは相互に通信する必要なく実行されます。つまり、恥ずかしいほど並列です。それぞれ約 2.5GB のメモリを使用します。
これまでのところ、これだけ多くのメモリを消費するジョブは、仮想化レイヤーのメモリ管理によって大きな打撃を受けるというのが私の推測です。私のジョブが I/O リソースをめぐって競合している可能性もありますが、専門家によると、これはほとんどありそうにないようです。
今の私の回避策は、GCE を使用することです。これは、実際に私のラップトップのチップと同じ速度でジョブを実行するシングルコア インスタンスがあり、コアにほぼ比例して価格が設定されているためです。
google-compute-engine - Google Compute Engine でグリッド ジョブを設定して実行するためのツール
Google Compute Engine で「恥ずかしいほど」並列ジョブをセットアップして実行する必要があります。これを容易にするツールを探しています。
EC2 では、MIT の Starcluster を使用してクラスターをセットアップし、ジョブを SGE に送信しました。
Google Compute Engine で利用できる同様のツールはまだありますか?
そうでない場合は、Condor Cluster を手動でセットアップしてジョブを実行します。バズ殺す。