我正在开发一个集群,并使用该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 以供所有可用节点使用?
编辑:@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