【问题标题】:Detect Cores from Multiple Nodes从多个节点检测核心
【发布时间】:2018-03-15 06:21:33
【问题描述】:

我在 R 中有一个脚本,它利用了 doParallel 包和并行化的 foreach 函数。我目前正在使用detectCores() 命令的变体注册我的集群,该命令运行良好,因为我使用的机器有 32 个内核。

我的问题是,如果我可以通过多台 Linux 机器访问 HPC 资源,是否可以从多台机器上 detectCores() 并在单个 foreach 调用中实现它们?

例如,如果我提交我的 HPC 作业以使其使用两个节点,是否可以让 detectCores() 函数生成 64 而不是 32 的值?

【问题讨论】:

  • 我不确定我是否完全理解您在寻找什么。您是否在问如何设置 R 工作人员集群,以便它们分布在多台机器上,并且某些机器将运行多个工作人员?这可以使用parallel::makeCluster() 来完成。或者您是在问如何使用detectCores() 来查询您的不同机器有多少个内核?
  • 是的,我想使用多台机器,每台机器上有多个工人。如何在不使用某些版本的 MPI(Rmpi、pbdMPI 等)的情况下使用 parallel::makeCluster() 函数来做到这一点?在我自己的实验中,我发现如果我创建一个集群,其指定的内核数量多于我机器上物理可用的内核数量,那么模拟速度会大大降低。如何为多台机器执行makeCluster(),如何确保我在每台机器上使用正确数量的内核?
  • 例如,parallel::makeCluster(c("n1", "n1", "n1" "n2", "n3")) 将建立一个 (PSOCK) 集群,其中机器 n1 上的 3 个工作人员、n2 上的 1 个工作人员和 n3 上的 1 个工作人员。
  • 这是有道理的。所以理论上我可以像parallel::makeCluster(c(rep("n1",detectCores()), rep("n2", detectCores()), rep("n3", detectCores())), type = "PSOCK") 命令一样使用?当然,假设每个节点具有相同数量的核心。非常感谢您的帮助。
  • @amelcher 有没有办法使用 makeCluster(),然后使用 detectCores() 测试集群上总共有多少个内核可用?我有一个脚本,它最初是为具有多个内核的服务器编写的(使用 mclapply() ),并且希望在高性能计算集群上使用它,并尽可能地进行少量更改。

标签: r hpc parallel.foreach doparallel


【解决方案1】:

顶帖cmets中的示例总结解决方案:

library("parallel")

find_workers <- function(nodes) {
  nodes <- unique(nodes)
  cl <- makeCluster(nodes)
  on.exit(stopCluster(cl))

  ns <- clusterCall(cl, fun = detectCores)
  rep(nodes, times = ns)
}

workers <- find_workers(c("n1", "n2", "n3"))
cl <- makeCluster(workers)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-03
    • 2018-10-29
    • 2022-01-08
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多