2015-09-19 35 views
6

我想在並行多處理器上使用sklearn.grid_search.GridSearchCV()。這是我第一次這樣做,但我最初的測試表明它似乎正在工作。scikit學習:一般問題有關的並行計算

我想了解文檔的this部分:

n_jobs:INT,默認爲1

的作業數並行運行。

pre_dispatch:int或字符串,可選

控制平行 執行過程中得到派出的就業人數。減少這個數字可能是有用的,以避免 內存消耗爆炸時,更多的就業機會獲得比派遣CPU可以 過程。該參數可以是:

無,在這種情況下立即創建所有作業併產生 。使用此輕型和快速運行的作業,以避免 延誤,由於作業的int按需產卵,給那些催生了一個字符串就業總數的 確切的數字,給人一種 表達n_jobs的功能,在 '2個* n_jobs'

有人可以打破這種下來嗎?我無法理解n_jobspre_dispatch之間的差異。如果我設置n_jobs = 5pre-dispatch=2,這是怎麼從剛剛設置n_jobs=2不同?

回答

0

Source

如果n_jobs設定爲高於一個值,則該數據被複製爲每個參數設定(和未n_jobs倍)。這是出於效率原因而完成的,如果單個作業只需要很少的時間,但是如果數據集很大並且沒有足夠的存儲空間可能會引發錯誤。在這種情況下,解決方法是設置pre_dispatch。然後,內存只複製pre_dispatch多次。 pre_dispatch的合理值是2 * n_jobs。

+0

小心細化?我不明白當5個進程必須共享2個數據「塊」時會發生什麼? – Fequish

+0

'pre_dispatch'主要控制發送的任務的「批次」數量。 – rightskewed

5

假設您正在做KNN並且必須在k=[1,2,3,4,5, ... 1000]之間進行選擇。即使您設置了n_jobs=2,GridSearchCV也會第一個創建1000個作業,每個作業都有一個k選項,還可以創建1000個數據副本(如果數據很大,可能會炸燬內存),然後將這1000個作業發送到2個CPU(大多數工作將在課程中待定)。 GridSearchCV不會爲2個CPU產生2個作業,因爲按需spawing作業的過程非常昂貴。它直接產生與您擁有的參數組合相等的作業量(在這種情況下爲1000)。在這個意義上,措詞n_jobs可能會引起誤解。現在,使用pre_dispatch你可以設置你要多少預派出工作產卵。