問題タブ [snow]
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.
r - クラスタ スレーブ ノードのセットアップ方法 (Windows の場合)
15 台のマシン (それぞれ 4 つのコア) で数千*のモデルを実行する必要があり、すべて Windows です。parallel
私は、snow
およびパッケージ化を学び始めsnowfall
、たくさんのイントロを読みましたが、それらは主にマスターのセットアップに焦点を当てています。Windows でワーカー (スレーブ) ノードをセットアップする方法に関する情報はほとんどありません。情報はしばしば矛盾しています: SOCK クラスターが実質的に最も簡単な方法であると言う人もいれば、 Windows での SOCK クラスターのセットアップは複雑 (sshd セットアップ) であり、最良の方法は MPIであると主張する人もいます。
では、Windows にスレーブ ノードをインストールする最も簡単な方法は何でしょうか? MPI、PVM、SOCK、または NWS? 私の、おそらく素朴なアイデアは次のとおりです(優先順位に従ってリストされています):
- スレーブ ノードで 4 つのコアすべてを使用するには (必須)。
- 理想的には、いくつかのパッケージと、いくつかのポートでリッスンしてマスターからのタスクを待機するスレーブ R スクリプトまたは R 関数を含む R のみが必要です。
- 理想的には、ノードをクラスターから動的に追加/削除できます。
- 理想的には、スレーブはマスターに接続するため、マスターの構成ですべてのスレーブ IP をリストする必要はありません。
100% 必要なのは 1 つだけで、2 ~ 4 つが「あればよい」です。要求するのはあまりにも素朴ですか?
申し訳ありませんが、利用可能なドキュメントとチュートリアルからこれを理解することができませんでした. 正しい情報源を教えていただければ幸いです。
* これらの何千ものモデルのそれぞれに少なくとも 7 分かかるため、大きな通信オーバーヘッドは発生しないことに注意してください。
r - スレッド間での情報の受け渡し (%dopar% を使用した foreach)
長さが異なるタスクを並列化するためにdoSNOW-パッケージを使用しています。1つのスレッドが終了したら、私は欲しいです
- 次のスレッドに渡される古いスレッドによって生成されたいくつかの情報
- すぐに次のスレッドを開始します (clusterApplyLB のような負荷分散)
シングルスレッドで動作します (makeClust( spec = 1 ) を参照) 。
ここで、「makeCluster」の仕様を 4 に変更します。出力は次のようになります。
18:12:21 にスレッド 9 は、スレッド 1 と 5 が処理されたことを認識しました。2 秒後にスレッド 6 が終了します。次のスレッドは、少なくとも 1、5、および 6 について知っている必要がありますね。しかし、スレッド 10 は 6 と 2 しか知りません。
これはmakeClusterで指定されたコアで何かをしなければならないことに気づきました。9 は 1、5、9 (1 + 4 + 4) について知っており、10 は 2、6、10 (2 + 4 + 4) について知っています。
「処理された」ものをさらに世代のスレッドに渡すより良い方法はありますか?
ボーナスポイント: スノーパッケージからのこれらの「タイプ: EXEC」などのメッセージなしで、並列処理でマスターノードに「印刷」する方法はありますか? :)
ありがとう!マルク
r - R で複数のコアと疎行列を操作する
ゼロの数が多い大きな行列を必要とするプロジェクトに取り組んでいます。残念ながら、これらの行列の一部は 1e10 を超える要素を持つことができるため、RAM の制約により、「標準」の R 行列を使用することはできません。また、計算には非常に長い時間がかかる可能性があり、実際にはそうすべきではないため、複数のコアで作業する必要があります。
これまでのところ、私はパッケージで作業しておりforeach
、結果 (標準行列で提供されます) を後で疎行列に変換しました。もっとスマートな方法があるに違いないと思わずにはいられません。
これは、私がこれまで行ってきたことの最小限の例です。
ラムダはすべて非常に小さいため、5 番目の要素ごとに約 0 と異なるだけであるため、結果をスパース行列に格納することが賢明です。
残念ながら、反復回数を 1e6 から少なくとも 1e7 に増やす必要が生じたため、foreach
ループによって生成される行列が大きすぎて 8 GB の RAM に格納できなくなりました。ここでやりたいことは、タスクをそれぞれ 1e6 回の反復を含むステップに分割し、これらを 1 つのスパース マトリックスに結合することです。
私は今、アイデアとして次のことを考えています。
正常に動作しますが、ラムダを何らかの値に修正する必要がありました。私のアプリケーションでは、ラムダ ベクトルの i 番目の要素に平均が等しいポアソン分布から得られる i 番目の行の値が必要です。これは明らかにforeach
ループでうまく機能しましたが、適用ループで機能させる方法をまだ見つけていません。
私の質問は次のとおりです。
- 適用関数に、それが操作している行を「認識」させ、対応する引数を関数に渡すことは可能ですか?
- 標準マトリックスを作成し、次のステップでそれをスパース マトリックスに変換する必要なく、foreach およびスパース マトリックスを操作する方法はありますか?
- 上記のいずれにも当てはまらない場合、タスクを R のスレーブ プロセスに手動で割り当てる方法はありますか?まばらなベクトルであり、最後のステップでこれらを結合するだけです。
r - Snow から呼び出された並列コードで C++ コードのパラメーターにアクセスできない
Snow パッケージを使用して並列 R コードを開発していますが、Rcpp パッケージを使用して C++ コードを呼び出すと、プログラムがハングして応答しなくなります。
例として...私は雪を使用して特定の数のプロセスに分割しているRに次のコードを持っています
私のC++関数は次のように見えますが...
mpi=false および mc.cores=[いくつかのスレッド] で実行すると、プログラムは美しく実行されますが、mpi=true で実行すると、したがって Snow を使用すると、プログラムは int=as<int>(n )????? 一方、C++ 関数を次のように定義すると...
プログラムは各 mpi スレッドで完全に実行されますか?? 問題は、整数倍精度などでは機能しますが、行列では機能しないことです。
これがなぜなのか、そして私がここで何が欠けているのか知っている人はいますか?
r - 10GB を超えるスタン結果の処理方法
時系列を予測するモデルがあります。したがって、5つのパラメーターしかありません。これを使用して、7200x3マトリックスを生成する変換パラメーターとして時系列を計算し、観測と比較します。
これまでのところ、100回の反復を行うだけで期待どおりに機能します。しかし、今は SNOW を使用してこの計算を並列化し、6x1000 の反復を作成しました。1 時間かかりましたが、問題ないようです。唯一の問題は、結果の rdata ファイルを読み込めなくなったことです。サイズは 11GB です。
シミュレーションの数を増やす必要があるため、このサイズのデータを処理する方法を見つける必要があります。他の人々はこの問題にどのように対処しますか?
コード
(簡単な例を作成しようとしています-読みやすくなります)
R スクリプト
モデルの関連部分
アップデート
Modeling Language Manual p41の例に従ってコードを再編成することに成功しました。現在、状態空間は保存されていません。残念ながら、まだ軌道が必要です (少なくともこの開発段階では)。したがって、誰かが賢い解決策を持っていることを願って、これを開いたままにします。
r - クラスター上のすべてのノードのすべての CPU をオンにする: snow/snowfall パッケージ
私はクラスターで作業しており、snowfall
パッケージを使用して、次のコマンドを使用して、それぞれ 40 個の CPU を持つ 5 つのノードでソケット クラスターを確立しています。
クラスタ レポートを確認すると、スレーブの負荷が予想よりもはるかに低く、「200 CPU での並列実行」ではなく「5 CPU での並列実行」と表示されていることに戸惑いました。これは単なる CPU へのあいまいな参照ですか、それともホストはそれぞれ 1 つの CPU しか実行していませんか?
編集:これが私に関係する理由の例です。ローカルマシンのみを使用し、コアの最大数を指定した場合、次のようになります。
単一ノードの 40 CPU クラスターで同じジョブを実行したところ、1.4 分かかりましたが、5 ノードの明らかに 5 CPU クラスターは 5.22 分かかりました。これは、5 つのノードで並列処理を実行しているが、各ノードで 1 つの CPU のみをオンにしているという疑いを裏付けるものです。
私の質問は次のとおりです。使用可能なすべてのノードで使用するためにすべての CPU を有効にするにはどうすればよいですか?
編集: @SimonG 基になるsnow
パッケージの初期化を使用しましたが、5 つのノードのみがオンになっていることがはっきりとわかります。
これはそれをかなり明確に示していると思います。私は必死でこれを試しました:
そして予想通り得た: