我的目标是使用 docker 容器在由多个 Linux 主机组成的集群上在 R 中执行一些繁重的计算。 在 R 中我想使用 foreach。
要做到这一点,我相信最好的方法是使用未来宇宙。 由于我希望系统能够使用超过 125 个核心,因此我想使用 future.mirai 后端。 另外,我希望对集群的设置方式进行一些细粒度的控制,例如让它在 docker 容器中运行。 这就是为什么我想使用 makeClusterPSOCK(请参阅示例的第 5 节)。
整个设置对我来说相当复杂,所以我从 Windows 11 笔记本电脑(8 核)上的一个非常小的示例开始,并尝试从那里引导自己。
目前我的问题是我缺乏任何教程/示例/文档如何将未来宇宙的不同部分组合成一个更大的统一体。
这是一个 MWE:
rm(list = ls())
.rs.restartR()
library(doFuture)
library(future.mirai)
########################
# plan(sequential)
# plan(multisession)
# plan(mirai_multisession)
# plan(mirai_cluster)
# plan(cluster, workers = c("n1", "n2", "n3"))
workers <- rep("localhost", parallelly::availableCores())
cl <- parallelly::makeClusterPSOCK(
workers = workers,
dryrun = FALSE,
verbose = TRUE,
autoStop = TRUE)
plan(cluster, workers = cl)
#plan(mirai_cluster, workers = cl)
# Error in MiraiFuture(expr = expr, substitute = FALSE, envir = envir, workers = NULL, :
# formal argument “workers” matches several given arguments
# Additionally: warning message:
# Detected 1 unknown future arguments: 'workers'
##############################
y <- foreach(x = 1:1000, .combine = c) %dofuture% {
Sys.getpid()
}
table(y)
这里的想法是尝试不同的策略(
sequential
、multisession
、mirai_multisession
)并检查 pid 的数量是否符合我的预期。
在这种情况下如何克服 125 个核心的限制(如何将 future.mirai
后端与 parallelly::makeClusterPSOCK
结合起来)?
Futureverse 的作者在这里。
在 R (>= 4.4.0) [2024-04-24] 中,您可以在启动 R 和 Rscript 时通过指定选项 --max-connection=N
来增加 R 可以处理的连接数,例如
$ Rscript --max-connections=512 -e "parallelly::availableConnections()"
[1] 512
这记录在https://parallelly.futureverse.org/reference/availableConnections.html中。这意味着您可以将
multisession
与 148 个并行工作线程(每个工作线程一个连接)+一些用于其他目的的备用连接一起使用:
$ R --max-connections=192
...
> library(future)
> plan(multisession, workers = 148)
> nbrOfWorkers()
[1] 148
> library(doFuture)
> pids <- foreach(ii = seq_len(nbrOfWorkers())) %dofuture% Sys.getpid()
> length(unique(pids))
[1] 148
future.callr 包不依赖于连接,因此您可以将其用作:
> library(future)
> plan(future.callr::callr, workers = 148)
> nbrOfWorkers()
[1] 148
future.mirai 包不依赖于连接,因此您可以将其用作:
> library(future)
> plan(future.mirai::mirai_multisession, workers = 148)
> nbrOfWorkers()
[1] 148
...如何将 future.mirai 后端与parallelly::makeClusterPSOCK 结合起来?
你不能; future.mirai 后端与 parallelly/parallel 的 PSOCK 集群分开。
PS。针对 Futureverse 的问题可能最好在 https://github.com/HenrikBengtsson/future/discussions/
上提出