我正在将brms::brm_multiple()模型拟合到大型数据集,其中使用该包估算了缺失的数据mice。数据集的大小使得并行处理的使用非常可取。但是,我不清楚如何最好地使用计算资源,因为我不清楚如何brms在核心之间划分估算数据集的采样。
如何选择以下选项以最大限度地有效利用计算资源?
m)chains)cores)假设我天真地(或者为了举例而故意愚蠢地)选择m = 5, chains = 10, cores = 24。因此,需要在 HPC 上保留的 24 个核心之间分配 5 x 10 = 50 个链。如果没有并行处理,这将需要约 50 个时间单位(不包括编译时间)。
我可以想象 的三种并行化策略brms_multiple(),但可能还有其他策略:
场景 1:并行估算数据集,串行关联链
这里,5 个插补中的每一个都分配给它自己的处理器,该处理器串行运行 10 个链。处理时间为 10 个单位(与非并行处理相比,速度提高了 5 倍),但糟糕的规划浪费了 19 个核心 x 10 个时间单位 = 190 个核心时间单位(ctu;= 80% 的预留计算资源)。有效的解决方案是设置cores= m。
场景 2:串行估算数据集,并行关联链
在这里,采样首先获取第一个估算数据集,并在 …
我想for在集群的节点(几台机器)内分配作业(带有循环)。我尝试使用 R 包future来做到这一点。我不知道这是否是最好的方法;我尝试使用foreach该doParallel包,但没有成功。如何判断循环迭代次数何时大于集群节点数?
library(doParallel);
library(doFuture);
#library(future);
registerDoFuture();
workers <- c(rep("129.20.25.61",1), rep("129.20.25.217",1));
cl <- makeClusterPSOCK(workers, revtunnel = TRUE, outfile = "", verbose = FALSE);
plan(cluster, workers = cl)
mu <- 1.0
sigma <- 2.0
for(i in 1:3){
res %<-%{ rnorm(i, mean = mu, sd = sigma)}
print(i);
}
Run Code Online (Sandbox Code Playgroud) 我使用检查点包进行可重复的数据分析。有些计算需要很长时间才能计算,所以我想并行运行它们。然而,当并行运行时,检查点未在工作线程上设置,因此我收到一条错误消息“没有名为 xy 的包”(因为它没有安装在我的默认库目录中)。
我如何确保每个工作人员都使用检查点文件夹中的包版本?我尝试在 foreach 代码中设置 .libPaths 但这似乎不起作用。我还希望在全局范围内设置检查点/libPaths 一次,而不是在每个 foreach 调用中设置一次。
另一种选择可能是更改 .Rprofile 文件,但我不想这样做。
checkpoint::checkpoint("2018-06-01")
library(foreach)
library(doFuture)
library(future)
doFuture::registerDoFuture()
future::plan("multisession")
l <- .libPaths()
# Code to run in parallel does not make much sense of course but I wanted to keep it simple.
res <- foreach::foreach(
x = unique(iris$Species),
lib.path = l
) %dopar% {
.libPaths(lib.path)
stringr::str_c(x, "_")
}
Run Code Online (Sandbox Code Playgroud)
{ 中的错误:任务 2 失败 - “没有名为‘stringr’的包”
我尝试并行化一个简单的函数,该函数将两个数字相加并在库中R使用时打印结果。这是我的代码:mclapplyparallel
library(doParallel)\nt = list(list(1,1),list(2,2),list(3,3))\nf <- function (a,b){\n print(a + b)\n}\nmclapply(t,f)\nRun Code Online (Sandbox Code Playgroud)\n但它返回错误:
\nWarning message in mclapply(t, f):\n\xe2\x80\x9call scheduled cores encountered errors in user code\xe2\x80\x9d\nRun Code Online (Sandbox Code Playgroud)\n[[1]]\n[1] "Error in print(a + b) : argument \\"b\\" is missing, with no default\\n"\nattr(,"class")\n[1] "try-error"\nattr(,"condition")\n<simpleError in print(a + b): argument "b" is missing, with no default>\n\n[[2]]\n[1] "Error in print(a + b) : argument \\"b\\" is missing, with no default\\n"\nattr(,"class")\n[1] "try-error"\nattr(,"condition")\n<simpleError in print(a + b): argument "b" is missing, with …Run Code Online (Sandbox Code Playgroud)