R:通过parallelly::makeClusterPSOCK运行mirai_cluster

问题描述 投票:0回答:1

我的目标是使用 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
结合起来)?

r multiprocessing future hpc r-future
1个回答
0
投票

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::callr”

future.callr 包不依赖于连接,因此您可以将其用作:

> library(future)
> plan(future.callr::callr, workers = 148)
> nbrOfWorkers()
[1] 148

使用“future.mirai::mirai_multisession”

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/

上提出
© www.soinside.com 2019 - 2024. All rights reserved.