问题描述
我发现在 future
中使用 furrr
(和 R
)包进行并行化的速度增益并不令人满意。尤其是速度提升并不接近线性。我的机器有 4 个工人,所以我认为当我指定的工人数量不大于我机器中可用的内核数量时,速度增益应该是线性的。然而,事实并非如此。
以下是说明问题的示例,其中我绘制了 10^7 个随机数 500 次。
library(future)
library(furrr)
# Parameters
n <- 1e7
m <- 500
# Compute the mean
rmean <- function(x,n) {
rand.vec <- runif(n)
rand.mean <- mean(rand.vec)
return(rand.mean)
}
# Record the time used to compute the mean of n numbers for m times
rtime <- function(m,n) {
t1 <- Sys.time()
temp <- future_map(.x = 1:m,.f = rmean,n = n,.options = furrr::furrr_options(seed = TRUE))
t2 <- Sys.time()
# Print the time used
print(t2 - t1)
return(temp)
}
# Print the time used for different number of workers
plan(multisession,workers = 1)
set.seed(1)
x <- rtime(m,n)
# Time difference of 2.503885 mins
plan(multisession,workers = 2)
set.seed(1)
x <- rtime(m,n)
# Time difference of 1.341357 mins
plan(multisession,workers = 3)
set.seed(1)
x <- rtime(m,n)
# Time difference of 57.25641 secs
plan(multisession,workers = 4)
set.seed(1)
x <- rtime(m,n)
# Time difference of 47.31929 secs
在上面的例子中,我得到的速度增益是:
- 2 个工人 1.87 倍
- 3 名工人为 2.62 倍
- 4 名工人 3.17 倍
上面例子中的速度增益不是接近线性的,尤其是当我使用 4 个工人时。我认为这可能是因为 plan
函数的开销时间。但是,如果我在设置工人数量后多次运行该程序,速度增益是相似的。如下图所示:
plan(multisession,n)
# Time difference of 58.07243 secs
set.seed(1)
x <- rtime(m,n)
# Time difference of 1.012799 mins
set.seed(1)
x <- rtime(m,n)
# Time difference of 57.96777 secs
我还尝试使用 future_lapply
包中的 future.apply
函数,而不是 future_map
包中的 furrr
函数。但是,它们的速度增益也相似。因此,如果您对这里发生的事情有任何建议,我将不胜感激。谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)