Julia等效于Python多处理.pool.map



我的多处理需求非常简单:我在机器学习中工作,有时需要评估多个数据集中的算法,或者需要在数据集中评估多个算法。我只需要通过一些参数运行一个函数并获得一个数字。

我不需要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已在所有进程上加载。但没有进入范围。这有点怪异和反直观。如此之多,以至于我无法想到一个有效的例子。但是其他人可能。

相关内容

  • 没有找到相关文章

最新更新