如何高效并行brms::brm?

2024-03-07

问题总结

我正在装修一个brms::brm_multiple()模型到一个大型数据集,其中缺失的数据已使用mice包裹。数据集的大小使得并行处理的使用非常可取。但是,我不清楚如何最好地利用计算资源,因为我不清楚如何brms在核心之间划分估算数据集的采样。

如何选择以下选项以最大限度地有效利用计算资源?

  • 插补数 (m)
  • 链数(chains)
  • 核心数量(cores)

概念示例

假设我天真地(或者为了举例而故意愚蠢地)选择m = 5, chains = 10, cores = 24。因此,需要在 HPC 上保留的 24 个核心之间分配 5 x 10 = 50 个链。如果没有并行处理,这将需要大约 50 个时间单位(不包括编译时间)。

我可以想象三种并行化策略brms_multiple(),但可能还有其他:

场景一:并行估算数据集,串行关联链

这里,5 个插补中的每一个都分配给它自己的处理器,该处理器串行运行 10 个链。处理时间为 10 个单位(与非并行处理相比,速度提高了 5 倍),但糟糕的规划浪费了 19 个核心 x 10 个时间单位 = 190 个核心时间单位(ctu;= 80% 的预留计算资源)。有效的解决方案是设置cores = m.

场景2:串行推算数据集,并行关联链

在这里,采样首先获取第一个估算数据集,并在 10 个不同核心上运行该数据集的一个链。然后对其余四个估算数据集重复此操作。该处理需要 5 个时间单位(比串行处理速度提高 10 倍,比场景 1 提高 2 倍)。然而,这里的计算资源也被浪费了:14 个核心 x 5 个时间单位 = 70 ctu。有效的解决方案是设置cores = chains

场景3:混战,其中每个核心在可用时承担待定的插补/链组合,直到所有核心都被处理为止。

此处,采样首先分配所有 24 个核心,每个核心分配给 50 个待处理链之一。完成迭代后,将处理第二批 24 条链,使处理的链总数达到 48 条。但现在只有 2 条链待处理,22 个核心闲置 1 个时间单位。总处理时间为3个时间单位,浪费的计算资源为22ctu。有效的解决方案是设置cores到多个m x chains.

最小可重复示例

此代码使用修改自以下示例的示例来比较计算时间brms小插图 https://cran.r-project.org/web/packages/brms/vignettes/brms_missings.html。这里我们要设置m = 10, chains= 6,并且cores= 4。这使得总共需要处理 60 个链。在这些条件下,我预计速度改进(相对于串行处理)如下*:

  • 场景 1:60/(6 条链 x 天花板(10 m / 4 芯)) = 3.3x
  • 场景2:60/(天花板(6条链/4芯)x 10 m)= 3.0x
  • 场景 3:60/天花板((6 条链 x 10 m)/ 4 核)= 4.0x

*(使用上限/向上取整是因为链不能在核心之间细分)

library(brms)
library(mice)
library(tictoc)  # convenience functions for timing

# Load data
data("nhanes", package = "mice")

# There are 10 imputations x 6 chains = 60 total chains to be processed
imp <- mice(nhanes, m = 10, print = FALSE, seed = 234023)

# Fit the model first to get compilation out of the way
fit_base <- brm_multiple(bmi ~ age*chl, data = imp, chains = 6,
                         iter = 10000, warmup = 2000)

# Use update() function to avoid re-compiling time
# Serial processing (127 sec on my machine)
tic()  # start timing
fit_serial <- update(fit_base, .~., cores = 1L)
t_serial <- toc()  # stop timing
t_serial <- diff(unlist(t_serial)[1:2])  # calculate seconds elapsed

# Parallel processing with 3 cores (82 sec)
tic()
fit_parallel <- update(fit_base, .~., cores = 4L)
t_parallel <- toc()
t_parallel <- diff(unlist(t_parallel)[1:2])  # calculate seconds elapsed

# Calculate speed up ratio
t_serial/t_parallel  # 1.5x

显然我错过了一些东西。我无法用这种方法区分场景。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何高效并行brms::brm? 的相关文章

  • 使填充的值成为ggplot2中的实际填充

    有没有办法让填充的值 标签 成为填充本身 例如 在堆积条形图中 我有 require ggplot2 big votes movies movies movies votes gt 100000 p ggplot big votes mov
  • 闪亮的如何阻止用户访问选项卡?

    我需要阻止用户访问其他选项卡 直到完成某些操作 在这个可重现的示例中 我想阻止用户访问Tab 2直到他按下按钮 该应用程序如下所示 这是该应用程序的代码 library shiny ui lt shinyUI navbarPage tabP
  • 如何避免循环

    大家好 我是 R 新手 我有两个面板数据文件 其中包含 id date 和 ret 列 文件 A 的数据比文件 B 多得多 但我主要处理文件 B 数据 id 和 date 的组合是唯一标识符 有没有一种优雅的方式来查找 B 中的每个 id
  • 无法使用include_graphics在Rmarkdown中插入png(错误:文件不是PNG格式)

    这个错误很奇怪 当我编织文档时 出现以下错误 Quitting from lines 42 43 sigminer doc Rmd Error in png readPNG path native TRUE info TRUE file i
  • 使用 Visual Studio 构建 R 包 (C API)

    我正在尝试使用 Visual Studio 构建一个简单的 R 包 这是我的代码 include
  • 通过变量分割 data.frame [重复]

    这个问题在这里已经有答案了 我将多个主题的数据存储在一个 CSV 文件中 导入 CSV 文件后 我想将每个参与者的数据拆分到自己的 data frame 中 更确切地说 我想采用下面的示例数据 并创建三个新的 data frames 每个
  • 列表列中的设置操作

    我正在尝试做集合运算在存储在列表列中的向量之间 例如this https stackoverflow com questions 38712196 text file to dataframe with a list column DT l
  • 与 data.table 合并时防止重复列

    我有两个数据表 它们的列名部分相似 dfA lt read table text A B C D E F G iso year matchcode 1 0 1 1 1 0 1 0 NLD 2010 NLD2010 2 1 0 0 0 1 0
  • 自动化 RStudio 处理 RMarkdown?

    我有一个 RMarkdown 文件 用于生成漂亮的 HTML 报告 问题是 我希望能够自动化它 以便它可以在无头服务器上运行 因此 不会有人启动 Rstudio 并按下 knithtml 按钮 而且 Rstudio 似乎正在做很多额外的魔法
  • 不使用apply函数对data.table的每一行进行操作的方法

    我在下面写了一个简单的函数 mcs lt function v ifelse sum diff sort v gt 6 gt 0 NA sd v 它应该采用一个向量 对其进行排序 然后检查每个连续差异中是否存在大于 6 的差异 如果差值大于
  • 尝试通过列表递归时,在 R 中出现错误“递归索引在级别 2 失败”

    当我尝试递归遍历图形顶点列表 将它们的值与列表中的一组颜色进行匹配时 出现错误 递归索引在级别 2 失败 我的颜色列表如下 colrs lt list l blue c red n gray50 然后我有一个 igraph 中的顶点列表vs
  • 如何在 R 中执行随机森林/交叉验证

    我无法找到对我尝试生成的回归随机森林模型执行交叉验证的方法 因此 我有一个数据集 其中包含 1664 个解释变量 不同的化学性质 和一个响应变量 保留时间 我正在尝试生成一个回归随机森林模型 以便能够预测给定保留时间的物质的化学性质 ID
  • dplyr :过滤一系列行(在一列中)

    虚拟数据框 id family lt c 1 1 2 2 3 3 people lt c male female male female male children dataset lt data frame id family peopl
  • 将阿拉伯文本分配给 R 变量

    R 无法正确显示阿拉伯文本 当我使用阿拉伯语时 我得到了非常奇怪的东西 这是一个屏幕截图 问题是我想创建一个带有阿拉伯文本的词云 我需要首先解决这个问题 R 版本 R 2 15 2 GUI 1 53 Leopard 版本 64 位 6335
  • ggmap 错误:GeomRasterAnn 是使用不兼容版本的 ggproto 构建的

    我正在使用 ggmap 并收到以下错误 Error GeomRasterAnn was built with an incompatible version of ggproto Please reinstall the package t
  • 从 Cox PH 模型预测概率

    我正在尝试使用 cox 模型来预测时间 称为停止 3 后失败的概率 bladder1 lt bladder bladder enum lt 5 coxmodel coxph Surv stop event rx size number cl
  • left_join 表示列不存在,即使它存在

    我想用两个不同的变量 tp join 连接两个数据框 出现错误 表示无法在第二个数据帧中找到变量 但是当我运行函数 colnames 时 会显示列名称 为什么会这样呢 df new lt left join master settlemen
  • 用于更改向量中元素顺序的闪亮小部件

    在很多网站上 您都有一个拖放界面来更改列表中元素的顺序 我正在寻找类似的东西闪亮 我希望用户能够拖放列表中的元素 通过更改顺序来更改优先级 现在我有一个滥用的解决方案selectizeInput 这是可行的 但当选择列表变得更大时 它很快就
  • 将函数应用于每个列组合

    我有一个数据框n列并希望对每个列应用一个函数组合列 这与如何cor 函数将数据帧作为输入并生成相关矩阵作为输出 例如 X lt data frame A rnorm 100 B rnorm 100 C rnorm 100 cor X 这将生
  • 在多面图中用 N 注释 x 轴

    我正在尝试生成一些按治疗条件和访问次数细分的数字结果的箱线图 每个框中的观察次数都放在图下方 并且也标记了访问次数 这里有一些虚假数据可以用来说明 我举了两个我尝试过但不太有效的例子 library ggplot2 library plyr

随机推荐