2017-09-21 69 views
0

我有一個(大)神經網絡正在R中的nnet包訓練。我想能夠模擬這個神經網絡的預測,並且在並行使用像foreach這樣的東西,我之前用過的成功(全部在Windows機器上)。當預測與foreach並行的nnet輸出時發生R內存爆炸

我的代碼的基本形式

library(nnet) 

data = data.frame(out=c(0, 0.1, 0.4, 0.6), 
       in1=c(1, 2, 3, 4), 
       in2=c(10, 4, 2, 6)) 

net = nnet(out ~ in1 + in2, data=data, size=5) 

library(doParallel) 
registerDoParallel(cores=detectCores()-2) 

results = foreach(test=1:10, .combine=rbind, .packages=c("nnet")) %dopar% { 
    result = predict(net, newdata = data.frame(in1=test, in2=5)) 
    return(result) 
} 

除了具有大得多的NN是配合和從預測;大約300MB。

上面的代碼在使用傳統的for循環或者使用%do%時運行良好,但是當使用%dopar%時,每個核心都被加載到內存中 - 每個核心使用700MB左右。如果我運行足夠長的時間,所有事情最終都會爆炸。

看了類似的問題,我仍然不知道是什麼原因造成的。省略「預測」部分使每件事情都順利進行。

我怎樣才能讓每個核心查找不變的'淨'而不是將它加載到內存中?還是不可能?

回答

0

我怎樣才能讓每個核心查找不變的'淨'而不是它被加載到內存中?還是不可能?

CPak的回覆解釋了發生了什麼;您可以在單獨的R會話中有效地運行主腳本的多個副本(=工作人員)。既然你在Windows上,調用

registerDoParallel(cores = n) 

擴展爲:

cl <- parallel::makeCluster(n, type = "PSOCK") 
registerDoParallel(cl) 

這有什麼用自己的indenpendent內存地址空間設置n獨立的背景 [R工人。

現在,如果您使用的是類Unix系統,則它將對應使用n R工,參見parallel::mclapply()。 Windows上不支持分叉進程。通過分叉處理,您可以有效地獲得所要求的內容,因爲分叉的子進程將共享主進程已分配的對象(只要此類對象未被修改),例如, net

1

當您啓動新的並行工作人員時,您基本上正在創建一個新環境,這意味着您在新環境中執行的任何操作都需要訪問相關變量/函數。

例如,您必須指定.packages=c("nnet"),因爲您需要每個新工作人員(環境)中的nnet包,這就是您如何從全局環境「克隆」或「導出」到每個工作人員env。

因爲您需要訓練有素的神經網絡進行預測,您還需要將其導出到每個工作人員身上,而且我也沒有看到您遇到的記憶力不足的問題。如果你仍然對並行感興趣,但內存不足,我唯一的建議是查看doMPI