我的多处理需求非常简单:我在机器学习中工作,有时需要评估多个数据集中的算法,或者需要在数据集中评估多个算法。我只需要通过一些参数运行一个函数并获得一个数字。
我不需要RPC,共享数据,没有。
在朱莉娅(Julia(中,我在以下代码中遇到错误:
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))
核心问题是您需要在之前添加过程您尝试在它们上定义内容。 addprocs
应该始终是您在using
之前做的第一件事(请参见下文(。这就是为什么当您启动Julia时经常使用-p
标志完成的原因。或使用---machinefile <file>
或使用-L <file>
@everywhere
在当前存在的所有进程上登上代码。即@everywhere之后添加的过程没有在它们上执行代码。
也错过了一些@everywheres。
addprocs(3)
@everywhere type Model
param
end
# 1. I have several algorithms/models
models = [Model(i) for i in 1:50]
# 2. I have one dataset
@everywhere X = rand(50, 5)
# 3. I want to paralelize this function
@everywhere function transform(m)
sum(X .* m.param)
end
println(pmap(transform, models))
较少@everywhere
s的替代方案
使用一个块发送整个代码@everywhere
addprocs(3)
@everywhere begin
type Model
param
end
X = rand(50, 5)
function transform(m)
sum(X .* m.param)
end
end
models = [Model(i) for i in 1:50]
println(pmap(transform, models))
使用本地变量
根据需要发送本地变量(包括功能(。尽管这对类型无济于事。
addprocs(3)
@everywhere type Model
param
end
function main()
X = rand(50, 5)
models = [Model(i) for i in 1:50]
function transform(m)
sum(X .* m.param)
end
println(pmap(transform, models))
end
main()
使用模块
当您using Foo
时,模块Foo
已在所有进程上加载。但没有进入范围。这有点怪异和反直观。如此之多,以至于我无法想到一个有效的例子。但是其他人可能。