我的多处理需求非常简单:我从事机器学习,有时需要评估多个数据集中的算法,或者数据集中的多个算法,或者其他一些算法。我只需要运行带有一些参数的函数并得到一个数字。
我不需要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))
答案 0 :(得分:3)
核心问题是,您需要在之前添加进程,以尝试在其上定义内容。
在addprocs
之前,using
应该始终是你做的第一件事(见下文)。
这就是为什么当你开始julia时经常使用-p
标志。
或者使用---machinefile <file>
或with a -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
加载到所有进程时。
但没有纳入范围。
这有点奇怪,反直觉。
这么多,以至于我无法想象它的一个实际例子。
但其他人可能。