Julia相当于Python multiprocessing.Pool.map

时间:2017-06-24 22:52:50

标签: multiprocessing julia

我的多处理需求非常简单:我从事机器学习,有时需要评估多个数据集中的算法,或者数据集中的多个算法,或者其他一些算法。我只需要运行带有一些参数的函数并得到一个数字。

我不需要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))

1 个答案:

答案 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加载到所有进程时。 但没有纳入范围。 这有点奇怪,反直觉。 这么多,以至于我无法想象它的一个实际例子。 但其他人可能。