运行 同时存在多个 R 脚本

Run multiple R-scripts simultaneously

在我的论文中,我需要进行大量的模拟研究,这都需要相当长的时间。我的电脑有 4 个内核,所以我一直想知道是否可以 运行 例如 Rstudio 中的两个 R 脚本,让它们使用两个不同的内核?如果可以做到这一点,我只需将计算机放在一夜之间就可以节省大量时间 运行 执行所有这些脚本。

编辑:鉴于 RStudio 的增强功能,此方法不再是执行此操作的最佳方法 - 请参阅上面 Tom Kelly 的回答 :)


假设结果不需要在相同的环境中结束,您可以使用 RStudio 项目实现:https://support.rstudio.com/hc/en-us/articles/200526207-Using-Projects

首先创建两个独立的项目。您可以同时打开两者,这将导致两个 rsession。然后您可以打开每个项目中的每个脚本,并分别执行每个脚本。然后由您 OS 管理核心分配。

您可以使用以下代码在同一会话中实现多核并行(如此处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)

您仍需要调整输出。

在 RStudio 中

如果您右键单击 RStudio,您应该能够打开 RStudio 的几个单独的“会话”(无论您是否使用项目)。默认情况下,它们各使用 1 个核心。

更新(2018 年 7 月):RStudio v1.2.830-1 Preview Release 支持“作业”窗格。这专用于 运行 在后台与交互式 R 会话分开的 R 脚本:

  • Run any R script as a background job in a clean R session
  • Monitor progress and see script output in real time
  • Optionally give jobs your global environment when started, and export values back when complete

这将在 RStudio 版本 1.2 中提供。

运行 终端中的脚本

如果您知道 运行 的几个脚本没有错误,我建议 运行 通过 command-line:

在不同的参数上设置这些脚本
RCMD script.R
RScript script.R
R --vanilla < script.R

运行在后台:

nohup Rscript script.R &

此处“&”运行是后台脚本(可以用[=15=检索,用htop监控,用kill <pid>或[杀死=18=]) 和 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][1] for 运行ning loops in parallel in R. 通常,而不是使用:

cl <- makeCluster(n)
# n = number of cores (I'd recommend one less than machine capacity)
clusterExport(cl, 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 函数的任何地方使用它来并行 运行 它。 [1]: https://www.r-bloggers.com/quick-guide-to-parallel-r-with-snow/

如果你想做一个令人尴尬的并行,你可以在终端选项卡(位于控制台选项卡之后)和运行你的终端选项卡中打开任意数量的终端通过使用 Rscript yourcode.R 的代码。默认情况下,每个代码将 运行 在单独的核心上。如果需要,您还可以使用命令行参数(如@Tom Kelly 所述)。

您需要做的(假设您使用 Unix/Linux)是 运行 一个 R 批处理命令并将其放在后台。这将自动将其分配给 CPU.

在 shell 处,执行:

/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 上。会话和输出的 运行 将放在输出文件中。

如果您通过 Internet 通过终端执行此操作,则需要使用 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 文件(那里还有所有有趣的对象),并且会严重影响再现性。也就是说,

--no-restore

--vanilla

是你亲爱的朋友。

如果你有太多的模型,我建议在云帐户上进行计算,因为你可以有更多的 CPU 和 RAM。根据您正在做的事情和 R 包,模型在当前硬件上可能需要几个小时。

我很难学到这一点,但这里有一个很好的文档:

http://users.stat.umn.edu/~geyer/parallel/parallel.pdf

HTH。