問題タブ [snowfall]
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.
c - C と並列化を使用した R での高速相関
今日の私のプロジェクトは、私が持っている基本的なスキルセットを使用して、R で高速相関ルーチンを作成することでした。それぞれほぼ 100 万の観測値を持つほぼ 400 の変数間の相関関係を見つける必要があります (つまり、サイズ p=1MM 行 & n=400 列の行列)。
R のネイティブ相関関数は、変数ごとに 1MM 行と 200 個の観測値に対して約 2 分かかります。列ごとに 400 回の観測を実行したことはありませんが、約 8 分かかると思います。私はそれを終えるのに 30 秒もかかりません。
したがって、私は物事をやりたいです。
1 - C で単純な相関関数を記述し、それをブロックに並列に適用します (以下を参照)。
2 - ブロック - 相関行列を 3 つのブロック (サイズ K*K の左上の正方形、サイズ (pK) (pK) の右下の正方形、およびサイズ K (pK)の右上の長方形行列) に分割します。corr
上三角のみが必要なため、これは相関行列のすべてのセルをカバーします。
3 - Snowfall を使用して、.C 呼び出しを介して C 関数を並列に実行します。
これが私の問題です:
方法1の場合、機能しますが、私が望む方法ではありません。私は、corr 行列を渡すとき、アドレスを渡し、C がソースで変更を行うと信じていました。
ただし、元のcorr
行列は変更されません。
質問 #1: C 関数がcorr
ソースの値を確実に変更する方法はありますか? これら 3 つをマージして上三角相関行列を作成することはできますが、ソースでの変更が可能かどうかを知りたかったのです。注: 単にループを実行しているだけなので、これは高速相関の実現には役立ちません。
質問 #2: 方法 2 の場合、init ステップで各コアの並列ジョブのために共有オブジェクトを各コアにロードするにはどうすればよいですか (どのように行ったかではありません)。
質問 #3: このエラーはどういう意味ですか? いくつかのポインタが必要です。自分でデバッグしたいと思います。
質問 #4: 1MM x 400 の行列の相関を 30 秒未満で計算する高速な方法はありますか?
方法 2 を実行すると、次のエラーが表示されます。
以下に添付されているのは、相関のための私のプレーンなバニラ C コードです。
r - SnowFall を使用した $ の問題
SnowFall を使用して、クラスターを使用してコードを高速化しようとしています。私のコードの単純化されたバージョンは次のようになります
これの目的は、lm オブジェクト (guess$coef) の係数のみを出力することでしたが、得られる出力は lm オブジェクト全体です。したがって、 $ が機能していないようです。コードの後半で (ここには含まれていませんが、同じ問題が発生しています。つまり、$ が機能していないようです)。すべての提案は大歓迎です。
r - Rの並列メソッド内から無駄なロガーを使用してログを記録する方法は?
ログにRで無駄なロガーを使用しています。R で Snowfall を使用して実装された並列アルゴリズムがあります。並列プロセスの各コアは、中間出力をロガーに記録します。しかし、この出力はロガーに表示されませんか?
Snowfall を使用して並列ジョブ内から無駄なロガーを使用してログを記録できますか?
それがどのように行われたかを追加します:
私の特定のケースは少し異なっていました。作成した共有オブジェクトを使用して、R から C 関数を呼び出しています。関数は反復アルゴリズムであり、数回の反復ごとに出力をログに記録する必要があります。C関数から無駄なロガーへのロギングに興味がありました。なぜ無駄なロガーなのか? これは Web アプリケーションの一部であり、ユーザー セッションのすべての出力を一貫した形式にすることは理にかなっているからです。
これは、受け入れられた回答に基づいて私が従った一般的なアプローチです。
今C関数
お役に立てれば。R と C が共通のロガーを共有するためのより簡単な方法があれば、私に知らせてください。
r - R スクリプトの実行後にワーカーを強制終了できません
R バージョン 3.0.1 (2013-05-16) および m2.2xl AWS EC2 で初期化された Snowfall 1.84-4 (snow 0.3-13 を使用)、元の AMI はhttp://www.louisaslett から取得しています。 com/RStudio_AMI/ .
私の問題は、次を使用してクラスターを作成した後です。
コマンドラインから実行します:
sudo R CMD BATCH xyz.R &
xyz.R が失敗した場合、すべてのノードは存在し続けますが、ファイルをスクリプトとして実行したため、sfStop() を使用できなくなりました。Rstudio ブラウザー ウィンドウ内で同じコードを実行すると、コードが失敗した場合でも sfStop() を正常に実行できます。
私が含める場合
次に、エラーをキャッチし、クラスターを強制終了します。また、Rstudio からコマンドを実行するだけで、クラスターを停止できます。ただし、スクリプトを使用して開始された 30 以上のノードがあり、停止できないという問題がまだ残っています。
を使用してノードを強制終了しようとしましsudo kill 'PID' -9
たが、常に再表示されます。また、すべての PPID=2 を強制終了してみました。EC2 を再起動しようとしましたが、それでもうまくいきませんでした。実行中のすべてのプロセス (はい、100 以上のすべて) を手動で強制終了するところまで行きましたが、これらの PPID=2 はすべて戻ってきます。これは の出力ですps -ef
。一番下は、現在動作している 8 つのクラスターを示しています。
上位 50 のプロセスが存在します/私が何をしても戻ってきます。他の誰かがこの問題を抱えていますか? もしそうなら、どうやって労働者を殺したのですか?
r - Snowfall を使用して並列計算を行う場合、負荷分散を行いませんか?
長い間、私は多くの並列 r スクリプトに sfLapply を使用してきました。しかし、最近は並列コンピューティングについて詳しく調べているので、sfClusterApplyLB を使用しています。これにより、個々のインスタンスの実行に同じ時間がかからない場合に、多くの時間を節約できます。sfLapply が新しいバッチをロードする前にバッチの各インスタンスが終了するのを待つ場合 (アイドル状態のインスタンスにつながる可能性があります)、タスクを完了した sfClusterApplyLB インスタンスはすぐにリスト内の残りの要素に割り当てられるため、かなり節約できる可能性がありますインスタンスが正確に同じ時間がかからない時間の。これにより、降雪を使用するときに実行の負荷を分散させたくないのはなぜでしょうか? これまでに見つけた唯一のことは、並列スクリプトにエラーがある場合、sfClusterApplyLB はエラーが発生する前にリスト全体を循環しますが、sfLapply は最初のバッチを試行した後に停止します。他に何が欠けていますか?負荷分散のその他のコスト/欠点はありますか? 以下は、2 つの違いを示すコード例です。
r - R: カスタム距離関数と複数の基準に基づいてレコードをすばやく照合
R でいくつかの関数を作成して、化学質量スペクトル (整数の質量と強度を持つ 2 つの列を持つマトリックス) を、カスタム スペクトル類似度関数と化合物のいわゆる保持インデックスのマッチングに基づいて、そのようなスペクトルのライブラリに一致させました (つまり、溶出時間) (例については、http://webbook.nist.gov/cgi/cbook.cgi? ID=C630035&Mask=200 を参照))。そのためには、各レコードのリスト要素「RI」をライブラリ内の要素と比較する必要があり、絶対偏差が所定の許容範囲よりも小さい場合、スペクトル ライブラリの最適な一致をレコードに追加する必要があります。以下は、これを行うために私が書いたコードですが、問題は、私の目的には遅すぎることです (通常、約 1000 のサンプル スペクトルと 200 000 のライブラリ スペクトルがあります)。私はそれを並列化しようとしましたが、それもあまり役に立たないようです。以下のコードをより効率的にする方法について、おそらく何か考えはありますか? たとえば、より多くのベクトル化を使用したり、インライン C コードを使用したり、その他の R トリックを使用したりしますか? この点に関する一般的なアドバイスは知っていますが、この場合に簡単に実装する方法がわかりません (残念ながら、私はまだ C に精通していません)...何か考えやアドバイスはありますか? そうそう、sfLapply
? おそらく、スペクトル類似度関数のステップを回避するために、最初にスペクトルを1つの大きな(ゼロがたくさんあるため、スパース)マトリックスに入れるmerge
か、最大/最大の場合にのみスペクトルを考慮するなどの追加の基準を使用するのに役立ちますかクエリ スペクトルの強いピークは、ライブラリ スペクトルと同じ質量を持っていますか (またはライブラリ スペクトルの 5 つの最大ピークのセットに含まれていますか)? とにかく、このタスクをスピードアップする方法についての考えは大歓迎です!
編集: 私がまだ持っている残りのクエリの 1 つは、関数 addbestlibmatches1 でサンプル レコード recs の完全なコピーを作成することを回避する方法ですが、ライブラリの一致がある場所のレコードのみを変更する方法です。また、保持インデックスの一致があるライブラリ レコードの選択を渡すことは、おそらく効率的ではありません (関数 addbestlibmatch で)。これを回避する方法はありますか?
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 つのノードのみがオンになっていることがはっきりとわかります。
これはそれをかなり明確に示していると思います。私は必死でこれを試しました:
そして予想通り得た:
r - Snowfall を使用している場合、RStudio サーバーのフォルダーにアクセスするとエラーが発生します
RStudio サーバーと降雪を使用しています。私の並列コードは常に次のメッセージを表示します。
私の並列関数 (nvtPar) では、ハード ドライブからいくつかのファイルを読み取り、ファイルをハード ドライブに書き込みます。すべてのファイルはサブフォルダーにあります。
このサーバーは、16 コアの VMware 仮想サーバー上に構築されています。私の作業ディレクトリは nfs サーバーで、ホーム ディレクトリとしてマウントされています。
私の RStudio サーバーはバージョン 0.98.994 です。
これは私のセッション情報です:
提案をありがとう。私の質問が明確でない場合はお知らせください。
編集: @roman-luštrik の提案として、質問を再現するために最小限の例を追加しました (スクリプト全体を投稿できなくて申し訳ありませんが、この例では同じエラー メッセージが生成されます)。
掘り下げた後、このエラーは並列計算の file.remove に関連しているようです。次の行にコメントすると、すべてのエラーが消えます。
ところで: 私は作業ディレクトリのバージョン管理に svn を使用しています。
r - Snow を使用した R での並列処理
何千ものリストがあり、各リストには複数の時系列があります。リスト内の各要素に予測を適用したいと思います。これは、コンピューティング リソースの観点から、扱いにくい問題になっています。私は、並列コンピューティングや高度な R プログラミングのバックグラウンダーを持っていません。どんな助けでも大歓迎です。
ダミーリストを作成しました。基本的に、dat.list は私が取り組んでいるものと似ています。
上記のコードは、必要なものを提供します。上記のコードで両方のlapplyに並列処理を適用したいと思います。そこで、snow パッケージとこのサイトに示されている例を使用しようとしました。
以下は私の質問です、
- 何らかの理由で、tm の出力は、非並列バージョンでは異なります。予測関数 ets は、リスト内の要素ではなく、すべての単一のデータ ポイントに適用されます。
非平行:
パラレルバージョン:
私の2番目の質問は、カスタム関数でlapplyをどのように並列化する必要があるかです。基本的にはネストされたparLapplyです
custom.function <- function(x) parLapply(clus,x$z,function(y) (forecast::ets(y))) ## 動作しない
助けてくれて本当にありがとうございます