如何并行运行Matlab计算

Ras*_*sto 2 parallel-processing matlab backgroundworker background-process

我有Matlab .m脚本,使用Matlab的神经网络工具箱设置和训练神经网络("nn").该脚本启动了一些显示trainig进度的GUI .nn的训练通常需要很长时间.

我在64台处理器核心的计算机上进行这些实验.我想同时训练几个网络,而不必运行多个Matlab会话.所以我想:

  1. 开始训练神经网络
  2. 修改创建网络以创建不同网络的脚本
  3. 开始修改网络的培训
  4. 修改脚本以创建另一个网络...
  5. 多次重复步骤1-4

问题是,当我运行脚本时,它会阻止Matlab终端,所以在脚本执行其最后一个命令之前我不能做任何事情 - 这需要很长时间.如何并行运行所有这些计算?我有Matlab并行工具箱.


编辑:Matlab错误?

更新:此问题似乎只发生在R2012a上,看起来像R2012b上修复.

当我尝试在Edric的答案中推荐的命令序列时,会出现非常奇怪的错误.这是我的代码:

 >> job = batch(c, @nn, 1, {A(:, 1:end -1), A(:, end)});
 >> wait(job);
 >> r = fetchOutputs(job)
 Error using parallel.Job/fetchOutputs (line 677)
 An error occurred during execution of Task with ID 1.

 Caused by:
    Error using nntraintool (line 35)
    Java is not available.
Run Code Online (Sandbox Code Playgroud)

以下是nntraintool(Matlab的神经网络工具包的一部分)27-37行,其中出现错误:

if ~usejava('swing')
  if (nargin == 1) && strcmp(command,'check')
    result = false;
    result2 = false;
    return
  else

    disp('java used');
    error(message('nnet:Java:NotAvailable'));
  end
end 
Run Code Online (Sandbox Code Playgroud)

所以看起来问题是当使用batch命令执行作业时,不能使用GUI(因为Swing不可用).奇怪的是,该nn函数不会以其当前形式启动任何GUI.该错误是由默认启动GUI 的列车引起的,但nn我已将其关闭:

net.trainParam.showWindow = false;
net = train(net, X, y);
Run Code Online (Sandbox Code Playgroud)

更有趣的是,如果nn正常启动相同的函数(>> nn(A(:, 1:end -1), A(:, end));)它永远不会进入第27行的外部if-then语句nntraintool(我已经使用调试器检查过).因此,使用相同的函数,相同的参数表达式将~usejava('swing')计算到0正常启动命令的时间,但在使用时启动时为1 batch.

你怎么看待这件事?它看起来像丑陋的Matlab或神经网络工具箱bug:(((

Edr*_*ric 6

使用Parallel Computing Toolbox,您最多可以运行12个"本地工作人员"来执行您的脚本(要运行更多,您需要购买额外的MATLAB Distributed Computing Server许可证).鉴于您的工作流程,最好的方法是使用BATCH命令提交一系列非交互式作业.请注意,您将无法看到工作人员的任何GUI.您可能会这样做(使用R2012a +语法):

c = parcluster('local'); % get the 'local' cluster object
job = batch(c, 'myNNscript'); % submit script for execution
% now edit 'myNNscript'
job2 = batch(c, 'myNNscript'); % submit script for execution
...
wait(job); load(job) % get the results
Run Code Online (Sandbox Code Playgroud)

请注意,BATCH命令会自动附加脚本副本以运行到作业,以便您在提交后可以自由地对其进行更改.