我试图在 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 个内核的慢速的限制——我想知道“似乎不起作用的多会话”位可能会解决此问题。
如何让每个节点都使用“多会话”计划?