Julia并行编程 - 使所有工作人员都可以使用现有功能

use*_*310 20 parallel-processing for-loop julia

我遇到了以下问题:

我有一个名为TrainModel的函数,它在一个线程上运行很长时间.当它完成计算时,它返回一个函数作为输出参数,让我们称之为f.当我询问这个f的类型时,朱莉娅回归:

(1种方法的通用功能)

(我不确定这最后一条信息对于阅读此内容的人有用)

现在,在第二步中,我需要在非常大的值数组上应用函数f.这是我想要并行化的一个步骤.已经启动了具有多个流程的Julia,例如

julia -p 4
Run Code Online (Sandbox Code Playgroud)

理想情况下,我会使用:

pmap(f, my_values)
Run Code Online (Sandbox Code Playgroud)

也许:

aux = @parallel (hcat) for ii=1:100000000
        f(my_values[ii])
      end
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用.朱莉娅抱怨工人不知道功能f,即我得到一个消息:

错误:过程2中未定义函数f

我怎样才能使功能˚F提供给所有工人呢?显然,一个"脏"的解决方案是对所有工人运行耗时的函数TrainModel,这可能是:

@everywhere f = TrainModel( ... )
Run Code Online (Sandbox Code Playgroud)

但是当我想要的只是结果f可供所有工作人员使用时,这将浪费cpu .

虽然我搜索了类似问题的帖子,但到目前为止我找不到答案......

提前致谢!最好,

N.

drp*_*nar 3

返回函数的方法看起来很优雅,但不幸的是,与 JavaScript 不同,Julia 在创建函数时不会解析所有变量。从技术上讲,您的训练函数可以生成函数的源代码,其中包含所有训练参数的文字值。然后将其传递给每个工作进程,工作进程可以在其环境中将其解析为可调用函数。

我建议返回一个数据结构,其中包含生成训练函数的所有信息:ANN 的权重、支持向量、决策规则...在工作进程上定义一个“训练”函数,以便它将利用训练过的函数参数。无论如何,您可能希望能够将训练结果保存到磁盘,以便您可以轻松地重新生成计算。