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
的数量后,上面的代码才运行:cores
100
192
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
它。 直到我使用下面的最后一行才找到: 。instance
PuTTY
R
instance
apt 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 connections
。PSOCK workers
显然,如果您愿意重建,您可以手动R
增加数量,source
但我还没有找到显示如何做到这一点的答案。理想情况下,我可以找到一个答案,展示如何使用Ubuntu
和做到这一点AWS
。另请参阅之前的相关问题。
每个并行 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 连接即可运行)启动。每个并行任务都在单独的调用者进程中启动,当任务完成时,并行工作线程将终止。由于并行工作线程没有被重用,因此使用调用者后端会产生额外的开销,但如果并行任务足够长,这仍然应该是处理时间的一小部分。
归档时间: |
|
查看次数: |
710 次 |
最近记录: |