在群集中的不同节点上并行运行RandomForest

时间:2016-08-30 14:44:54

标签: r parallel-processing cluster-computing random-forest parallel.foreach

我想在群集(大学服务器)上并行运行randomForest,我可以同时保留4个节点,每个节点还包含12个核心。我使用了foreach包描述中提到的foreach和doSNOW包,但是通过使用以下代码,我可以看到所有加载仅在第一个节点上,而对于其他3个节点,没有内存消耗。有人可以指导我如何编辑此代码,以便每个节点的每个核心都可以完成相同的工作,然后我们将它组合到一个林中。

> library("foreach")
> library("doSNOW")
> registerDoSNOW(makeCluster(48, type="SOCK"))

> x <- matrix(runif(500), 100)
> y <- gl(2, 50)

> rf <- foreach(ntree = rep(22, 48), .combine = combine, .packages = "randomForest") %dopar%
+    randomForest(x, y, ntree = ntree)
> rf
Call:
randomForest(x = x, y = y, ntree = ntree)
Type of random forest: classification
Number of trees: 1056

1 个答案:

答案 0 :(得分:3)

要在SOCK集群中的多个节点上启动工作程序,makeCluster的第一个参数应该是节点名称的向量而不是数字。在这种情况下,makeCluster将使用ssh命令在每个指定节点上启动一个worker。

例如,在每个节点上启动12个工作人员&#34; n1&#34;,&#34; n2&#34;,&#34; n3&#34;和&#34; n4&#34 ;,你可以使用:

> nodelist <- rep(c("n1", "n2", "n3", "n4"), each=12)
> cl <- makeCluster(nodelist, type="SOCK")
> registerDoSNOW(cl)

请注意,每个节点名称在nodelist中显示12次,因此nodelist的长度为48。

如果您正在使用批处理排队系统来运行作业,则应获取分配给作业的节点名称列表,而不是在脚本中对其进行硬编码。您通常可以从环境变量中获取该信息,但这取决于您的批处理排队系统。例如,使用Torque,您可以使用以下命令获取节点列表:

> nodelist <- readLines(Sys.getenv("PBS_NODEFILE"))

我更喜欢使用makeMPIcluster创建MPI群集,并在HPC群集上运行并行作业时将其注册到doSNOW,但这种方法对初学者来说可能更难。例如,您必须安装Rmpi软件包,并且必须通过&#34; mpirun&#34;执行R脚本。命令。如果你可以从知识渊博的系统管理员那里获得帮助,那么从长远来看它可能会更好。

另一种方法是使用doMPI并行后端而不是doSNOW,因为doMPI专门设计用于HPC群集。有关详细信息,请参阅doMPI vignette

另请注意,如果在此示例中使用foreach .multicombine=TRUE参数,则会获得更好的性能。这将导致combine函数被调用一次而不是47次。