【发布时间】:2021-03-07 02:14:47
【问题描述】:
我正在尝试在 4 个节点的集群上运行模拟,每个节点有 40 个内核/80 个线程,并且在运行并行化 foreach 循环时不断遇到 OUT_OF_MEMORY 错误。我很确定这与我正在通过大 tibble params 的行迭代循环这一事实有关。
我已经尝试将params 更改为一个列表并遍历一个列表(希望这在内存上会更容易)但这没有帮助。另外,我尝试使用一个交互器,据我所知,它应该防止 params 被加载到每个线程中(从而防止 OUT_OF_MEMORY 错误),但这也不起作用。我怀疑发生这种情况是因为我正在处理多个节点(并且我读过类似“它们不共享物理内存”之类的内容),但这只是我的猜测。
这是我最近一次尝试的设置方式:
procs <- 2 * as.numeric(Sys.getenv("SLURM_NTASKS"))
itx <- iter(params, by = 'row')
registerDoParallel(procs)
tib <- foreach (i = itx,
.packages=c("tidyverse", "stabledist",
"copula", "VineCopula", "MMDCopula", 'glue')
) %dopar% {
# Grab the variables from each row
alpha <- i[['alpha']]
d <- i[['delta']]
s <- i[['seed']]
a <- i[['mu']] %>% unlist %>% unname
a_name <- nameTmp(a)
time <- i[['time']]
copula <- i[['copula']]
type <- i[['type']]
set.seed(s)
a_j <- rev( 1/(1 + (1:(20*TMax))^(d)) )
X <- Simulate_Lin_Proc(alpha, TMax, a_j, 1)
tibTmp <- f(...) # Function dependent on the parameters (returns 1 row tibble)
return(tibTmp)
}
stopImplicitCluster()
欢迎提出任何建议。
【问题讨论】:
-
看来您使用的是 slurm。您是否确保每个任务都获得足够的内存/默认值是否足够?你知道在你的模拟中你的内存使用率高吗?通常,参数不需要那么多空间(但不知道你的数据,很难说),但你使用
iter的方法绝对是好的。
标签: r foreach doparallel