多集群并行方法中启动时的变量范围

2024-02-19

我正在尝试弄清楚如何将函数和包传递给boot()运行并行计算时的函数。在循环内加载包或定义函数似乎非常昂贵。这foreach()我经常用于其他并行任务的函数有一个 .packages 和 .export 参数来处理这个问题(请参阅此所以问题 https://stackoverflow.com/questions/4765256/could-not-find-function-inside-foreach-loop)以一种很好的方式,但我不知道如何使用引导包来做到这一点。

下面是一个毫无意义的例子,展示了切换到并行时会发生什么:

library(boot)
myMean <- function(x) mean(x)
meaninglessTest <- function(x, i){
  return(myMean(x[i]))
}

x <- runif(1000)

bootTest <- function(){
  out <- boot(data=x, statistic=meaninglessTest, R=10000, parallel="snow", ncpus=4)
  return(boot.ci(out, type="perc"))
}

bootTest()

抱怨(如预期)找不到myMean.

边注:运行此示例时,它的运行速度比单核慢,可能是因为将这个简单的任务拆分到多个核上比实际任务更耗时。为什么默认情况下不分成均匀的作业批次R/ncpus- 这不是默认行为有什么原因吗?

更新在旁注:正如 Steve Weston 所指出的, boot() 使用的 parLapply 实际上将作业分割成均匀的批次/块。该函数是 clusterApply 的简洁包装:

docall(c, clusterApply(cl, splitList(x, length(cl)), lapply, 
    fun, ...))

我有点惊讶的是,当我扩大重复次数时,这并没有更好的性能:

> library(boot)
> set.seed(10)
> x <- runif(1000)
> 
> Reps <- 10^4
> start_time <- Sys.time()
> res <- boot(data=x, statistic=function(x, i) mean(x[i]), 
+             R=Reps, parallel="no")
> Sys.time()-start_time
Time difference of 0.52335 secs
> 
> start_time <- Sys.time()
> res <- boot(data=x, statistic=function(x, i) mean(x[i]), 
+             R=Reps, parallel="snow", ncpus=4)
> Sys.time()-start_time
Time difference of 3.539357 secs
> 
> Reps <- 10^5
> start_time <- Sys.time()
> res <- boot(data=x, statistic=function(x, i) mean(x[i]), 
+             R=Reps, parallel="no")
> Sys.time()-start_time
Time difference of 5.749831 secs
> 
> start_time <- Sys.time()
> res <- boot(data=x, statistic=function(x, i) mean(x[i]), 
+             R=Reps, parallel="snow", ncpus=4)
> Sys.time()-start_time
Time difference of 23.06837 secs

我希望这只是由于非常简单的均值函数,并且更复杂的情况表现得更好。我必须承认,我觉得这有点令人不安,因为在 10.000 和 100.000 的情况下,集群初始化时间应该相同,但绝对时间差增加,并且 4 核版本需要更长的时间 5 倍。我想这一定是列表合并的结果,因为我找不到任何其他解释。


如果要并行执行的函数(meaninglessTest在这种情况下)有额外的依赖项(例如myMean),标准解决方案是通过以下方式将这些依赖项导出到集群clusterExport功能。这需要创建一个集群对象并将其传递给boot通过“cl”参数:

library(boot)
library(parallel)
myMean <- function(x) mean(x)
meaninglessTest <- function(x, i){
  return(myMean(x[i]))
}
cl <- makePSOCKcluster(4)
clusterExport(cl, 'myMean')

x <- runif(1000)

bootTest <- function() {
  out <- boot(data=x, statistic=meaninglessTest, R=10000,
              parallel="snow", ncpus=4, cl=cl)
  return(boot.ci(out, type="perc"))
}

bootTest()
stopCluster(cl)

请注意,一旦集群工作人员被初始化,它们就可以被使用boot多次并且不需要重新初始化,所以它并没有那么昂贵。

要在集群工作人员上加载包,您可以使用clusterEvalQ:

clusterEvalQ(cl, library(randomForest))

这很好也很简单,但是对于更复杂的工作初始化,我通常创建一个“worker init”函数并通过以下方式执行它clusterCall这非常适合对每个工作人员执行一次功能。

至于你的旁注,性能很差,因为正如你所说,统计功能所做的工作很少,但我不确定为什么你认为工作没有在工作人员之间平均分配。这parLapply在这种情况下,函数用于并行执行工作,并且它确实均匀且高效地分割了工作,但这并不能保证比使用顺序运行更好的性能lapply。但也许我误解了你的问题。

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

多集群并行方法中启动时的变量范围 的相关文章

  • 更改 pander 中的默认对齐方式 (pandoc.table)

    我目前正在切换到pander对于我的大部分时间knitr markdown格式化 因为它提供了如此出色的pandoc支持 我不太满意的一件事是默认的居中对齐 营销人员可能会喜欢它 但对于技术报告来说这是一个可怕的事情 使用的最佳选择Hmis
  • 使用 ggplot 构面时增加闪亮的绘图大小

    有没有办法增加绘图窗口的大小shiny取决于在一个中使用的面的数量ggplot图 也许使用垂直滚动 例如 使用下面的示例 当输入为 A 有三个方面 情节看起来不错 当选项 B 选择绘图数量会增加 但绘图窗口保持相同大小 导致绘图太小 是否有
  • 按不规则时间间隔对数据进行分组求和(R语言)

    我正在看这里的 stackoverflow 帖子 R 计算一组内的观察次数 https stackoverflow com questions 65366412 r count number of observations within a
  • 如何绘制每条线之间具有特定距离的图形

    实际上 我尝试绘制一个图形 但它将所有列 线 放在一起并显示 因此它不具有代表性 我尝试制作模拟数据并向您展示我如何绘制它 并向您展示我想要的内容 我不知道如何制作像下面所示的示例的数据 但我在这里做了什么 set seed 1 M lt
  • R中整数类和数字类有什么区别

    我想先说我是一个绝对的编程初学者 所以请原谅这个问题是多么基本 我试图更好地理解 R 中的 原子 类 也许这适用于一般编程中的类 我理解字符 逻辑和复杂数据类之间的区别 但我正在努力寻找数字类和整数类之间的根本区别 假设我有一个简单的向量x
  • 在 igraph 中为社区分配颜色

    我在 igraph 中使用 fastgreedy community 检测算法在 R 中生成社区 代码返回 12 个社区 但是在绘图时很难识别它们 因为它返回的图的颜色数量有限 我怎样才能用十二种不同的颜色绘制这个图表 l2 lt layo
  • 如何定义“f_n-chi-square”函数并使用“uniroot”求置信区间?

    I want to get a 95 confidence interval for the following question 我已经写了函数f n在我的 R 代码中 我首先使用 Normal 随机采样 100 个样本 然后定义函数h
  • R - 与 SpatialPolygonsDataFrame 对象相交的 SpatialLinesDataFrame 列表的嵌套循环

    我有一系列需要完成的步骤SpatialLinesDataFrame 此处的 线 基于对象与多特征中各个特征的关系SpatialPolygonsDataFrame 多边形 对象 简而言之 每个线列表元素源自单个面要素内部 并且可能会也可能不会
  • 使用大矩阵操作

    我必须使用 big matrix 对象 并且无法计算某些函数 让我们考虑以下大矩阵 create big matrix object x lt as big matrix matrix sample 1 10 20 replace TRUE
  • 获取函数的命名空间

    我正在开发一个包 我希望在其中向对象添加编辑历史记录 该包允许其他包注册用于编辑对象的函数 我正在寻找一种方法来记录注册用于编辑的函数的包的版本 问题是 给定一个函数 如何从导出的位置获取包 我的想法是调查它的搜索路径 但是search 仅
  • 如何添加链接以从我的 R闪亮应用程序在新窗口中打开 pdf 文件?

    我可以使用 a 从我的 Shiny 应用程序添加到外部站点的超链接 a google href http www google com 但如何创建一个链接来打开 pdf 或类似 文件 看起来应该很简单 但我找不到任何例子 我的问题与此类似
  • randomForest 包在删除一个预测类时的奇怪行为

    我正在运行一个随机森林模型 它产生的结果从统计角度来看对我来说完全没有意义 因此我确信有些东西mustrandomForest 包的代码出现错误 至少在模型的本次迭代中 预测 左侧变量是具有 3 种可能结果的政党 ID 民主党 独立党 共和
  • R、Rcpp 与 Armadillo 中矩阵 rowSums() 与 colSums() 的效率

    背景 来自 R 编程 我正在扩展到 C C 形式的编译代码Rcpp 作为循环交换 以及一般的 C C 效果的实践练习 我实现了 R 的等效项rowSums and colSums 矩阵的函数Rcpp 我知道它们以 Rcpp 糖的形式存在 并
  • 如何在 R 中合并同名列表中的数据框?

    我有一个包含很多数据框的列表 如果它们具有相同的名称 我想合并它们 即合并所有具有相同名称 a 和 b 的数据框 像这样 a lt aaaaa b lt bbbbb c lt ccccc g lt list df1 lt data fram
  • 在 R 传单中添加不透明度滑块

    如何在 R leaflet 应用程序中添加滑块来控制特定图层的不透明度 对于这个应用程序 我不想使用闪亮 这里建议 在 R 传单应用程序中添加滑块 https stackoverflow com questions 37682619 add
  • R - 计算 bin 中特定值的数量

    我有一个如下所示的数据框 df Value lt c 1 1 0 2 1 3 4 0 0 1 2 0 3 0 4 5 2 3 0 6 Sl lt c 1 20 df lt data frame Sl Value gt df Sl Value
  • 列出 R 数据文件的内容而不加载

    我有时用print load myDataFile RData 当我加载数据文件时列出它的内容 有没有办法列出内容而不加载数据文件中包含的对象 我认为如果不加载对象就无法做到这一点 解决方案可能是使用包装器将 R 对象保存到save 该函数
  • 正态分布平均值的贝叶斯推理玩具 R 代码 [降雪量数据]

    我有一些降雪观测 x lt c 98 044 107 696 146 050 102 870 131 318 170 434 84 836 154 686 162 814 101 854 103 378 16 256 我被告知它遵循正态分布
  • R 闪亮仪表板中的动态重复条件面板

    我正在尝试创建一个动态条件面板 所以我的条件如下 在用户界面中输入 selectInput inpt Input Number seq 1 50 1 selectize FALSE 我的条件面板 UI 输入是 conditionalPane
  • 实现 XGboost 自定义目标函数

    我正在尝试使用 XGboost 实现自定义目标函数 在 R 中 但我也使用 python 所以有关 python 的任何反馈也很好 我创建了一个返回梯度和粗麻布的函数 它工作正常 但是当我尝试运行 xgb train 时它不起作用 然后 我

随机推荐

  • 我可以将我自己的 Python 类与 numpy 或其他矩阵库一起使用吗?

    我希望能够使用 Python 类作为元素进行矩阵运算 在本例中 是一个简单的伽罗瓦域 http en wikipedia org wiki Galois field执行 它实现了必要的 add mul sub etc 起初 我认为这应该可以
  • Javascript:iFrame 中的事件

    我正在建造一个WYISWYG编辑器与iframe with designMode on 问题是我无法在 Firefox 和 Opera 中的 iframe 上使用任何事件 IE 未经测试 例如我想跟踪 onkeyup 事件 document
  • 如何在 python 中使用带有可选字符的正则表达式?

    假设我有一个字符串 3434 35353 和另一个字符串 3593 如何创建一个能够匹配两者的正则表达式 而无需在另一个失败时将模式设置为其他内容 我知道 d 将匹配3593 但它对3434 35353 but d d 只会匹配带小数的那个
  • 无法在 GCP AI Platform 笔记本上安装 Jupyterlab 扩展

    我在安装 Jupyterlab 扩展时开始遇到以前从未遇到过的问题 安装 Jupyterlab 的新扩展后 我无法构建 我正在使用 GCP AI Platform Notebooks 运行 Jupyterlab 我在 Debian 10 上
  • socket.gaierror: [Errno -2] 名称或服务未知

    我是套接字编程的新手 以下程序是一个从服务器请求文件的客户端程序 但我收到如下所示的错误 我的输入是 GET index html 代码是 谁能帮我解决这个错误 usr bin env python import httplib impor
  • R 可以将表情符号字符转换为对应的文本吗?

    在我昨天的提问中 R 可以读取 html 编码的表情符号字符吗 https stackoverflow com questions 48142634 can r read html encoded emoji characters user
  • jQuery - 使用 .val() 函数检测值变化

    我们都知道使用val 不会触发change事件 所以我们也使用 trigger change 在 后面val 但问题是有人写了val 没有与trigger 这是一个外部文件 我无法编辑它 那么 如何通过如下代码检测值变化 elem on c
  • 多房间预订的数据库设计:一对多

    主要实体 客户 客人 预订 房间分配 我想实现一个多房间预订数据库设计 首先我想先解释一下这个概念 The Client是获得预订的人 The Client一次只能有 1 个预订 The Client可以预订多个房间 The Guest是被
  • 确定最后一个文件块

    我正在尝试为大文件设置通过休息上传的文件 下面的函数负责分块 但我需要能够识别最后一个块 因为我的其余调用更改为 finishUpload 以便提交保存 现在我只能弄清楚 blob 何时为空 但我无法弄清楚如何确定 blob 为空之前的最后
  • python del 与 pandas drop

    我知道这可能是老争论了 但出于pandas drop and python del哪个函数在大数据集上的性能更好 我正在使用机器学习学习python 3并且不确定该使用哪一个 我的数据在pandas数据帧格式 但python del函数在b
  • 无法与Android自定义对话框交互

    好吧 请耐心听我说 因为我还没有那么多地使用自定义对话框 或者根本没有 Android 编程 而且我确信我犯了一个愚蠢的初学者错误 因此 我有一个简单的掷骰子应用程序 我试图将其合并到我现有的应用程序中 但我想将其本质上作为弹出窗口 到目前
  • 动态添加到horizo​​ntalscrollview

    我遵循了一些在线教程 向您展示如何使用多个 xml 文件创建静态水平滚动视图 然而 我希望能够从数据库中获取内容 用内容填充一个新视图 来自库存 xml 布局 然后将其添加到水平滚动视图中 是否有任何教程向您展示如何将动态视图添加到水平滚动
  • Three.js 将对象附加到骨骼

    有什么方法可以将网格连接到骨骼上吗 例如 我加载动画 js 角色 并且想将武器附加到它的手上 可以对 Bone 和 Object3D 原型进行一些简单的修改 由于骨骼继承自 Object3D 因此它们可能有子级 因此我们可以轻松地将网格添加
  • 是否可以通过编程方式运行 Simulink 模型并测量其状态?

    我希望为现有 Simulink 模型设置一个测试集 理想情况下 我可以完全控制模型 明确地步进并测量模型中任何总线上任何信号的状态 正如可能已经收集到的 这是该模型的单元测试系统的前身 因此 我不能真正证明更改模型以适应测试是合理的 测试必
  • 放大镜显示 UIWindow 后面

    我们有一个带有汉堡菜单导航的应用程序 菜单本身是一个位于键窗口后面的窗口 当用户长按一个uitextfield并调出放大镜时 放大镜会显示后面UIWindow的内容 有没有人有任何想法 Video https youtu be CvlLaF
  • fileUpload 在使用 JSF 2.2 的 PrimeFaces 3.5 中不会触发事件

    我无法在 PrimeFaces 3 5 上使用 fileUpload 组件来触发该事件 我读过很多关于该主题的帖子并遵循了那里的建议 但仍然不起作用 我尝试了所有模式 简单 自动 高级 但没有成功 如果我使用 JSF 规范中的标准 inpu
  • 实体框架最佳实践:哪一层应该调用 SaveChanges()?

    对于一个干净的数据模型 我会来回讨论这个 以审批工作流程为例 假设在我的 Web 应用程序中 我有一个页面 可让用户标记MyEntityObject需要批准 MyEntityObject有一些控制其审批工作流程的属性 因此我有一个通用的实用
  • swift 中的 C 数组内存释放

    var cpuInfo processor info array t nil var numCpuInfo mach msg type number t 0 var coresTotalUsage Float 0 0 var numCPUs
  • 缺少对 Nexus 的 PUT 的请求实体响应

    我正在尝试模拟发布到我的 Nexus 存储库的 Maven 工件 试图了解为什么我的 gradle 构建失败 I try curl u me secret X PUT T my artifact H Content Type maven a
  • 多集群并行方法中启动时的变量范围

    我正在尝试弄清楚如何将函数和包传递给boot 运行并行计算时的函数 在循环内加载包或定义函数似乎非常昂贵 这foreach 我经常用于其他并行任务的函数有一个 packages 和 export 参数来处理这个问题 请参阅此所以问题 htt