future.apply–并行化任何基r apply函数

6月22日,二千零一十八
通过

(本文首次发表于 乔特尔,并对 188bet appR博主

0%到100%利用率
得到计算??

未来应用1.0.0-使用Futures对并行元素应用函数-是在克兰。有了这个里程碑版本,全部的*BASE R APPLY函数现在有了相应的未来化实现。这比以往任何时候都更容易将现有的应用(),,LAPP(),,MpApple(),…代码–只是提前准备未来的未来应用调用需要很长时间才能完成。就是这样!默认为顺序处理,但使用计划(多进程)它将并行运行。

表:中所有未来的函数未来应用包裹。每个函数采用与相应函数相同的参数基础函数执行。

功能 描述
未来的未来应用() 在数组边距上应用函数
未来的未来LAPP() 对列表或向量应用函数
未来的未来SpPayy() ——“-
未来的未来VAPY() ——“-
未来的未来复制() ——“-
未来的未来MpApple() 将函数应用于多个列表或向量参数
未来的未来地图() ——“-
未来的未来EpApple() 对环境中的值应用函数
未来的未来TPUP() 对不规则数组应用函数

* 未来的未来RAPYY()–递归地将一个函数应用到一个列表–还没有实现。

激励性的例子

平行包中有一个示例?聚类应用–演示如何并行执行引导模拟。经过一些小的修改,以澄清步骤,如下所示:

library(parallel)library(boot)run1<-function(…)library(boot)cd4.rg<-function(data,MLE)质量::mvrnorm(nrow(data),MLE $ M,MLE$V)CD4.MLE<-列表(M=colmeans(CD4),v=var(cd4))引导(cd4,更正,r=500,SIM =参数化,ran.gen=cd4.rg,mle=cd4.mle)cl<-使用四个coresclustersetrangstream(cl,123)cd4.boot<-do.call(c,口头申请,1:4,run1))boot.ci(cd4.boot,类型=C(“标准”,““基本”,““佩里”),CONF=0.9,H=ATANH,hinv=tanh)叠梁(cl)

脚本定义了一个函数Run1()产生500个引导程序样本,然后它调用这个函数四次,将四个复制的样本合并为一个CD4引导,最后它使用引导程序()总结结果。

相应的顺序实现如下所示:

library(boot)run1<-function(…)cd4.rg<-function(data,MLE)质量::mvrnorm(nrow(data),MLE $ M,MLE$V)CD4.MLE<-列表(M=colmeans(CD4),v=var(cd4))引导(cd4,更正,r=500,SIM =参数化,ran.gen=cd4.rg,mle=cd4.mle)set.seed(123)cd4.boot<-do.call(c,拉普里(1:4,run1))boot.ci(cd4.boot,类型=C(“标准”,““基本”,““佩里”),CONF=0.9,H=ATANH,hinv =双曲正切)

我们注意到关于这两个代码片段的一些事情。金宝搏网址首先,在并行代码中,有两个库(引导)电话;一个在主代码中,一个在Run1()功能。这样做的原因是为了确保靴子包裹也被并行连接,后台R会话时间Run1()在那里被称为。这个靴子包定义了引导程序()功能,以及BoT()函数和CD4data.frame–都在内部使用Run1().如果靴子不在函数内部附加,我们会出错的“找不到对象“cd4”“运行并行代码时。相反,我们不需要在顺序代码中这样做。也,如果我们以后把并行脚本变成一个包,然后R命令检查如果我们保持库(引导)呼叫内部Run1()功能。

第二,示例使用质量::MVRM()在里面Run1().原因与上述有关-如果我们只使用MVR-(),我们需要附加质量包装使用图书馆(质量)在里面也这样做Run1().因为只有一个质量调用的函数,使用表格更容易、更整洁质量::MVRM().

第三,随机种子设置在顺序和并行方法之间有所不同。

综上所述,为了将连续脚本转换为使用平行包裹,我们不仅要重写部分代码,还要注意重要的区别,以避免由于缺少包或全局变量而导致运行时错误。

的目标之一未来应用包裹,以及未来生态系统总体而言,是使从写顺序代码到写并行代码的转换尽可能简单和无摩擦。

下面是使用未来应用包裹:

库(future.apply)计划(多进程,workers=4)使用四个coreslibrary(boot)run1<-function(…)cd4.rg<-function(data,MLE)质量::mvrnorm(nrow(data),MLE $ M,MLE$V)CD4.MLE<-列表(M=colmeans(CD4),v=var(cd4))引导(cd4,更正,r=500,SIM =参数化,ran.gen=cd4.rg,mle=cd4.mle)set.seed(123)cd4.boot<-do.call(c,未来(1:4,Run1future.seed=true))boot.ci(cd4.boot,类型=C(“标准”,““基本”,““佩里”),CONF=0.9,H=ATANH,hinv =双曲正切)

顺序BASE-R实现与未来应用实现很少。这个未来应用随附包装,建立了四个工人的平行计划,以及应用()函数被替换为未来应用程序(),我们指定的地方future.seed=真获得统计声音和数值再现的并行随机数生成(RNG)。
更重要的是,注意,没有必要担心哪些包需要附加到工人身上,哪些全局变量需要导出。金宝搏网址所有这些都是由未来框架。

问答

Q.我的并行化选择是什么??
a.一切都在未来应用通过未来框架。这意味着所有由平行包装由包装箱外支撑,例如对你本地机器,以及在地方的遥远的自组织的计算群集(也在)。后端提供了额外的并行化和分发模式,例如未来.call(本地机器上的并行化)和未来.batchtools(通过HPC作业调度程序)。对于其他替代方案,有关未来包和高性能并行计算CRAN任务视图。

Q.右翼哦,那么,如何指定要使用哪个并行后端呢??
a.未来框架的一个基本设计模式是最终用户决定如何以及在哪里平行化虽然开发者决定什么平行化.这意味着你可以通过一些参数指定后端Fuutuxnn-()功能。相反,后端由平面()功能–您几乎可以将其视为最终用户控制的全局选项。例如,,计划(多进程)将在本地机器上并行化,威尔也是。计划(future.callr::callr),反之计划(集群)工人=C(“N1,“N2”,“远程.server.org“)将在两台本地计算机和一台远程计算机上并行。使用计划(future.batchtools::batchtools)将在SGE支持的计算集群上分发处理。顺便说一句,你也可以嵌套并行化策略,例如计划(列表(调整(群集,workers=节点)多进程)在哪里?节点= C(“N1,“N2”,“远程.server.org“).

Q.负载平衡呢金宝搏网址??
a.所有函数的默认行为是分布大小相等的块每个可用的后台工作人员的元素-这样每个工作人员只处理一个块(=一个未来)。如果处理时间在块之间有很大的差异,您可以增加每个工作人员处理的块的平均数量,例如让他们平均处理两个块,指定future.scheduling=2.0.或者,可以指定每个块处理的元素数,例如future.chunk.size=10升(类似于块大小参数添加到平行R 3.5.0中的包装)。

Q.随机数生成金宝搏网址(RNG)怎么样?我听说平行跑时很难纠正。
a.只要添加future.seed=真你很好。这将使用并行安全统计声音 L'ecuyer-cmrg-rng公司,这是一种成熟的并行RNG算法,由平行包裹。这个未来应用函数的使用方式也是不变的未来的后端和组块化已使用。为了产生数值上可重复的结果,设置SET种子(123)之前(如上例所示)或者简单地使用未来.seed=123.

Q.全局变量呢金宝搏网址?每当我尝试并行化代码时,我经常在找不到这个或那个变量“.
a.在使用未来框架——事情是开箱即用的。全局变量和包需要的是自动识别从静态代码检查到传递给工作人员,甚至当工作人员在远程计算机或云中运行时也是如此。

未来快乐!!

也见

留下评论作者,请关注他们博客上的链接和评论: 乔特尔.

188bet appr-bloggers.com网站提供 每日电子邮件更新金宝搏网址 R新闻与 教程关于以下主题: 数据科学,, 大数据,, r作业,可视化(可视化) GGPROTT2,, 箱形图,, 地图,, 动画),程序设计(程序) 演播室,, 斯威夫特,, 乳胶,, SQL,, 日食,, 吉特,, 哈多普,, 刮网)统计 回归,, 主成分分析,, 时间序列,, 交易)等等…



如果你走这么远,为什么不 订阅更新 从站点?选择您的口味: 电子邮件,, 推特,, 1188bet app,或 脸谱网

注释已关闭。

搜索R-Blo188bet appggers


赞助商

千万不要错过更新!!
订阅R-Bloggers188bet app接收
最新R帖子的电子邮件。
(您将不再看到此消息。)

单击此处关闭(此弹出窗口将不再出现)