在IJulia noteb中调用并行处理器上的numpy

2024-09-30 20:31:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在IJulia笔记本中运行一个简单的代码,它使用python库numpy。我用PyCall给numpy打电话:

using PyCall

@pyimport numpy as 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将代码拆分到不同的处理器时,我得到了错误

ERROR (unhandled task failure): On worker 3:

UndefVarError: np not defined

有没有办法让numpy在其他处理器上工作?注意,我有Julia 0.5.2,我有Canopy。我知道在PyCall和Canopy之前也有报道,但我更希望在我的机器上保留Canopy。在


Tags: 函数代码numpyasnp笔记本proc处理器
2条回答

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

根据the documentation,进程是独立的,因此依赖于它们自己的、独立的工作区。因此,流程所需的任何函数、模块或变量都必须首先提供给该流程。在

如果要使某些内容对所有现有进程可用,可以使用@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

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

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上修复,请参见here)。更有效的方法是:

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

相关问题 更多 >