簡體   English   中英

如何使用R future包在集群內進行並行計算?

[英]How to do parallel computing inside a cluster with the R future package?

我想在集群(幾台機器)的節點內分配作業(帶有for循環)。 我嘗試使用R包future來做到這一點。 我不知道這是否是最好的方式; 我試圖使用doParallel包的foreach ,但我沒有成功。 如何確定循環迭代次數何時大於群集節點數?

library(doParallel);
library(doFuture);
#library(future);

registerDoFuture();

workers <- c(rep("129.20.25.61",1), rep("129.20.25.217",1));
cl <- makeClusterPSOCK(workers, revtunnel = TRUE, outfile = "", verbose = FALSE);

plan(cluster, workers = cl)

mu <- 1.0
sigma <- 2.0

for(i in 1:3){
 res %<-%{ rnorm(i, mean = mu, sd = sigma)}
 print(i);
}

如果您使用普通的Future API,即future() + value()%<-% ,則無需涉及foreach,doFuture等。以下是如何使用Future API以及您可以期望的輸出:

(A)設置工人

library("future")

workers <- c("129.20.25.61", "129.20.25.217")
cl <- makeClusterPSOCK(workers, revtunnel = TRUE, outfile = "")
### starting worker pid=20026 on localhost:11900 at 11:47:28.334
### starting worker pid=12291 on localhost:11901 at 11:47:37.172

print(cl)
### socket cluster with 2 nodes on hosts '129.20.25.61', '129.20.25.217'

plan(cluster, workers = cl)

(B)明確的未來API

在這里,我們使用future()顯式創建一個期貨列表,並使用values()檢索它們的值(基本上等於調用lapply(f, FUN = value) )。

mu <- 1.0
sigma <- 2.0

f <- list()
for (i in 1:3) {
  f[[i]] <- future({ rnorm(i, mean = mu, sd = sigma) })
}
v <- values(f)
str(v)
### List of 3
###  $ : num 3.25
###  $ : num [1:2] 3.24 3.29
###  $ : num [1:3] 1.251 2.299 0.923

(C)隱式未來API

在這個替代方案中,我們使用未來賦值運算符%<-%隱式創建期貨value()當您嘗試訪問未來的值時,它將在內部執行future()然后執行value() )。 由於%<-%只能分配給環境(而不是列表,data.frames等),因此我們需要使用作為環境的容器。 這里我使用listenv類,這是一個環境,但允許您將其索引為列表。

library("listenv")  ## listenv()
mu <- 1.0
sigma <- 2.0

v <- listenv()
for (i in 1:3) {
  v[[i]] %<-% { rnorm(i, mean = mu, sd = sigma) }
}
v <- as.list(v)
str(v)
### List of 3
###  $ : num 1.15
###  $ : num [1:2] 2.2277 -0.0164
###  $ : num [1:3] -2.09 3.34 -1.09

(D)使用future_lapply()

如果你喜歡lapply()的方法,你可以這樣做:

v <- future_lapply(1:3, FUN = function(i) {
  rnorm(i, mean = mu, sd = sigma)
})
str(v)
### List of 3
###  $ : num 2.12
###  $ : num [1:2] 2.56 -1.21
###  $ : num [1:3] 2.89 -0.159 -0.983

(D)使用foreach()

如果您想使用foreach() ,那么您可以執行以下操作。 請注意,在每個foreach設計中使用foreach()時,最好始終顯式導出全局變量 - 但是,如果您始終使用doFuture則實際上不需要它。

library("doFuture")
registerDoFuture()
workers <- c("129.20.25.61", "129.20.25.217")
cl <- makeClusterPSOCK(workers, revtunnel = TRUE, outfile = "")
plan(cluster, workers = cl)

v <- foreach(i = 1:3, .export = c("mu", "sigma")) %dopar% {
  rnorm(i, mean = mu, sd = sigma)
}
str(v)
### List of 3
###  $ : num 3.12
###  $ : num [1:2] -0.0887 -2.8016
###  $ : num [1:3] 2.15 3.5 -2.24

如何判斷循環迭代次數何時高於群集節點數?

我不確定你在這里問什么。 您是否擔心一次有更多的期貨運行? 如果是這樣,那就會自動處理。 如果所有工人都被占用,則創建額外的期貨將會阻止,直到其中一名工人再次可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM