我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