【问题标题】:Running RandomForest in parallel on different nodes in a cluster在集群中的不同节点上并行运行 RandomForest
【发布时间】:2017-01-06 22:11:12
【问题描述】:

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

> 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

【问题讨论】:

  • 您是否使用批处理排队系统(例如 Torque、LSF 或 Slurm)来请求四个节点?
  • 下面的答案很好,但我想补充一点,您应该与您的大学集群管理员交谈。他们将能够以最佳方式为您的特定集群提供帮助。

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


【解决方案1】:

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

例如,要在每个节点“n1”、“n2”、“n3”和“n4”上启动 12 个工作器,您可以使用:

> 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"))

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

另一种方法是使用 doMPI 并行后端而不是 doSNOW,因为 doMPI 是专门为在 HPC 集群上使用而设计的。如需更多信息,请参阅doMPI vignette


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

【讨论】:

  • 非常感谢您的详细回复。我正在研究的 HPC 使用 OAR Batch Scheduler。你能告诉我如何获取 OAR 中的节点列表吗?其次,您的建议是使用 Rmpi​​ 而不是 doSNOW?如果我使用 Rmpi​​ 包,那么运行 randomForest 的代码将是相同的,还是我必须按照 Rmpi​​ 包修改它?
  • @Newbie 我并不是建议您使用纯 Rmpi​​。我建议您可以将 doSNOW 与 MPI 集群(使用 makeMPIcluster 函数创建)一起使用,或者您可以使用 doMPI 而不是 doSNOW。这两个选项都需要 Rmpi​​,但您不要直接使用它。
  • @Newbie 尝试使用 OAR_NODEFILE 环境变量。文档表明它就像 PBS_NODEFILE 一样工作,在这种情况下,您可以使用与我的答案中列出的 Torque 示例基本相同的代码。
  • 我正在这样做,但在创建集群时出现以下错误:Bad owner or permissions on /home/users/tony/.ssh/config
  • @Newbie snow 使用 ssh 启动远程工作者,使用 ssh 时文件权限是个大问题。您可能必须使用“chmod go-rwx /home/users/tony/.ssh/config”之类的命令删除“config”上的任何“组”和“其他”权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多