我可以访问一个具有许多节点的大型计算集群,每个节点都有 >16 个内核,运行 Slurm 20.11.3。我想使用furrr::future_pmap()
. 我可以在单个节点上跨多个内核并行化,但我无法找出正确的语法来利用多个节点上的内核。请参阅此相关问题。
这是一个可重现的示例,我创建了一个休眠 5 秒并返回开始时间、结束时间和节点名称的函数。
library(furrr)
# Set up parallel processing
options(mc.cores = 64)
plan(
list(tweak(multicore, workers = 16),
tweak(multicore, workers = 16),
tweak(multicore, workers = 16),
tweak(multicore, workers = 16))
)
fake_fn <- function(x) {
t1 <- Sys.time()
Sys.sleep(x)
t2 <- Sys.time()
hn <- system2('hostname', stdout = TRUE)
data.frame(start=t1, end=t2, hostname=hn)
}
stuff <- data.frame(x = rep(5, 64))
output <- future_pmap_dfr(stuff, function(x) fake_fn(x))
我以salloc --nodes=4 --ntasks=64
交互方式使用并运行上述 R 脚本来运行该作业。
该脚本在大约 20 秒内运行,并为所有行返回相同的主机名,这表明它在一个节点上同时运行 16 次迭代,而不是按预期在 4 个节点上同时运行 64 次迭代。我应该如何更改plan()
语法以便可以利用多个节点?
编辑:我还尝试了其他一些事情:
- 我替换
multicore
为multisession
,但没有看到输出有任何差异。 - 我替换了
plan(list(...))
,plan(cluster(workers = availableWorkers())
但它只是挂起。