multiprocessing - Julia 等价于 Python multiprocessing.Pool.map

标签 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))

最佳答案

核心问题是您需要在尝试对其进行定义之前添加流程。addprocsusing 之前,应该永远是你做的第一件事。甚至(见下文)。
这就是为什么它经常使用 -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/

相关文章:

c - fscanf 不能正常工作

python - 当你使用Process或Pool实现多处理时,python解释器会做什么?

julia - 如何根据Julia中列中的值查找数据框行的平均值?

julia - 如何在 AMD GPU 上使用 Flux.jl?

julia - 为什么 julia 广播在处理多个数组时不起作用?

python - 如何检测系统是否支持 python 中的进程 fork ?

python - 为什么 Python 的多处理模块中没有 Timer 类?

python - 使用 numpy 数组和共享内存并行化 python 循环

julia - 如何删除 Julia 中的特定行

matrix - Julia 中的黎曼矩阵函数优化