簡體   English   中英

如何迫使閑置的工人並行工作?

[英]How to force idle workers to take jobs in parallel R?

我是新來發布的 - 我搜索過,找不到我的問題的答案。 我在兩台不同的機器上使用parallel程序包運行了以下R並行化代碼(來自R中並行計算的博客 ),但卻獲得了截然不同的處理時間結果。 第一台機器是聯想筆記本電腦,配備Windows 8,8GB RAM,Intel i7,2核/ 4邏輯處理器。 第二台機器是戴爾台式機,Windows 7,16GB RAM,Intel i7,4核/ 8邏輯處理器。 代碼有時在第二台機器上運行得慢得多。 我相信原因是第二台機器沒有使用工作節點來完成任務。 當我使用snow包中的函數snow.time()來檢查節點使用情況時,第一台機器正在使用所有可用的工作人員來完成任務。 但是,在功能更強大的機器上,它從不使用工作人員 - 整個任務由主人處理。 為什么第一台機器使用工人,但第二台機器使用完全相同的代碼? 我如何“強迫”第二台機器使用可用的工作程序,以便代碼真正並行化並且處理時間加快? 這些答案對我正在做的其他工作有很大的幫助。 提前致謝。 功能snow.time()中的圖表以及我使用的代碼如下: 筆記本CPU使用率 PC CPU使用率

runs <- 1e7
manyruns <- function(n) mean(unlist(lapply(X=1:(runs/4), FUN=onerun)))

library(parallel)
cores <- 4
cl <- makeCluster(cores)

# Send function to workers
tobeignored <- clusterEvalQ(cl, {
    onerun <- function(.){ # Function of no arguments
        doors <- 1:3
        prize.door <- sample(doors, size=1)
        choice <- sample(doors, size=1)
        if (choice==prize.door) return(0) else return(1) # Always switch
    }
    ; NULL
})

# Send runs to the workers
tobeignored <- clusterEvalQ(cl, {runs <- 1e7; NULL})
runtime <- snow.time(avg <- mean(unlist(clusterApply(cl=cl, x=rep(runs, 4), fun=manyruns))))
stopCluster(cl)

plot(runtime)

嘗試使用clusterApplyLB而不是clusterApply “LB”用於負載平衡。

非LB版本划分節點之間的任務數量並批量發送它們,但如果一個節點提前完成,則它將空閑等待其他節點。

LB版本向每個節點發送一個任務,然后監視節點,當節點完成時,它向該節點發送另一個任務,直到分配了所有任務。 如果每個任務的時間變化很大,則效率更高,但如果所有任務花費大約相同的時間,效率會降低。

還要檢查R和並行版本。 如果我正確記住了clusterApply函數曾經不能在Windows機器上並行執行(但我不再看到那個注釋,所以在最近的版本中可能已經補救了),所以區別可能是不同版本的並行包。 parLapply函數沒有相同的問題,因此您可以重寫代碼以使用它,看看是否parLapply

我不認為可以使用snow包中的snow.timing功能,同時從並行包中獲取所有其他功能。 R 3.2.3中的並行源有一些用於計時的占位符代碼,但它似乎不完整或與雪中的snow.timing功能兼容。 我認為你仍然可以從clusterApply獲得正確的結果,但snow.time返回的對象將等同於執行:

runtime <- snow.time(Sys.sleep(20))

如果你想使用snow.timing ,我建議只加載雪,雖然你仍然可以使用語法parallel::detectCores()訪問detectCores等函數。

我真的不知道為什么你的腳本偶爾在台式機上運行緩慢,但我認為你並行化它的方式是合理和正確的。 您可能希望嘗試在兩台計算機上按順序對manyruns進行基准測試,以排除兩個系統上隨機數生成代碼的任何差異。 但問題可能是系統服務導致整個系統變慢。

我不能把代碼放在評論中......我不太了解你的程序。 你在創建什么樣的集群? 試試這個,將2e6調整為適合你的任何東西:

library(parallel)
library(Rmpi)
library(snow)
cl <- makeMPIcluster(3)
t <- system.time(parLapply(cl, 1:100, function(i) mean(rnorm(2e6))))
stopCluster(cl)
print(t)

對我來說它運行10秒鍾(2核心/超線程/ 5年舊筆記本電腦/ linux),所有4名工人都100%忙碌。 您也可以嘗試使用套接字群集。

暫無
暫無

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

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