AWS 上的并行处理“所有连接都在使用中”

Mar*_*ler 1 parallel-processing ubuntu r amazon-ec2

我已经能够使用r6a.48xlarge Amazon Web Services实例(192 vCPUs内存1536.00 GiB)和以下R代码同时运行 20 个模型:

setwd('/home/ubuntu/')

library(doParallel)

detectCores()

my.AWS.n.cores <- detectCores()
my.AWS.n.cores <- my.AWS.n.cores - 92
my.AWS.n.cores

registerDoParallel(my.cluster <- makeCluster(my.AWS.n.cores))


folderName <- 'model000222'


files <- list.files(folderName, full.names=TRUE)

start.time <- Sys.time()

foreach(file = files, .errorhandling = "remove") %dopar% {
  source(file)
}

stopCluster(my.cluster)

end.time <- Sys.time()
total.time.c <- end.time-start.time
total.time.c
Run Code Online (Sandbox Code Playgroud)

然而,直到我用这一行减少了to fromR的数量后,上面的代码才运行:cores100192

my.AWS.n.cores <- my.AWS.n.cores - 92
Run Code Online (Sandbox Code Playgroud)

如果我尝试用 all 运行代码,192 vCPUs或者187 vCPUs我得到这个error message

> my.AWS.n.cores <- detectCores()
> my.AWS.n.cores <- my.AWS.n.cores - 5
> my.AWS.n.cores
[1] 187
> 
> registerDoParallel(my.cluster <- makeCluster(my.AWS.n.cores))
Error in socketConnection("localhost", port = port, server = TRUE, blocking = TRUE,  : 
  all connections are in use
Calls: registerDoParallel ... makePSOCKcluster -> newPSOCKnode -> socketConnection
Run Code Online (Sandbox Code Playgroud)

我从来没有见过这个error message,也无法通过互联网搜索找到它。有人可以解释一下吗error message?我不知道为什么我的解决方案有效,也不知道是否存在更好的解决方案。connections我可以轻松确定可以使用的最大数量吗error?我想我可以运行代码将内核数量从 100 增加到 187。

我用下面的行安装了R它。 直到我使用下面的最后一行才找到: 。instancePuTTYRinstanceapt install r-base-core

sudo su
echo "deb http://cran.rstudio.com/bin/linux/ubuntu trusty/"
sudo apt-get update
sudo apt-get install r-base
sudo apt install dos2unix
apt install r-base-core
Run Code Online (Sandbox Code Playgroud)

我使用了这个 AMI:

Ubuntu Server 18.04 LTS (HVM), SSD Volume Type 
Run Code Online (Sandbox Code Playgroud)

编辑

显然,R有一个硬连线限制128 connectionsPSOCK workers显然,如果您愿意重建,您可以手动R增加数量,source但我还没有找到显示如何做到这一点的答案。理想情况下,我可以找到一个答案,展示如何使用Ubuntu和做到这一点AWS。另请参阅之前的相关问题。

makeCluster(多核)中的错误:无法打开连接

R Snow 可以创建的奴隶数量有限制吗?

Hen*_*ikB 6

解释

每个并行 PSOCK 工作线程消耗一个 R 连接。从 R 4.2.1 开始,R 被硬编码为在任何时候仅支持 128 个打开连接。其中三个连接始终处于使用状态(stdin、stdout 和 stderr),剩下 125 个连接可供使用。

要增加此限制,您必须更新常量:

#define NCONNECTIONS 128
Run Code Online (Sandbox Code Playgroud)

src/main/connections.c中,然后从源代码重新构建 R。FWIW,我已经验证它在 Ubuntu 16.04 上至少适用于 16,384 个(https://github.com/HenrikBengtsson/Wishlist-for-R/issues/28#issuecomment-231603035)。

人们之前已经报道过这个问题,并且这些年来这个问题已经在 R-devel 上多次提出。上次增加限制是在 R 2.4.0(2008 年 10 月)中,当时它从 50 增加到 128。有关更多详细信息和讨论,请参阅https://github.com/HenrikBengtsson/Wishlist-for-R/issues/28。我认为值得在 R-devel 上再次讨论这个话题。随着人们获得更多的核心,更多的人会遇到这个问题。

并行包提供了两个函数和,用于查询当前 R 安装的可用连接数和空闲连接数请参阅https://parallelly.futureverse.org/reference/availableConnections.html详细信息和示例。availableConnections()freeConnections()

仅供参考,如果您使用parallelly::makeClusterPSOCK(n)而不是parallel::makeCluster(n),您会收到更丰富的错误消息,而且更快,例如

> cl <- parallelly::makeClusterPSOCK(192)
Error: Cannot create 192 parallel PSOCK nodes. Each node
needs one connection but there are only 124 connections left
out of the maximum 128 available on this R installation
Run Code Online (Sandbox Code Playgroud)

解决方法

通过在后台使用callr包,您可以避免依赖 R 连接进行本地并行处理。实现此目的的最简单方法是将doFuture与future.callr结合使用。在你的例子中,这将是:

> cl <- parallelly::makeClusterPSOCK(192)
Error: Cannot create 192 parallel PSOCK nodes. Each node
needs one connection but there are only 124 connections left
out of the maximum 128 available on this R installation
Run Code Online (Sandbox Code Playgroud)

通过此设置,并行工作线程通过调用者无需R 连接即可运行)启动。每个并行任务都在单独的调用者进程中启动,当任务完成时,并行工作线程将终止。由于并行工作线程没有被重用,因此使用调用者后端会产生额外的开销,但如果并行任务足够长,这仍然应该是处理时间的一小部分。