我的多处理需求非常简单:我从事机器学习工作,有时我需要评估多个数据集中的一个算法,或者一个数据集中的多个算法,等等。我只需要运行一个带有一些参数的函数并获取一个数字。
我不需要 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
之前,应该永远是你做的第一件事。甚至(见下文)。
这就是为什么它经常使用 -p
来完成。启动 Julia 时标记。
或使用 ---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。使用一个 block 发送整个代码块
@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
加载到所有进程中。但未纳入范围。
这有点奇怪和反直觉。
如此之多,以至于我无法想出一个可行的例子。
但其他人可能。
关于multiprocessing - Julia 等价于 Python multiprocessing.Pool.map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44741667/