Matlab 在并行运行时看不到特定函数



这让我很困惑。

我编写了一个函数parObjectiveFunction,它使用createJobcreateTask并行运行多个模拟。它将一个objectiveFunction作为参数,该被更深入地传递到代码中,以计算每个模拟的目标函数值。

当我从找到objectiveFunction的目录中运行parObjectiveFunction时,它按预期工作,但是当我向上一级时,它再也找不到objectiveFunction了。我得到的具体错误是

Error using parallel.Job/fetchOutputs (line 1255)
An error occurred during execution of Task with ID 1.
Error in parObjectiveFunction (line 35)
taskoutput = fetchOutputs(job);
Caused by:
Error using behaviourObjective/getPenalty (line 57)
Undefined function 'objectiveFunction' for input arguments of type 'double'.

(行为目标是一个对象(

这很奇怪,原因有几个。

objectiveFunction肯定在path,当我尝试which objectiveFunction时,它指向正确的功能。 我在其他目录中有更深层次代码的其他组件,并且没有问题地找到它们(它们是对象而不是函数,但这应该没有区别(。parObjectiveFunction中有一行代码可以运行模拟,当我直接在 matlab 命令窗口中运行它时,它会发现objectiveFunction没有问题。 我在本地计算机和 HPC 服务器上得到相同的结果。

我的第一个想法是,单个任务可能有自己的path不包括objectiveFunction,但这应该会给其他组件带来问题(它没有(。这个问题很复杂,因为我无法弄清楚如何调试并行代码。

  1. 我做错了什么?产生该问题的代码如下所示。

  2. 是否存在任何已知问题,即 matlab 在以下情况下找不到函数 使用并行处理与createJobcreateTasksubmitfetchOutputs?。

  3. 当问题出现时,如何在 matlab 中进行调试 仅在并行运行时?我的打印语句均未显示。

要使某些东西适用于外部测试需要相当多的黑客攻击,但为了这个问题,并行函数是:

function penalty = parObjectiveFunction(params, objectiveFunction, N)
% Takes a vector of input parameters, runs N instances of them in parallel
% then assesses the output through the objectiveFunction
n = params(1);
np = params(2);
ees = params(3);
ms = params(4);
cct = params(5);
wt = params(6);
vf = params(7);
dt = 0.001;
bt = 10;
t = 10;

c = parcluster;
job = createJob(c);

testFunction = @(run_number)behaviourObjective(objectiveFunction,n,np,ees,ms,cct,wt,vf,t,dt,bt,run_number);

for i = 1:N
createTask(job, testFunction, 1, {i});
end
submit(job);
wait(job);
taskoutput = fetchOutputs(job);
pensum = 0;
for i = 1:N
pensum = pensum + taskoutput{i}.penalty;
end
penalty = pensum/N;
end

听起来您需要将一些其他文件附加到您的job。您可以通过运行listAutoAttachedFiles来查看 MATLAB 的依赖分析选取了哪些文件,即

job.listAutoAttachedFiles()

如果这没有显示您的objectiveFunction,那么您可以通过修改jobAttachedFiles属性来手动附加它。

不过,似乎objectiveFunction是一个function_handle,所以你可能需要这样的事情:

f = functions(objectiveFunction)
job.AttachedFiles = {f.file}

最新更新