問題タブ [rparallel]
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 - R parallel - parRapply が正しく機能しない
開発中のパッケージで単体テストを行っています。テストの 1 つが失敗しています。具体的には、コードの並列バージョンと非並列バージョンがあります。非並列バージョンは完全に機能します。並列バージョンは単体テストに失敗し、一見無意味なエラーが発生します。
checkForRemoteErrors(val) のエラー: 2 つのノードでエラーが発生しました。最初のエラー: ref は {1, nrow(x)} の整数でなければなりません。
ご覧のとおり、は1 の nrow(x)ref
として明確に定義されています。ref= 1L
library(parallel)
このエラーの原因となっているのは、それとの相互作用で何が起こっているのですか?
編集- 私は Windows マシンを使用しています:
r - 並列ジョブ Snow のワーカー/スレーブの最大数
Windows マシンで Snow バックエンドを使用して foreach ループを実行しています。使用するコアは 8 つあります。rscript は、Python スクリプトに埋め込まれたシステム コールを介して実行されるため、アクティブな Python インスタンスも存在します。
#workers=#cores を使用せず、代わりに #workers<#cores を使用すると、システム プロセスまたは python インスタンスが常に開かれるので、何か利点はありますか?
#workers=#cores を使用して正常に実行されますが、r ワーカー インスタンスでコア (可能な最大スレッド数) を飽和させると、パフォーマンスが低下しますか?
r - マスター プロセスとワーカー プロセスを理解する方法 ---R パッケージは "並列" ですか?
R
パッケージのドキュメントを理解しようとしたとき、パッケージのドキュメントのparallel
8 ページにあるコード行を読んだときに、この質問に遭遇しました。以下のコードをコピーしました。にちょうど等しいことに注意してください。mc
2
5 行目で、コマンドlibrary(boot)
は で評価されましcl
たが、8 行目で再度実行され、作成者はmaster のメソッドにlibrary(boot)
必要であると述べています。c()
私の当初の理解では、makeCluster(mc)
2 つのワーカー プロセスが作成され、マスター プロセスはその 1 つです。makeCluster(mc)
によって作成された各ワーカーは、マスター プロセスとは異なるように見えます。したがってlibrary(boot)
、マスタープロセスで実行する必要があります。私はこれで正しいですか?
8 コアの CPU を使用している場合、7 つを超える ( >7 ) ワーカー プロセスを作成してもまったく役に立たないということですか? ありがとうございました。
r - R での big.matrix を使用した交差検証のための並列計算
mclapply
非常に大きな計画行列X
(〜10GB)と応答ベクトルのフィッティング手順をモデル化するための交差検証を並列化するために使用しようとしていますy
。X
次元がn-by-p
:であるとしましょうn=1000, p=1,000,000
。X
は非常に巨大であるため、オブジェクトとしてバックアップさbig.matrix
れ、ディスクに格納され、R パッケージのメソッドを使用してアクセスされますbigmemory
。
4 分割クロス検証のワークフローは次のとおりです。
cv.ind
長さ のインデックス ベクトルを設定しますn
。これは 1 ~ 4 の一連の数値を格納し、 のどの観測値がX
CV のどのフォールドに属するかを示します。- 4 コアをセットアップします。i 番目のコアで、i 番目のフォールド CV の対応するトレーニングおよびテスト サブマトリックスをコピーします。
- 各コアの折り目ごとにモデルを当てはめます。
- 結果を収集し、返します。
交差検証関数は次のようになります。
R 関数cvf
は各コアで実行されます。i 番目のフォールドのトレーニング/テスト行列を 2 つのbig.matrix
オブジェクトとしてコピーし、モデルに適合させ、いくつかの統計を計算し、結果を返します。
ここまでは、計画行列X
が大きすぎない場合 (n=1000, p=100,000
サイズが ~1GB の場合)、コードは非常にうまく機能します。しかし、p=1,000,000
それによって のサイズX
が ~10GB になると、各コアでのモデル フィッティング手順が無限に実行されます!!!!! (次の部分):
注:
- 生のマトリックス (10GB) で 'ncvreg()' を 1 回実行すると、約 2.5 分かかります。
for
ループではなくループを使用してクロス検証を順次実行するmclapply
と、コードは正常に機能し、各フォールド 'ncvreg()' のモデル フィッティングも正常に機能します (~2 分) が、プロセス全体には ~25 分かかります。- 最初は同じ問題で「parLapply」を試しました。ここの理由により、「mclapply」に切り替えました。
- 各コアのデータ コピー ステップ (
deepcopy
部分) は適切に機能し、トレーニング データ セットとテスト データ セットをディスクにコピーしてファイルでバックアップするのに約 2 分かかります。 - CPU 使用率を監視しようとしました。以下は 1 つのスクリーンショットです。左の図でわかるように、4 つのセッションのそれぞれが最大 25% の CPU 使用率を占めていますが、1 つのプロセスでは、kernel_taskが最大 100% の CPU を使用しています。時間が経過すると、kernel_taskは 150% の CPU を使用することさえあります。さらに、CPU 履歴パネル (右下) は、赤色の領域が緑色の領域を支配しているため、ほとんどの CPU 使用率がユーザーではなくシステムによるものであることを示しています。
私の質問:
- モデル フィッティング プロセスを並列に実行すると、時間がかかるのはなぜですか? 考えられる理由は何ですか?
- big.matrix の CV 手順を並列化する正しい方向に進んでいますか? 別の方法はありますか?
ここで私の問題を解決するのに役立つ洞察に感謝します。前もって感謝します!!
r - 並列化されたコードにより、スレッドでのメモリ使用量が増加する (RStudio deffect)
概要:
私の B オブジェクトは 2 GB の大きな行列 100 000 * 5000
私の A オブジェクトは 1000 * 5000 より小さい
最初は、2.1GB の Mermoy を使用する 1 つの rsession プロセスがあります。
parApply 関数を呼び出した後、4.5GB の nb_cpu スレッドがあります。
2 つの質問:
- B は読み取り専用ですが、スレッド間で 1 つのメモリ スロットから共有できます。どうやって進める ?
- それでも、なぜスレッドあたり 4.5 GB で、 ~2.1GB ではないのでしょうか?
「top」コマンドを使用してスレッドとメモリの使用状況を監視していますが、これはガベージ コレクターが解放できる表面的な使用状況ではありません。メモリ不足のためにスレッドがクラッシュします。30 スレッド (私のコードでは nb_cpu = 30) を備えた 128 GB メモリのコンピューターで実行されます。
注意: A の代わりに parApply で B (大きな行列) を使用して、反対のことも試みましたが、問題は解決しませんでした。
r - R 並列、parLapply() は lapply() と同じものを返さない
私は仕事でいくつかのコードをより速く実行することを任されており、並列計算で障害に遭遇しました。並行して実行したいオリジナルの for ループがあります。for ループを使用せずにコードを再現し、代わりに lapply() を使用するのが最も簡単に思えますが、これはループと同じくらい長く実行されます。parLapply() を使用してコードを書き直すと、lapply() と元の for ループの結果とは異なる結果になりますが、はるかに迅速な結果が得られます。どちらも同等です。このプログラムの目的は、各国の各満期レベルでのキャッシュ スプレッド (スプレッド カーブ) を計算することです。
「bonddata.csv」リンク: http://www.mediafire.com/download/hfcdbryhedpso77/bonddata.csv 「weocountries.csv」リンク: http://www.mediafire.com/download/7x15csw7lwwataj/weocountries.csv
必要なデータとライブラリの読み込み:
キャッシュ スプレッドを計算する関数の作成:
元のコード:
lapply() コード:
parLapply() コード:
データフレームの比較:
コードが適切に実行された場合、結果のデータフレーム "cashspreads" および "cashspreads2" は、データフレーム "cashspreads3" と比較できません。
これが同じデータフレームを生成しない理由について何か考えはありますか?