2016-01-04 22 views
4

我是新來張貼在這裏 - 我搜索並找不到我的問題的答案。我在兩臺不同的機器上使用parallel軟件包運行以下R並行代碼(來自R中並行計算的blog),但仍得到非常不同的處理時間結果。第一臺機器是具有Windows 8,8GB RAM,Intel i7,2核/ 4個邏輯處理器的聯想筆記本電腦。第二臺機器是戴爾臺式機,Windows 7,16GB RAM,Intel i7,4核/ 8個邏輯處理器。代碼有時在第二臺機器上運行速度要慢得多。我相信原因是第二臺機器沒有使用工作節點來完成任務。當我使用snow包中的函數snow.time()來檢查節點使用情況時,第一臺機器正在使用所有可用的工作人員來完成任務。但是,在功能更強大的機器上,它從不使用工人 - 整個任務由主人處理。爲什麼第一臺機器使用工人,但第二臺機器沒有完全相同的代碼?我如何「強制」第二臺機器使用可用的工人,以便代碼真正並行化並且處理時間加快了?這些答案可以幫助我完成我正在做的其他工作。提前致謝。從功能snow.time()的圖表低於還有我使用的代碼: Laptop CPU Usage PC CPU Usage如何強迫閒散人員同時兼任R?

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) 
+0

你可以檢查你的任務管理器,看看工作人員在做什麼?我修改了一下代碼,好像它們都很忙(儘管在linux上)。 –

+0

任務管理器按預期顯示了4個R會話,每個會話的CPU級別爲13。但是snow.time()繼續表明只有主人用於處理,桌面時間比筆記本電腦更長(229秒)(使用所有4個核心的時間爲5.3秒)。我應該在任務管理器中尋找其他東西嗎? – KUZ

+0

現在只有手機。 a)制定明確的集羣類型(mpi,socket)。我在Linux上看到了fork集羣的這種行爲。 b)簡化代碼,刪除clusterEval,僅保留makeCluster和parLapply。 c)重啓R. –

回答

0

我不認爲有可能使用snow package中的snow.timing函數,同時從並行包中獲得所有其他函數。 R 3.2.3中的並行源有一些佔位符代碼用於計時,但它看起來不完整或與雪中的snow.timing函數兼容。我想你還是會從clusterApply得到正確的結果,而是由snow.time返回的對象將是相當於執行:

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

如果你想使用snow.timing,我建議只裝雪,但你仍然可以訪問功能如使用語法parallel::detectCores()detectCores

我真的不知道爲什麼腳本偶爾會在桌面計算機上緩慢運行,但我認爲您並行化腳本的方式是合理和正確的。您可能需要在兩臺機器上依次測試manyruns,以排除兩個系統上隨機數生成代碼的差異。但也許這個問題是由一個系統服務引起的,這個系統服務正在減慢整個系統。

+0

謝謝你的回答。這確實成了問題。當我只加載「雪」並運行代碼時,我在兩臺計算機上都得到了預期的輸出結果,顯示所有員工都忙於代碼。 – KUZ

4

嘗試clusterApplyLB而不是clusterApply。 「LB」用於負載平衡。

非LB版本將節點之間的任務數量分開並將它們批量發送,但是如果一個節點提前結束,那麼它就會空閒等待其他節點。

LB版本向每個節點發送一個任務,然後觀察節點,並在節點完成時發送另一個任務到該節點,直到分配完所有任務。如果每個任務的時間差異很大,這會更有效,但如果所有任務的時間大致相同,則效率會更低。

還檢查R和並行的版本。如果我正確地記住了在Windows機器上不能並行執行的功能(但我沒有再看到這個註釋,所以在最近的版本中可能已經被修復),所以差異可能是不同版本的並行封裝。 parLapply函數沒有相同的問題,所以你可以重寫你的代碼來使用它,看看是否有所作爲。

+0

我嘗試使用cluserApplyLB以及parLapply和parLapplyLB。我看到相同的問題,所以它沒有解決這個問題。 – KUZ

+0

@KUZ,你有沒有檢查你的R和並行包的版本? –

+0

是:筆記本電腦對於64位機器具有R 3.1.1。臺式機具有用於6位機器的R 3.1.3。在這兩臺機器上,我使用的是與R – KUZ

0

我不能把代碼放在註釋中...我不明白你的程序很好。你創建了什麼樣的羣集?試試這個,調整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核心/超線程/ 5Y的舊筆記本電腦/ Linux)的,所有的4名工人是100%繁忙。你也可以嘗試一下套接字集羣。

+0

出於某種原因,我無法在我的兩臺計算機上加載'Rmpi',因此我無法嘗試您的解決方案。我收到錯誤消息「Error:.onLoad in loadNamespace()for'Rmpi',詳細信息: 調用:inDL(x,as.logical(local),as.logical(now),...) 錯誤:無法加載共享對象'C:/Users/kukanwaz/Documents/R/win-library/3.1/Rmpi/libs/x64/Rmpi.dll': LoadLibrary失敗:無法找到指定的模塊錯誤:包或命名空間加載失敗'Rmpi'。單獨的問題,我將需要稍後解決... – KUZ

+0

似乎您沒有安裝openMPI。但是,如果將makeMPIcluster替換爲makePSOCKcluster並刪除庫Rmpi和雪,會發生什麼情況? –

相關問題