【发布时间】:2022-02-04 08:40:27
【问题描述】:
我可以访问一个包含许多节点的大型计算集群,每个节点都有 >16 个内核,运行 Slurm 20.11.3。我想使用furrr::future_pmap() 并行运行作业。我可以在单个节点上跨多个内核并行化,但我无法找出正确的语法来利用多个节点上的内核。看到这个related question。
这是一个可重现的示例,我创建了一个休眠 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() 语法以便我可以利用多个节点?
edit:我还尝试了其他一些方法:
- 我将
multicore替换为multisession,但没有发现输出有任何差异。 - 我将
plan(list(...))替换为plan(cluster(workers = availableWorkers()),但它只是挂起。
【问题讨论】: