使用R Parallel与其他R软件包

5
我正在使用R中的LQMM包进行非常耗时的分析。 我设置了模型从星期四开始运行,现在已经是周一,仍在运行中。我对模型本身有信心(作为标准MLM进行了测试),并且我对我的LQMM代码有信心(使用相同数据集运行了几个非常相似的LQMM,所有这些都需要超过一天才能运行完)。但如果可能的话,我确实想弄清楚如何利用可访问的机器的并行处理功能使其运行更快(请注意,所有机器都基于Microsoft Windows)。
我已经阅读了几篇关于使用parallel的教程,但我还没有找到一篇展示如何将parallel包与其他R包协同使用的文章......是否我过度思考,或者这不可能呢?
下面是我使用R包LQMM运行的代码:
install.packages("lqmm")
library(lqmm)
g1.lqmm<-lqmm(y~x+IEP+pm+sd+IEPZ+IEP*x+IEP*pm+IEP*sd+IEP*IEPZ+x*pm+x*sd+x*IEPZ,random=~1+x+IEP+pm+sd+IEPZ, group=peers, tau=c(.1,.2,.3,.4,.5,.6,.7,.8,.9),na.action=na.omit,data=g1data)

这个数据集包含了122433条记录和58个变量。所有变量都进行了Z-score或者虚拟编码。


4
没有看到你的代码或数据,无法确切地说明问题所在。 - nrussell
编辑后包括代码和一些关于数据的信息。请告诉我这是否足够,或者是否需要更多信息。 - Jessica Sidler Folsom
2个回答

2
依赖库需要在所有节点上进行评估。为此,parallel包中预见了clusterEvalQ函数。您可能还需要将一些数据导出到子节点的全局环境中:为此,可以使用clusterExport函数。此外,还可以查看此页面以获取有关其他相关函数的更多信息,这些函数可能对您有用。
通常,要通过使用多个核来加速应用程序,您需要将问题分解为多个子部分,可以在不同核上并行处理。要在R中实现这一点,首先需要创建一个集群并将特定数量的核分配给它。接下来,您将需要注册集群,将所需变量导出到节点,然后在每个子节点上评估必要的库。您设置集群和启动节点的确切方式将取决于您使用的子库和函数类型。例如,如果选择利用doParallel包(以及大多数其他并行化子库/函数),则您的集群设置可能如下所示:
library(doParallel)
nrCores <- detectCores()
cl <- makeCluster(nrCores)
registerDoParallel(cl); 
clusterExport(cl,c("g1data"),envir=environment());
clusterEvalQ(cl,library("lqmm"))

集群已准备就绪。现在,您可以将全局任务的子部分分配给集群中的每个节点。在下面的一般示例中,集群中的每个节点将处理全局任务的子部分 i 。在本示例中,我们将使用doParallel包提供的foreach %dopar%功能:

doParallel包使用R 2.14.0及更高版本的parallel包为foreach /%dopar%函数提供并行后端。

子结果将自动添加到resultList中。最后,当所有子进程完成时,我们合并结果:

resultList <- foreach(i = 1:nrCores) %dopar%
{
   #process part i of your data.
}
stopCluster(cl)
#merge data..

既然你的问题并不是关于如何拆分数据的,我会让你自己去解决这部分的细节。但是,你可以在我的回答中使用doParallel包找到更详细的示例,该回答可在此帖子中找到。


谢谢!所以看起来没有办法真正自动并行运行一个包,除非进行一些重大的代码重写和/或数据分割。我想我还得继续努力! - Jessica Sidler Folsom

1
似乎您想使用并行计算来加快单个调用lqmm函数的执行速度。要做到这一点,您需要执行以下操作之一:
  • 将一个lqmm函数调用分成多个函数调用;
  • lqmm内部并行化循环。
有些函数可以通过指定较小的迭代值将其拆分为多个较小的部分。例如,在ntree参数上并行化randomForest或在nstart参数上并行化kmeans。另一个常见情况是将输入数据拆分成较小的部分,在并行操作这些部分后将结果组合起来。当输入数据是数据框或矩阵时,通常会这样做。
但是为了并行化函数,往往需要对其进行修改。这可能更容易,因为您可能不必弄清如何拆分问题并组合部分结果。您可能只需将lapply调用转换为并行lapply,或将for循环转换为foreach循环。然而,理解代码通常是耗时的。建议对代码进行性能分析,以确保并行化确实加速了函数调用。

我建议您下载lqmm包的源代码,并开始阅读代码。试着理解它的结构,并想想哪些循环可以并行执行。如果您幸运的话,可能会找到一种将一个调用分成多个调用的方法,否则您将不得不在自己的计算机上重新构建修改后的包。


谢谢!所以看起来没有办法真正自动并行运行一个包,除非进行一些重大的代码重写和/或数据分割。我想我还得继续努力! - Jessica Sidler Folsom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接