0

snowfall在我的台式机上使用并行处理没有任何问题。我想在办公室使用几台备用机器来提高计算速度,并希望在远程机器上分配并行处理。

我有它工作,但遇到一个问题,即通过远程分发比仅在本地运行或在另一台(远程)机器上手动(即本地)运行代码要慢得多。

我的测试表明,远程集群上的并行处理比本地运行慢大约 14 倍。我意识到通过网络分发会有一些开销,但我认为它不会如此低效。

示例速度测试

testFun <- function(i, n=1E4) rnorm(n)
nsim <- 2000

本地机器 - 没有并行处理

st <- Sys.time()
temp <- sapply(1:nsim, testFun)
Sys.time() - st
# about 1.5 seconds

本地机器 - 并行处理

library(snowfall)
snowfall::sfInit(parallel = TRUE, cpus = 8)
st <- Sys.time()
temp <- snowfall::sfSapply(1:nsim, testFun)
Sys.time() - st

# snowfall 1.84-6.1 initialized (using snow 0.4-2): parallel execution on 8 CPUs.
# Time difference of ~0.9 secs

远程机器 - 直接在远程机器上运行

testFun <- function(i, n=1E4) rnorm(n)
nsim <- 2000

library(snowfall)
snowfall::sfInit(parallel = TRUE, cpus = 8)
st <- Sys.time()
temp  <- snowfall::sfSapply(1:nsim, testFun)
Sys.time() - st
# snowfall 1.84-6.1 initialized (using snow 0.4-2): parallel execution on 8 CPUs.
# Time difference of ~ 1 sec

本地机器 - 分发到远程

remote <- list(host = "14*.***.***.***", 
                  rscript = "Rscript", 
                  snowlib = "/usr/local/lib/R/site-library",
                  rshcmd = "plink.exe -pw *********",
                  user="******",
                  master = '14*.***.***.***')

sfInit(parallel = TRUE, cpus = 8, type = "SOCK", 
       socketHosts = list(remote,remote,remote,remote, 
                          remote, remote, remote, remote))

st <- Sys.time()
tt <- snowfall::sfSapply(1:nsim, testFun)
Sys.time() - st
# snowfall 1.84-6.1 initialized (using snow 0.4-2): parallel execution on 8 CPUs.
# Time difference of ~ 14 secs

我的函数显然比这更密集,并且多次调用sfSapply. 我注意到分发到远程机器时运行时间的增加相同 - 大约是在远程机器上直接在 R 中运行时的 12 到 15 倍。

问题

我在做傻事吗?有一个更好的方法吗?

或者这是由于本地和远程机器之间的网络通信而不可避免的?

本地机器:Windows 10;R 3.4.3 远程机器:Ubuntu 17.10;R 3.4.3

4

0 回答 0