使用 futures 在远程节点集群上进行多级并行化

问题描述 投票:0回答:0

我试图在 4 个 linux 工作节点上分配作业,每个节点有 8 个核心。我正在从 Windows 计算机启动作业。

这是我设置集群的方式:

worker_nodes <- c("node-1", "node-2")

ssh_private_key_file <- "C:/user/.ssh/id_rsa"
cl <-
  future::makeClusterPSOCK(
    worker_nodes,
    user = "user",
    rshopts = c(
      "-o", "StrictHostKeyChecking=no",
      "-o", "IdentitiesOnly=yes",
      "-i", ssh_private_key_file
    ),
    rscript = "/usr/bin/Rscript",
    homogeneous = FALSE,
    tries = 5
  )

这似乎工作得很好。如果我打印

cl
对象我得到
Socket cluster with 2 nodes..
.

现在我想定义如何使用

future::plan()
分配作业。我希望每个节点获得相同数量的作业,并且我希望每个节点都使用所有 8 个核心来并行处理作业。

这是我的计划:

future::plan(list(future::tweak(future::cluster, workers = cl), 
          future::tweak(future::multisession, workers = 8)))

现在,如果我使用以下方法创建一些工作:

furrr::future_map(input_values, slow_function)

我只看到一个核心在我的集群节点上使用。

如果我通过复制工作节点来重新创建集群:

worker_nodes <- rep(c("node-1", "node-2"), 8)

然后我看到集群节点上使用了更多的内核,多会话部分似乎被忽略了。

但是与“多会话”配对的第一种方法也应该导致多个 R 进程运行并使用多个内核。

此外,我相信 8 个内核中有 4 个比其他 4 个慢。因此使用“rep worker nodes”方法的计算时间似乎受到较慢的 4 个内核的慢速的限制——我想知道“似乎不起作用的多会话”位可能会解决此问题。

如何让每个节点都使用“多会话”计划?

r future furrr
© www.soinside.com 2019 - 2024. All rights reserved.