私の論文では、多くのシミュレーション研究を実行する必要がありますが、すべてにかなり時間がかかります。私のコンピューターには4つのコアがあるので、2つの異なるコアを使用させることで、たとえばRstudioで2つのRスクリプトを同時に実行できるかどうか疑問に思っていました。これを行うことができれば、これらのスクリプトをすべて一晩コンピューターに実行させておくだけで、多くの時間を節約できます。
[〜#〜] edit [〜#〜]:RStudioの機能強化により、この方法はこれを行う最良の方法ではなくなりました-Tom Kellyの以下に答えてください
結果が同じ環境で終わる必要がないと仮定すると、RStudioプロジェクトを使用してこれを達成できます。 https://support.rstudio.com/hc/en-us/articles/200526207-Using-Projects
最初に2つの個別のプロジェクトを作成します。両方を同時に開くことができるため、2つのrsessionが発生します。その後、各プロジェクトの各スクリプトを開き、各スクリプトを個別に実行できます。その後、コア割り当てを管理するのがOS上になります。
RStudioを右クリックすると、RStudioのいくつかの個別の「セッション」を開くことができます(プロジェクトを使用するかどうか)。デフォルトでは、これらはそれぞれ1コアを使用します。
更新(2018年7月): プレビューリリース として利用可能なRStudio v1.2.830-1は「ジョブ」ペインをサポート。これは、インタラクティブRセッションとは別に、バックグラウンドでRスクリプトを実行するためのものです。
クリーンなRセッションでRスクリプトをバックグラウンドジョブとして実行する
進行状況を監視し、リアルタイムでスクリプト出力を確認します
オプションで、開始時にジョブにグローバル環境を提供し、完了時に値をエクスポートして戻す
これは、RStudioバージョン1.2で利用可能になります。
エラーなしで実行できることがわかっているスクリプトがいくつかある場合は、コマンドラインから異なるパラメーターでこれらを実行することをお勧めします。
_RCMD script.R
RScript script.R
R --Vanilla < script.R
_
バックグラウンドで実行する:
_Nohup Rscript script.R &
_
ここで、「&」はスクリプトをバックグラウンドで実行します(fg
で取得、htop
で監視、_kill <pid>
_または_pkill rsession
_)およびNohup
は、出力をファイルに保存し、端末が閉じている場合は実行を続けます。
引数をスクリプトに渡す:
_Rscript script.R 1 2 3
_
これは、c(1, 2, 3)
をcommandArgs()
の出力としてRに渡すので、bashのループは、bashループでRscriptの複数のインスタンスを実行できます。
_for ii in 1 2 3
do
Nohup Rscript script.R $ii &
done
_
Rスクリプトの特定のステップが計算を遅くしていることがよくあります。Rコード内で並列コードを個別に実行するのではなく、実行することをお勧めしますか? Rで並列にループを実行するには、 snow package をお勧めします。一般的に、使用する代わりに:
_cl <- makeCluster(n)
# n = number of cores (I'd recommend one less than machine capacity)
clusterExport(list=ls()) #export input data to all cores
output_list <- parLapply(cl, input_list, function(x) ... )
stopCluster() # close cluster when complete (particularly on shared machines)
_
Rで通常lapply
関数を使用して並列で実行する場合はどこでもこれを使用します。
次のコードを使用して、同じセッションでマルチコア並列処理を実現できます(ここで説明されているとおり https://cran.r-project.org/web/packages/doMC/vignettes/gettingstartedMC.pdf )
if(Sys.info()["sysname"]=="Windows"){
library(doParallel)
cl<-makeCluster(numberOfCores)
registerDoParallel(cl)
}else{
library(doMC)
registerDoMC(numberOfCores)
}
library(foreach)
someList<-list("file1","file2")
returnComputation <-
foreach(x=someList) %dopar%{
source(x)
}
if(Sys.info()["sysname"]=="Windows") stopCluster(cl)
それでも出力を調整する必要があります。
恥ずかしいパラレルを実行したい場合は、ターミナルタブ(コンソールタブの直後にあります)で必要な数のターミナルを開き、Rscript yourcode.R
を使用してコードを実行できます。デフォルトでは、各コードは別々のコアで実行されます。必要に応じて、コマンドライン引数(@Tom Kellyの言及どおり)を使用することもできます。
(Unix/Linuxを使用していると仮定して)必要なことは、Rバッチコマンドを実行してバックグラウンドで実行することだけです。これにより、自動的にCPUに割り当てられます。
シェルで、以下を実行します。
/your/path/$ Nohup R CMD BATCH --no-restore my_model1.R &
/your/path/$ Nohup R CMD BATCH --no-restore my_model2.R &
/your/path/$ Nohup R CMD BATCH --no-restore my_model3.R &
/your/path/$ Nohup R CMD BATCH --no-restore my_model4.R &
コマンドを実行し、印刷結果をファイルmy_model1.Routに保存し、作成されたすべてのRオブジェクトをfile.RDataに保存します。これにより、各モデルが異なるCPUで実行されます。セッションの実行と出力は、出力ファイルに入れられます。
インターネットを介して、端末を介してそれを行う場合は、Nohupコマンドを使用する必要があります。それ以外の場合、セッションを終了すると、プロセスは終了します。
/your/path/$ Nohup R CMD BATCH --no-restore my_model1.R &
プロセスの優先度を低くしたい場合は、次のようにします。
/your/path/$ Nohup Nice -n 19 R CMD BATCH --no-restore my_model.R &
関連するデータファイルを読み込んで添付するには、スクリプトの先頭にコードを含めるのが最善です。
絶対にしないでください
/your/path/$ Nohup R CMD BATCH my_model1.R &
これにより、.RDataファイル(そこにあるすべての面白いオブジェクトも)が丸willみされ、再現性が著しく損なわれます。つまり、
--no-restore
または
--Vanilla
親愛なる友人です。
モデルが多すぎる場合は、CPUとRAMを増やすことができるため、クラウドアカウントで計算を行うことをお勧めします。実行していることとRパッケージによっては、モデルが現在のハードウェアで数時間かかる場合があります。
私はこれを難しい方法で学びましたが、ここに素敵なドキュメントがあります:
http://users.stat.umn.edu/~geyer/parallel/parallel.pdf
HTH。