为啥我的 MATLAB 神经网络在使用并行处理时训练速度较慢?
Posted
技术标签:
【中文标题】为啥我的 MATLAB 神经网络在使用并行处理时训练速度较慢?【英文标题】:Why does my MATLAB Neural Network train slower when using parallel processing?为什么我的 MATLAB 神经网络在使用并行处理时训练速度较慢? 【发布时间】:2014-04-26 04:33:12 【问题描述】:如果我使用该功能:
net=feedfowardnet([60 60])
net2=train(net,x,t)
训练大约需要 20 分钟。 (我在多台电脑上做过这个具有相同规格,平均时间总是在 20 分钟左右)
如果我使用该功能:
parpool %//starts a local parallel pool connected to 2 workers
net2=train(net,x,t,'useParallel','yes')
完成训练大约需要 40 分钟。我有两个核心,所以这是反直觉的,它应该快两倍,而不是慢两倍。我使用相同的起始网络,以及相同的训练输入和目标。
另外,当我在 NN 训练期间打开任务管理器时,它显示两个 CPU 都在 100% 工作,即使关闭了 parpool
和 useParallel
。
This page Mathworks 网站表示“Parallel Computing Toolbox™ 允许 Neural Network Toolbox™ 在比一台 PC 上容纳的更大数据集上更快地模拟和训练网络。并行训练目前仅支持反向传播训练,不支持用于自组织地图。”
我在数据集中使用了 2000 个训练示例。有 32 个输入和 3 个输出,所以这绝对是一个大数据集。当我只使用net2=train(net,x,t)
函数时,并行池也肯定是关闭的。
我已经测试了parpool
与其他函数的使用(包含parfor
循环的函数),计算速度通常是两倍。似乎只是神经网络训练速度变慢了。
这有什么原因吗?
我使用的是 Intel Core 2 Duo E8400 Cpu @3GHz,我使用的是 MATLAB 版本 R2013 b。我也在网络上(大学内)使用计算机。我不确定这是否会有所作为。
有关大学计算机网络的更多信息。我同时在网络上使用多台计算机。我没有将它们连接在一起以进行分布式计算,每个都只是在自己的 2 个处理器上使用并行计算来做自己的事情。但是我不确定这些计算机是否仍然以某种方式相互干扰,因为它们是使用同一个用户登录的。我使用以下方法将训练输入和目标数据加载到每台计算机上的 matlab 工作区中:
load('H:\18-03-14\x.mat')
load('H:\18-03-14\net.mat')
load('H:\18-03-14\t.mat')
H:
是网络驱动器。我不确定一旦这些在 matlab 工作区中,它们是否仍然以某种方式连接,并在不同的计算机之间相互干扰。是吗?
【问题讨论】:
【参考方案1】:有两种类型的并行:多核和多线程。 MATLAB 实现了支持多核的基本矩阵运算,因此即使没有并行计算工具箱,您的所有内核都可以使用。
并行计算工具箱还允许多线程。多线程有两个优点。首先是它们允许使用 MATLAB 分布式计算服务器跨多台 PC 进行计算,以实现可靠的线性加速。第二个不太明显,即单台 PC 上的多个线程可以改进已经是单线程的多核计算,尽管这似乎违反直觉。但是,使用并行线程会产生额外的开销,因此并非总是如此。更多的核心和更大的问题更有可能加快速度。
您的问题并不大。一个大问题可能是数千个或更多示例中的 10 个,而您的问题只有 2000 个。
此外,每个包含 60 个神经元的两个隐藏层几乎可以肯定是一个比您需要的大得多的网络。您的问题有 2000 个样本 * 3 个输出 = 6000 个约束。您的网络有 32*60+60*60+60*3 权重和 32+60+3 偏差,总共 5795 个可调整变量,几乎与约束数量一样多。我会建议少得多的权重,可能只有一个隐藏层。这将训练得更快,并且也可能更好地泛化。
所以可以从 feedforwardnet(100) 开始,如果没有找到所需的精度,则增加它。
使用这个包含 68,308 个示例的神经网络工具箱示例数据集,您可以看到多线程解决更大问题的好处:
[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
【讨论】:
感谢您的回答。我使用了 3 层,因为我正在逼近一个非常复杂的函数。神经网络接受一个点对着 32 个圆盘的 32 个立体角,然后给出该点的 x、y 和 z 位置。计算圆盘对向立体角的函数本身就很复杂,需要数值方法来逼近椭圆积分(umich.edu/~ners312/Course%20Library/…),所以网络逼近的实际函数会更加复杂。 关于约束数量与权重数量的观点很有趣,你会建议我在这种情况下做什么?我尝试了单层神经网络,这提供了与 3 层神经网络相似的准确性(其架构尚未优化)。我认为一旦优化了 3 层网络的架构,我会得到最好的结果。 Blue7,我总是从更少的神经元和一层开始。一个简单的网络可以有多好,这可能会令人惊讶。只要培训有所改善,只会从那里增加。【参考方案2】:不使用并行计算工具箱的 100% cpu 负载显示,函数train
或相关调用函数是使用多线程实现的。在这些情况下,并行计算工具箱只会增加进程间通信的无用开销。
【讨论】:
感谢您的回答。 matlab 是如何做到这一点的呢?当我只使用net2=train(net,x,t)
进行训练时,它在相关工具栏中定义“没有并行池”。
另外,请参阅有关 Mathworks 的更新问题,说明并行处理应该提高速度。
@Blue7:虽然 m-code 不允许多线程,但在 matlab 中运行的任何 c/c++ 代码都可以通过 Threads 或 OpenMP 使用并行性。这不需要 matlabpool。
这似乎是神经网络工具箱中的一个缺陷。如果train
函数使用并行性,尽管我告诉它,MATLAB 不应该为我提供选项'useParallel'
。过去同时使用并行工具箱和神经网络工具箱时出现了错误:***.com/questions/12948544/…所以你认为这是另一个,我应该总是将'useParallel'设置为'no'
@Blue7:这是一个缺陷,因为它会降低您 PC 的性能?在具有 6 个以上内核的高性能系统上尝试它,它可能会提高性能。以上是关于为啥我的 MATLAB 神经网络在使用并行处理时训练速度较慢?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Matlab 2014a/b 中的 TreeBagger 只使用来自并行池的少数工作人员?
当 Hangfire 并行处理多个作业时,为啥 MySQL InnoDB 会产生如此多的死锁?