我正在使用一个集群并使用snowfall
包在5个节点上建立一个套接字集群,每个节点有40个CPU,每个CPU都有以下命令:
> sfInit(parallel=TRUE, cpus = 200, type="SOCK", socketHosts=c("host1", "host2", "host3", "host4", "host5"));
R Version: R version 3.1.0 (2014-04-10)
snowfall 1.84-6 initialized (using snow 0.3-13): parallel execution on 5 CPUs.
当我检查群集报告时,我看到奴隶的负载比预期的要低得多,并且因为它说'并且在5个CPU上并行执行'而感到不安。而不是"并行执行200个CPU"。这仅仅是对CPU的模糊引用,还是每个只运行一个CPU的主机?
编辑:这是一个为什么这会引起我的一个例子,如果我只使用本地机器并指定最大核心数,我有:
> sfInit(parallel=TRUE, type="SOCK", cpus = 40);
snowfall 1.84-6 initialized (using snow 0.3-13): parallel execution on 40 CPUs.
我在单个节点上运行了相同的工作,40个CPU集群,花了1.4分钟,而5个节点,显然是5个CPU集群需要5.22分钟。对我来说,这证实了我怀疑我在5个节点上运行并行操作,但我只打开每个节点上的1个CPU。
我的问题是:如何在所有可用节点上打开所有CPU?
编辑:@SimonG我使用了基础snow
软件包的初始化,我们可以清楚地看到只有5个节点正在启用:
> cl <- makeSOCKcluster(names = c("host1", "host2", "host3", "host4", "host5"), count = 200)
> clusterCall(cl, runif, 3)
[[1]]
[1] 0.9854311 0.5737885 0.8495582
[[2]]
[1] 0.7272693 0.3157248 0.6341732
[[3]]
[1] 0.26411931 0.36189866 0.05373248
[[4]]
[1] 0.3400387 0.7014877 0.6894910
[[5]]
[1] 0.2922941 0.6772769 0.7429913
> stopCluster(cl)
> cl <- makeSOCKcluster(names = rep("localhost", 40), count = 40)
> clusterCall(cl, runif, 3)
[[1]]
[1] 0.6914666 0.7273244 0.8925275
[[2]]
[1] 0.3844729 0.7743824 0.5392220
[[3]]
[1] 0.2989990 0.7256851 0.6390770
[[4]]
[1] 0.07114831 0.74290601 0.57995908
[[5]]
[1] 0.4813375 0.2626619 0.5164171
.
.
.
[[39]]
[1] 0.7912749 0.8831164 0.1374560
[[40]]
[1] 0.2738782 0.4100779 0.0310864
我认为这很清楚。我绝望地尝试了这个:
> cl <- makeSOCKcluster(names = rep(c("host1", "host2", "host3", "host4", "host5"), each = 40), count = 200)
并且可以预见得到:
Error in socketConnection(port = port, server = TRUE, blocking = TRUE, :
all connections are in use
答案 0 :(得分:2)
在仔细阅读snow
文档后,我提出了(部分)解决方案。
我读到只使用分布式R版本可以同时打开128个连接,并且发现它是真的。我可以在每个节点上打开25个CPU,但如果我尝试在每个节点上启动26,则群集将无法启动。以下是需要传递给makeCluster
的主机列表的正确结构:
> library(snow);
> unixHost13 <- list(host = "host1");
> unixHost14 <- list(host = "host2");
> unixHost19 <- list(host = "host3");
> unixHost29 <- list(host = "host4");
> unixHost30 <- list(host = "host5");
> kCPUs <- 25;
> hostList <- c(rep(list(unixHost13), kCPUs), rep(list(unixHost14), kCPUs), rep(list(unixHost19), kCPUs), rep(list(unixHost29), kCPUs), rep(list(unixHost30), kCPUs));
> cl <- makeCluster(hostList, type = "SOCK")
> clusterCall(cl, runif, 3)
[[1]]
[1] 0.08430941 0.64479036 0.90402362
[[2]]
[1] 0.1821656 0.7689981 0.2001639
[[3]]
[1] 0.5917363 0.4461787 0.8000013
.
.
.
[[123]]
[1] 0.6495153 0.6533647 0.2636664
[[124]]
[1] 0.75175580 0.09854553 0.66568129
[[125]]
[1] 0.79336203 0.61924813 0.09473841
我找到了一个引用说明为了建立连接,需要在NCONNECTIONS设置得更高的情况下重建R(参见here)。