使用 `future` 进行并行化时速度增益不佳

问题描述

我发现在 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...