R 为群集上的所有节点启用所有CPU:snow/snowfall包

R 为群集上的所有节点启用所有CPU:snow/snowfall包,r,parallel-processing,cpu,snow,snowfall,R,Parallel Processing,Cpu,Snow,Snowfall,我正在处理一个集群,并使用snowfall包在5个节点上建立一个套接字集群,每个节点有40个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 (usi

我正在处理一个集群,并使用
snowfall
包在5个节点上建立一个套接字集群,每个节点有40个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

EDIT:@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

在彻底阅读了
snow
文档之后,我提出了一个(部分)解决方案

我读到分布式R版本一次只能打开128个连接,并且发现这是真的。我可以在每个节点上打开25个CPU,但如果我尝试在每个节点上启动26个CPU,集群将无法启动。以下是需要传递给
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
>库(雪);
>unixHost13 unixHost14 unixHost19 unixHost29 unixHost30 kCPUs主机列表cl 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

我发现一个参考文献说,为了建立连接,需要重新构建R,并将NCONNECTIONS设置得更高(请参阅)

关于这一点的一些想法:(1.
snowfall
将每个默认值可自由使用的CPU数量限制为32个。有一个命令(
sfSetMaxCPUs
)可以更改此设置。(2.)为了测试集群是否工作,您使用的示例作业可能不充分。作业在一台机器上运行很短时间。实际上,我们可以合理地假设主机之间的通信不会在这里保存任何内容。据我所知,您担心
cpu
参数可能不起作用,从而导致大量的
socketHosts
。您应该制定一个CPU密集度合理、内存和硬盘占用率较低的作业,从而更彻底地对其进行基准测试。然后尝试不同的组合(一台主机、两台主机……2个CPU、4、8、16……)。这将给你更好的判断你的集群正在工作的基础。否则,很难判断集群或任务的性能成本(可能过于简单或提出错误的要求,从而提高并行计算的成本)
 Error in socketConnection(port = port, server = TRUE, blocking = TRUE,  : 
   all connections are in use
> 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