簡體   English   中英

什么時候(如果有的話)我應該告訴R parallel不使用所有內核?

[英]When (if ever) should I tell R parallel to not use all cores?

我一直在使用以下代碼:

library(parallel)
cl <- makeCluster( detectCores() - 1)
clusterCall(cl, function(){library(imager)})

然后我有一個包裝函數,看起來像這樣:

d <- matrix  #Loading a batch of data into a matrix
res <- parApply(cl, d, 1, FUN, ...)
# Upload `res` somewhere

我在筆記本電腦上測試了8核(4核,超線程)。 當我在50,000行,800列矩陣上運行它時,花了177.5s來完成,並且在大多數情況下,這7個核心保持在接近100%的位置(根據頂部),然后在最后15個地方停在那里大概幾秒鍾,我想這就是結果。 根據system.time() ,用戶時間為14秒,因此匹配。

現在,我在36核c4.8xlarge EC2上運行,並且我看到它幾乎全部時間都花在了100%的一個核上。 更精確地說:在使用所有內核的情況下,大約有10秒到20秒的突發時間,然后在100%的情況下(僅由R使用)大約90秒的一個內核,然后是其他內容的大約45秒(我保存結果並保存加載下一批數據)。 我正在批量處理40,000行,800列。

根據頂部,長期平均負載在5.00附近。

這看起來合理嗎? 還是有一點R並行花費更多的時間來處理通信開銷,我應該限制為例如16個內核。 這里有什么經驗法則嗎?

參考: CPU規格我正在使用“ Linux 4.4.5-15.26.amzn1.x86_64(amd64)”。 R版本3.2.2(2015-08-14)

更新:我嘗試使用16個內核。 對於最小的數據,運行時間從13.9s增加到18.3s。 對於中型數據:

With 16 cores:
   user  system elapsed 
 30.424   0.580  60.034 

With 35 cores:
   user  system elapsed 
 30.220   0.604  54.395 

即, 開銷部分花費了相同的時間,但是並行位的內核更少,因此花費了更長的時間,因此總體上花費了更長的時間。

我也嘗試使用mclapply() ,如注釋中所建議。 它的確似乎要快一些(在我嘗試過的特定測試數據上大約為330s與360s),但這在我的筆記本上,在此其他過程或過熱可能會影響結果。 因此,我尚未對此得出任何結論。

沒有有用的經驗法則-並行任務最適合的內核數量完全由所述任務確定。 有關更一般的討論,請參見古斯塔夫森定律

您在代碼中看到的高單核部分可能來自算法的結束階段(“聯接”階段),在該階段,並行結果被整理為單個數據結構。 由於這遠遠超出了並行計算階段,因此這實際上可能表明較少的內核可能是有益的。

我還要補充一點,如果您不了解R中用於並行計算的出色資源,您可能會發現閱讀Norman Matloff的最新著作Parallel Computing for Data Science: With Examples in R, C++ and CUDAParallel Computing for Data Science: With Examples in R, C++ and CUDA非常有幫助。 我強烈推薦它(我學到了很多東西,而不是來自CS背景)。

這本書深入回答了您的問題(特別是第2章)。 這本書對導致並行程序瓶頸的開銷原因進行了高層次的概述。

引用第2.1節,該節隱式部分回答了您的問題:

並行編程中存在兩個主要的性能問題:

通信開銷 :通常,必須在進程之間來回傳輸數據。 這需要時間,這可能會對性能造成很大的影響。 此外,如果所有進程都試圖一次訪問相同的數據,則它們之間可能會互相干擾。 當嘗試訪問相同的通信通道,相同的內存模塊等時,它們可能會發生沖突。 這是速度上的另一個障礙。 術語“粒度”用於大致指代計算與開銷之比。 大粒度或粗粒度算法涉及足夠大的計算塊,因此開銷並不是什么大問題。 在細粒度算法中,我們確實確實需要盡可能避免開銷。

^當開銷很高時,針對當前問題的較少核心可以縮短總計算時間。

負載平衡 :如上一章所述,如果我們不謹慎地將工作分配給流程,則分配給某些工作的風險要大於分配給其他工作的風險。 這會損害性能,因為在運行結束時會使某些過程失去生產力,而仍有工作要做。

什么時候不使用所有內核? 從我的個人經驗中可以得出一個例子,我每天在R中運行的cronjob數據在RAM中的數據量為100-200GB,其中運行多個核以處理數據塊,我確實發現32個可用核中有6個可以運行比使用20-30個內核更快。 一個主要原因是子進程需要內存(在執行了一定數量的子進程之后,內存使用率很高,並且運行速度大大降低)。

暫無
暫無

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

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