我想在群集(大学服务器)上并行运行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
答案 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次。