matlab - 如何并行运行 Matlab 计算

标签 matlab parallel-processing backgroundworker background-process

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

我正在具有 64 个处理器核心的计算机上进行这些实验。我想同时训练多个网络,而无需运行多个 Matlab session 。 所以我想:

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

问题是,当我运行脚本时,它会阻塞 Matlab 终端,因此我无法执行任何其他操作,直到脚本执行最后一个命令 - 这需要很长时间。我如何并行运行所有这些计算?我有Matlab并行工具箱。

<小时/>

编辑:Matlab 错误??

更新:此问题似乎仅发生在 R2012a 上,看起来在 R2012b 上已修复。

当我尝试 Edric's answer 中推荐的命令序列时,出现非常奇怪的错误。 这是我的代码:

 >> 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.

这是 nntraintool 的第 27-37 行(Matlab 神经网络工具包的一部分)错误起源于:

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 

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

net.trainParam.showWindow = false;
net = train(net, X, y);

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

你对此有何看法? 它看起来像丑陋的 Matlab 或神经网络工具箱错误 :(((

最佳答案

使用并行计算工具箱,您最多可以运行 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

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

关于matlab - 如何并行运行 Matlab 计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12948544/

相关文章:

c# - 在对象中使用 BackgroundWorker 并更新 UI

java - Matlab Java 互操作性

matlab - 在 Matlab 中列出/查看/清除持久变量

python - 如何并行化一个简单的 Python 循环?

wpf - 如何在 Dispatcher 中访问 WPF 对象?

c# - 一个后台工作线程和多个进度条

Matlab - 计算向量中每个元素的概率

image - 在 MATLAB 绘图中创建分形图像,但绘图为空

c++ - 私有(private)子句中的变量与 OpenMP 中并行区域中定义的变量之间有什么区别吗?

parallel-processing - Redis 随客户端数量扩展