运行 同时存在多个 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。
在我的论文中,我需要进行大量的模拟研究,这都需要相当长的时间。我的电脑有 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。