使用R Parallel与其他R包

时间:2015-05-04 18:56:13

标签: r parallel-processing multicore

我正在使用R中的LQMM软件包进行非常耗时的分析。我将模型设置为在星期四开始运行,现在是星期一,并且仍在运行。我对模型本身(作为标准MLM测试)充满信心,我对我的LQMM代码充满信心(已经使用相同的数据集运行了几个非常相似的LQMM,并且它们都花了一天时间来运行)。但我真的想弄清楚如何使用我可以访问的机器的并行处理功能(如果可以使用基于Microsoft Windows的那些)来更快地运行它。(/ p>

我已经阅读了几个关于使用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)

数据集对58个变量进行了122433次观察。所有变量都是z分数或虚拟编码。

2 个答案:

答案 0 :(得分:2)

需要在所有节点上评估依赖库。为此目的,clusterEvalQ包中预见了函数parallel。您可能还需要将一些数据导出到子节点的全局环境中:为此,您可以使用clusterExport函数。另请查看this page以获取可能对您有用的其他相关功能的更多信息。

通常,要通过使用多个内核来加速应用程序,您必须将问题分解为可在不同内核上并行处理的多个子项。要在R中实现此目的,首先需要创建一个集群并为其分配特定数量的核心。接下来,您必须注册集群,将所需的变量导出到节点,然后评估每个子节点上的必要库。设置群集和启动节点的确切方式取决于您将使用的子库和函数的类型。例如,当您选择使用doParallel包(以及大多数其他并行化子库/函数)时,您的clustersetup可能如下所示:

library(doParallel)
nrCores <- detectCores()
cl <- makeCluster(nrCores)
registerDoParallel(cl); 
clusterExport(cl,c("g1data"),envir=environment());
clusterEvalQ(cl,library("lqmm"))

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

  

doParallel包为。提供并行后端   foreach /%dopar%函数使用R 2.14.0和的并行包   后面。

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

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

由于您的问题并非专门针对如何分割数据,我会让您自己弄清楚这部分的细节。但是,您可以在我对this post的回答中使用doParallel包找到更详细的示例。

答案 1 :(得分:1)

听起来您希望使用并行计算来更快地执行lqmm函数的单个调用。要做到这一点,你要么:

  • lqmm的一次调用拆分为多个函数调用;
  • 并行化lqmm内的循环。

通过指定较小的迭代值,可以将某些函数拆分为多个较小的部分。示例包括在randomForest参数上并行ntree,或在kmeans参数上并行化nstart。另一种常见情况是将输入数据拆分为较小的部分,并行处理,然后合并结果。当输入数据是数据帧或矩阵时,通常会这样做。

但是很多时候为了并行化一个函数你必须修改它。它实际上可能更容易,因为您可能不必弄清楚如何分解问题并结合部分结果。您可能只需要将lapply调用转换为并行lapply,或将for循环转换为foreach循环。但是,理解代码通常很耗时。分析代码也是一个好主意,这样你的并行化确实可以加速函数调用。

我建议您下载lqmm包的源代码发行版并开始阅读代码。尝试理解它的结构,并了解哪些循环可以并行执行。如果你很幸运,你可能想出一种方法将一个电话分成多个电话,但是否则你必须在你的机器上重建一个包的修改版本。