Parallel processing 为什么我的MATLAB神经网络在使用并行处理时训练较慢?

Parallel processing 为什么我的MATLAB神经网络在使用并行处理时训练较慢?,parallel-processing,neural-network,matlab,cpu-cores,Parallel Processing,Neural Network,Matlab,Cpu Cores,如果我使用该功能: net=feedfowardnet([60 60]) net2=train(net,x,t) parpool %//starts a local parallel pool connected to 2 workers net2=train(net,x,t,'useParallel','yes') 训练大约需要20分钟。(我在多台{规格相同}的计算机上做过,平均时间总是在20分钟左右) 如果我使用该功能: net=feedfowardnet([60 60]) net

如果我使用该功能:

net=feedfowardnet([60 60])

net2=train(net,x,t)
parpool  %//starts a local parallel pool connected to 2 workers
net2=train(net,x,t,'useParallel','yes')
训练大约需要20分钟。(我在多台{规格相同}的计算机上做过,平均时间总是在20分钟左右)

如果我使用该功能:

net=feedfowardnet([60 60])

net2=train(net,x,t)
parpool  %//starts a local parallel pool connected to 2 workers
net2=train(net,x,t,'useParallel','yes')
完成训练大约需要40分钟。我有两个内核,所以这是违反直觉的,它应该是两倍快,而不是两倍慢。我使用相同的起跑网络,相同的训练投入和目标

此外,当我在NN培训期间打开任务管理器时,它显示两个CPU都在100%工作,即使
parpool
usepallel
已关闭

Mathworks网站的负责人说“并行计算工具箱”™ 神经网络工具箱™ 在比一台PC更大的数据集上更快地模拟和训练网络。并行训练目前仅支持反向传播训练,不支持自组织映射。”

我在数据集中使用了2000个培训示例。有32个输入和3个输出,所以这绝对是一个大数据集。当我只使用
net2=train(net,x,t)
功能时,并行池也肯定会关闭

我已经测试了
parpool
与其他函数(包含
parfor
循环的函数)的使用,计算速度通常是原来的两倍。似乎是神经网络训练的速度变慢了

这有什么原因吗

我使用的是3GHz的Intel Core 2 Duo E8400 Cpu,我使用的是MATLAB版本R2013 b。我也在使用网络上的计算机(在大学里)。我不确定这是否有区别


更多关于大学计算机网络的信息。我同时在网络上使用多台计算机。我并没有用分布式计算的方式将它们连接在一起,每个都只是在自己的2个处理器上使用并行计算来做自己的事情。但是,我不确定这些计算机是否仍然以某种方式相互干扰,因为它们是用同一个用户登录的。我使用以下方法将训练输入和目标数据加载到每台计算机上的matlab工作区:


其中
H:
是网络驱动器。我不确定一旦它们进入matlab工作区,它们是否仍然以某种方式连接在一起,并在不同的计算机之间相互干扰。是吗?

在不使用并行计算工具箱的情况下,100%的cpu负载表明,函数
train
或相关调用函数是使用多线程实现的。在这些情况下,并行计算工具箱只会增加无用的进程间通信开销。

有两种类型的并行:多核和多线程。MATLAB通过多核支持实现基本的矩阵运算,因此即使没有并行计算工具箱,您的所有核心都得到了利用

并行计算工具箱还允许多线程。多线程有两个优点。首先,它们允许使用MATLAB分布式计算服务器跨多台PC执行计算,从而实现可靠的线性加速。第二个不太明显,即一台PC上的多线程可以改进已经存在的单线程多核计算,尽管这可能看起来违反直觉。但是,使用并行线程会有额外的开销,因此情况并非总是如此。更多的内核和大型问题更有可能加速

你的问题不是很大。一个大问题是10个或更多的例子,而你的问题只有2000个

此外,两个隐藏层(每个层有60个神经元)几乎可以肯定是一个比你需要的大得多的网络。您的问题有2000个样本*3个输出=6000个约束。您的网络有32*60+60*60+60*3个权重和32+60+3个偏差,总共5795个可调变量,几乎与约束数量相同。我建议使用更少的权重,可能只有一个隐藏层。这将加快训练速度,并且可能推广得更好

因此,可能从前馈网络(100)开始,如果没有找到所需的精度,则增加该值

使用此神经网络工具箱示例数据集和68308个示例,您可以看到多线程对更大问题的好处:

[x,t] = vinyl_dataset;
net = feedforwardnet(140,'trainscg');
rng(0), tic, net2 = train(net,x,t); toc
parpool
rng(0), tic, net2 = train(net,x,t,'useParallel','yes'); toc

谢谢你的回答。matlab是如何做到这一点的?当我使用just
net2=train(net,x,t)
进行训练时,相关工具栏上会显示“无并行池”。另外,请参阅有关Mathworks的更新问题,说明并行处理应提高速度。@Blue7:虽然m-code不允许多线程,任何在Matlab中运行的C/C++代码都可以通过线程或OpenMP使用并行性。这不需要matlabpool。这似乎是神经网络工具箱中的一个缺陷。如果
train
函数使用并行性,不管我怎么说,MATLAB不应该给我提供选项
'usepallel'
。在过去同时使用并行工具箱和神经网络工具箱时会出现错误:那么你认为这是另一个吗?我应该一直将“useParallel”设置为“no”@Blue7:这是一个缺陷,因为它会降低你电脑的性能?在6+核的高性能系统上试用,它可能会提高性能。谢谢你的回答。我使用了3层,因为我正在逼近一个非常复杂的函数。神经网络获取32个立体角,一个点对32个圆盘,然后给出该点的x、y和z位置。计算圆盘所对立体角的函数本身很复杂,需要数值方法来逼近椭圆积分(),因此网络所逼近的实际函数将更加复杂。关于约束数与权重数的点是int