2015-06-09 33 views
19

我面臨着以下問題:朱莉婭並行編程 - 使現有可用的功能,所有工人

我有一個名爲TrainModel功能,對於一個很長的時間在單個線程上運行。當它完成計算時,它會返回一個函數作爲輸出參數,我們稱之爲f。當我詢問這˚F的類型,朱莉婭返回:

(generic function with 1 method)

(我不知道這最後一條信息是有用的人閱讀本)

現在在第二步中,我需要對非常大的數值應用函數f。這是我想要平行的一個步驟。通過多個流程啓動了Julia,例如

julia -p 4 

理想情況下,我會用:

pmap(f, my_values) 

或者是:

aux = @parallel (hcat) for ii=1:100000000 
     f(my_values[ii]) 
     end 

不幸的是,這是行不通的。朱莉婭抱怨說,工人們不知道的功能˚F,即我收到了一封郵件:

ERROR: function f not defined on process 2

我怎樣才能使功能˚F提供給所有工人呢?顯然,一個「髒」的解決辦法是全體職工或許運行耗時的功能TrainModel,像這樣:

@everywhere f = TrainModel(...) 

,但是當我要的只是結果,這將是CPU的浪費f適用於所有工人。

雖然我搜索了類似的問題的帖子,到目前爲止,我無法找到答案...

提前感謝! 最好,

N.

+0

這是這裏的問題嗎? http://docs.julialang.org/en/release-0.3/manual/parallel-computing/#code-availability-and-loading-packages – Claies

+0

我認爲這正是問題所在。我明白如何在聲明函數時使所有工作者都可以使用函數:例如,在聲明函數時可以使用宏@everywhere。變量也一樣。但是,對於不在模塊中或聲明的函數,而是在運行時創建的函數,如何做呢? – user1438310

+4

這是一個很好的問題,我不認爲把OP引導到Julia文檔有幫助。事實上,從OP的問題可以清楚地看到,OP已經閱讀並理解了文檔中的相關部分,並且沒有解決運行時在不同範圍之間生成和傳遞的函數問題。此外還有一個額外的考慮因素:由於函數是在運行時生成的,因此編譯器可能無法確定輸出類型(即它不會是類型穩定的),這可能會導致其他問題(可能只有性能有關)。 –

回答

3

返回功能似乎優雅,但不幸的是,不同的JavaScript,朱莉婭不創建函數時解決所有變量的方法。 從技術上講,您的訓練函數可以爲所有訓練過的參數生成具有文字值的函數源代碼。然後將其傳遞給每個工作進程,這些工作進程可以在其環境中將其解析爲可調用函數。

我建議返回一個包含所有信息的數據結構來生成訓練函數:ANN的權重,支持向量,決策規則...... 在工作進程上定義一個「受過訓練」的函數,例如它將利用訓練的參數。您可能希望有能力將培訓結果保存到磁盤,以便您可以輕鬆地重新生成計算結果。

+0

感謝您的回答。事實上,這是我的情況:我訓練一個人工神經網絡,然後預測。在MATLAB中,甚至可以將訓練例程返回的預測函數保存在MAT文件中,然後再次加載,並且所有變量都可以正確解析。看來你的建議是唯一的出路。同時,我必須承認,人們必須在朱莉婭經歷這樣的解決方法有點令人失望,但是可能我仍然缺乏朱莉婭的經驗來欣賞這個問題...... – user1438310

0

有一個基於PTools.jl包(https://github.com/amitmurthy/PTools.jl)的基於Unix的解決方案。

它通過分叉而不是Julia內置機制依賴於並行。分叉進程與主進程具有相同的工作空間,因此所有的函數和變量都可直接提供給工作人員。

這與R並行包中的Fork集羣類似,因此它可以用作mclapply函數。

感興趣的函數是pfork(n :: Integer,f :: Function,args ...),與R中mclapply有一個明顯的區別是函數f必須作爲第一個參數作爲worker的索引。

一個例子:

Pkg.add("PTools") 
Pkg.checkout("PTools") #to get the last version, else the package does not build at the time of writing 

using PTools 
f(workid,x) = x[workid] + 1 
pfork(3, f, [1,2,3,4,5]) #Only the three first elements of the array will be computed 

3-element Array{Any,1}: 
2 
3 
4 

我想到的是一個接口pfork將建成,使該函數的第一個參數並不需要工人的指標,但暫時可以用於解決問題