0

我想在使用 python 库 numpy 的 IJulia 笔记本中运行一个简单的代码。我用 PyCall 调用 numpy:

使用 PyCall

@pyimport numpy 作为 np

这工作正常。然后我想把它分成几个处理器。我添加处理器:

addprocs(4)

然后,我为函数 f 运行 N/proc 迭代,其中 proc 是我的处理器数量。我在计算机上的四个处理器之间平均分配负载:

n=round(Int,N/proc);

proc_sum = @parallel (+) for i=1:proc

        f(n)

end

return proc_sum / proc

没有 numpy,这可以正常工作。但是,当我尝试使用 numpy 将代码拆分到不同的处理器时,出现错误

错误(未处理的任务失败):在工人 3 上:

UndefVarError: np 未定义

有什么办法可以在其他处理器上进行 numpy 工作?请注意,我有 Julia 0.5.2,我有 Canopy。我知道之前有人报告过 PyCall 和 Canopy 的问题,但我更希望将 Canopy 保留在我的机器上。

4

2 回答 2

2

为了进一步扩展已经说过的内容,您需要的所有内容都应该加载到所有进程中。例如。:

addprocs(4) @everywhere using PyCall @everywhere @pyimport numpy as np

您写的内容出错,因为所有进程都尝试使用@pyimport但只有主进程已PyCall加载。如果您需要许多包来进行计算,也许更容易的是在一个脚本中完成所有加载,即load_modules.jl然后简单地运行

addprocs(4) @everywhere include("load_modules.jl")

编辑:这似乎using不是很健壮@everywhere(固定在 Julia 0.6 上,请参见此处)。似乎效果更好的是:

addprocs(4) import PyCall @everywhere using PyCall @everywhere @pyimport numpy as np

于 2017-05-23T16:07:34.330 回答
0

我正在扩展林登的评论以提供更全面的答案。

根据文档,流程是独立的,因此依赖于自己独立的工作空间。因此,进程需要的任何函数、模块或变量都需要首先可供该进程使用。

如果你想让某些东西对所有现有进程都可用,你可以使用@everywhere宏;显然,要使“所有现有流程”都可以使用某些东西,首先需要创建这些流程。

所以:

addprocs(4); # create 4 extra processes (i.e. workers); this is in addition
             # to the main process that handles the REPL

@everywhere import Pycall
@everywhere PyCall.@pyimport numpy as np # load module on _all_ 5 active processes
于 2017-05-23T07:07:34.897 回答