我的多處理需求非常簡單:我在機器學習中工作,有時需要評估多個數據集中的算法或數據集中的多個算法等。我只需要用一些參數運行一個函數並獲得一個數字。Julia等效於Python多處理.Pool.map
我不需要RPC,共享數據,什麼都沒有。
在朱莉婭,我得到一個錯誤與下面的代碼:
type Model
param
end
# 1. I have several algorithms/models
models = [Model(i) for i in 1:50]
# 2. I have one dataset
X = rand(50, 5)
# 3. I want to paralelize this function
@everywhere function transform(m)
sum(X .* m.param)
end
addprocs(3)
println(pmap(transform, models))
我不斷收到錯誤,比如,
ERROR: LoadError: On worker 2:
UndefVarError: #transform not defined
此外,有沒有辦法避免放置@everywhere
到處?我能否告訴所有變量應在創建時複製到工作人員中(如Python multiprocessing
中所做的那樣)?
我的典型代碼看起來顯然比這更復雜,模型包含幾個文件。
以供參考,這是我會在Python做:
import numpy as np
import time
# 1. I have several algorithms/models
class Model:
def __init__(self, param):
self.param = param
models = [Model(i) for i in range(1,51)]
# 2. I have one dataset
X = np.random.random((50, 5))
# 3. I want to paralelize this function
def transform(m):
return np.sum(X * m.param)
import multiprocessing
pool = multiprocessing.Pool(4)
print(pool.map(transform, models))
「@everywhere X = rand(50,5)」不會在每個進程上產生唯一的數據集嗎? – rickhg12hs
這個答案比我討價還價的要多。謝謝!我的困惑是認爲'addprocs()'會使用'fork()',它將淺色內存狀態複製到子進程。對於簡單的東西,我做簡單的POSIX範例很好。我會嘗試將我的代碼更改爲Julia的方法並回復給您。 –
@ rickhg12hs從我的測試中,你是對的。這對我來說不是一個大問題,因爲我的數據集不是隨機生成的。與此同時,他們需要時間來加載......我想我會想要使用'SharedArray'或使用「我不喜歡的」局部變量,這是因爲對於我所做的工作,腳本/全局變量最好的工作。 –