在 vegan 函数中使用并行处理?
Using parallel processing in vegan functions?
我有兴趣从 vegan 包中并行执行 R 函数 adonis。但是,我不清楚如何使它 运行 并行。无论我如何尝试初始化它,它似乎都需要相同的时间来执行。有人可以解释我做错了什么吗?
require(vegan)
require(parallel)
data(dune)
data(dune.env)
#This:
system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999))
#Runs faster (4.49 s) than this (6.7 s):
system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999, parallel=3))
#or this (6.7 s)
cl <- makeCluster(3)
system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999, parallel=cl))
stopCluster(cl)
计算机详细信息:
- R V4.0
- 赢得 10x64
- i5-8350 4核
我不确定这个答案到底有多大帮助,但我会分享一些我自己的观察和我慢慢拼凑起来的东西。我不假装是这方面的专家,所以请意识到这里可能存在一些不准确之处,请接受我的回答。我首先是生物学家。
这些并行库中的一些似乎会重新加载 r 环境和 运行 每个内核 每个内核 的任何启动文件(例如 rprofiles)。因此,使用并行库存在固有的时间成本,因此只有当计算量足够大以值得并行化时,您才会看到并行函数的好处(在您的示例中,Dune 数据集非常小。我将在下面分享我自己的基准测试)。也就是说,有一些事情似乎有所帮助。
使用 doParallel
库,您可以指定参数以不将不必要的信息加载到您的会话中,如下所示:
library(doParallel)
cl <- makeCluster(3, rscript_args = c("--no-init-file", "--no-site-file","--no-environ"))
#for linux .... cl <- makePSOCKcluster(2)
registerDoParallel(cl)
unif_w = UniFrac(d, weighted=T, parallel=T, normalized = T)
unif_uw = UniFrac(d, weighted=F, parallel=T)
stopCluster(cl)
我在自己的工作中注意到,添加 rscript 选项大大提高了我的速度(抱歉,没有基准测试,希望能快速得到答案)。如果我记得我从中得到该建议的来源,我会回来分享。
这对 运行ning Adonis 没有帮助,但我认为初始时间成本可以解释为什么我们在 Dune 数据集上使用 Adonis 内置的并行选项看不到时间优势。这是我的基准。
> data("dune")
> data("dune.env")
> system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999))
user system elapsed
3.90 0.00 3.93
> #Runs faster (4.49 s) than this (6.7 s):
> system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999, parallel=3))
user system elapsed
0.71 0.04 6.53
这组差别不大,但并行速度较慢。然而,用我目前正在使用的一个大集合重复(bc 是一个距离矩阵,是从具有 887 个物种和 3734 个站点的物种矩阵计算得出的)
> system.time(adonis(bc ~ fmet$Diagnosis, parallel = 1))
user system elapsed
109.95 21.27 131.22
> system.time(adonis(bc ~ fmet$Diagnosis, parallel = 4))
user system elapsed
3.44 1.41 82.36
长话短说,在这种特定情况下,您可能只有将 adonis 选项应用于更大的数据集才能受益。
我不确定这里的计算机规格有多重要,但我确实有大量内存用于此类目的。在我的例子中,内存更重要,因为它让我可以更轻松地处理大型矩阵。
- R 版本:4.0.2
- Windows 10、64 位
- AMD 锐龙 3600
- 64GB 内存
无论如何,我仍在寻找其他解决方法和技巧。
我有兴趣从 vegan 包中并行执行 R 函数 adonis。但是,我不清楚如何使它 运行 并行。无论我如何尝试初始化它,它似乎都需要相同的时间来执行。有人可以解释我做错了什么吗?
require(vegan)
require(parallel)
data(dune)
data(dune.env)
#This:
system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999))
#Runs faster (4.49 s) than this (6.7 s):
system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999, parallel=3))
#or this (6.7 s)
cl <- makeCluster(3)
system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999, parallel=cl))
stopCluster(cl)
计算机详细信息:
- R V4.0
- 赢得 10x64
- i5-8350 4核
我不确定这个答案到底有多大帮助,但我会分享一些我自己的观察和我慢慢拼凑起来的东西。我不假装是这方面的专家,所以请意识到这里可能存在一些不准确之处,请接受我的回答。我首先是生物学家。
这些并行库中的一些似乎会重新加载 r 环境和 运行 每个内核 每个内核 的任何启动文件(例如 rprofiles)。因此,使用并行库存在固有的时间成本,因此只有当计算量足够大以值得并行化时,您才会看到并行函数的好处(在您的示例中,Dune 数据集非常小。我将在下面分享我自己的基准测试)。也就是说,有一些事情似乎有所帮助。
使用 doParallel
库,您可以指定参数以不将不必要的信息加载到您的会话中,如下所示:
library(doParallel)
cl <- makeCluster(3, rscript_args = c("--no-init-file", "--no-site-file","--no-environ"))
#for linux .... cl <- makePSOCKcluster(2)
registerDoParallel(cl)
unif_w = UniFrac(d, weighted=T, parallel=T, normalized = T)
unif_uw = UniFrac(d, weighted=F, parallel=T)
stopCluster(cl)
我在自己的工作中注意到,添加 rscript 选项大大提高了我的速度(抱歉,没有基准测试,希望能快速得到答案)。如果我记得我从中得到该建议的来源,我会回来分享。
这对 运行ning Adonis 没有帮助,但我认为初始时间成本可以解释为什么我们在 Dune 数据集上使用 Adonis 内置的并行选项看不到时间优势。这是我的基准。
> data("dune")
> data("dune.env")
> system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999))
user system elapsed
3.90 0.00 3.93
> #Runs faster (4.49 s) than this (6.7 s):
> system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999, parallel=3))
user system elapsed
0.71 0.04 6.53
这组差别不大,但并行速度较慢。然而,用我目前正在使用的一个大集合重复(bc 是一个距离矩阵,是从具有 887 个物种和 3734 个站点的物种矩阵计算得出的)
> system.time(adonis(bc ~ fmet$Diagnosis, parallel = 1))
user system elapsed
109.95 21.27 131.22
> system.time(adonis(bc ~ fmet$Diagnosis, parallel = 4))
user system elapsed
3.44 1.41 82.36
长话短说,在这种特定情况下,您可能只有将 adonis 选项应用于更大的数据集才能受益。
我不确定这里的计算机规格有多重要,但我确实有大量内存用于此类目的。在我的例子中,内存更重要,因为它让我可以更轻松地处理大型矩阵。
- R 版本:4.0.2
- Windows 10、64 位
- AMD 锐龙 3600
- 64GB 内存
无论如何,我仍在寻找其他解决方法和技巧。