为啥 Matlab 2014a/b 中的 TreeBagger 只使用来自并行池的少数工作人员?

Posted

技术标签:

【中文标题】为啥 Matlab 2014a/b 中的 TreeBagger 只使用来自并行池的少数工作人员?【英文标题】:Why does TreeBagger in Matlab 2014a/b only use few workers from a parallel pool?为什么 Matlab 2014a/b 中的 TreeBagger 只使用来自并行池的少数工作人员? 【发布时间】:2015-02-02 12:29:18 【问题描述】:

我正在使用 Matlab (R2014a&b) 提供的TreeBagger 类以及分布式计算工具箱。我有一个 local 集群正在运行,有 30 个工作人员,在具有 40 个内核的 Windows 7 机器上。

我调用TreeBagger 构造函数来生成一个回归森林(一个包含32 棵树的集合),传递一个options 结构并将'UseParallel' 设置为'always'

但是,TreeBagger 似乎只使用了 30 个可用工作程序中的 8 个左右(根据每个进程的 CPU 使用率判断,使用任务管理器观察)。当我尝试使用简单的parfor 循环测试池时:

parfor i=1:30
    a = fft(rand(20000));
end

然后所有 30 名工人都参与进来。

我的问题是: (如何)我可以强制TreeBagger 使用所有可用资源吗?

【问题讨论】:

完全推测但是基于UseParallel选项的文档“如果并行计算工具箱的一个parpool是开放的”它可能使用更少的工人,因为它旨在与并行计算工具箱一起工作而不是分布式计算工具箱,因此可能仅限于更少(8 个工人似乎很熟悉,但我相信现在有 12 个) 我认为在某些时候“并行计算工具箱”和“分布式计算工具箱”之间只是简单地重命名了——R2014a 和 b 不再将工作人员的数量限制为 12 个。据我通过单步执行代码可以看出,TreeBagger 只是调用parfor 那里的时代似乎有点落后了...我完全同意已经检查了源代码,TreeBagger 调用了 smartForSliceout 的主循环,它利用了parfor 和@987654337 @(基本上是gcp 的包装器)来确定池大小......所以我不明白为什么所有工作人员都没有参与......问题中的信息表明有 30 个工作人员处于活动状态(除非一些固有的并行化在 fft 中隐藏了池小于 30 的事实 - 这很容易通过 gcp 进行检查) 似乎在任何时候都只有少数工人参与。但是,大多数工作人员在执行执行 TreeBagger 期间的某个时间点变得活跃。看起来好像在某处发生了一些排队。 我建议向 TMW 提交支持请求。他们可能对您的反馈感兴趣并且应该能够指出瓶颈在哪里。 【参考方案1】:

根据 TreeBagger 类的文档,看起来所需的操作非常占用内存。在不了解 Matlab 使用的内部调度系统的更多信息的情况下,调度程序认为将工作负载分配给更少的工作人员并为每个工作人员分配更多内存似乎是解决问题的最有效方法。

使用/可用的 worker 数量也可能取决于系统上的物理内核数量(与超线程内核的数量不同),以及 Matlab 允许消耗的资源。

在少于最大数量的工作人员之间拆分内存密集型任务是 HPC 中解决某些类型问题的常用技术。

【讨论】:

以上是关于为啥 Matlab 2014a/b 中的 TreeBagger 只使用来自并行池的少数工作人员?的主要内容,如果未能解决你的问题,请参考以下文章

为啥matlab中的psnr函数为被柯西噪声破坏的图像返回负值?

matlab中function函数怎么用,为啥出错

为啥是“a^=b^=a^=b;”不同于“a^=b;b^=a;a^=b;”?

matlab中用quadprog时为啥求出的极值和自己后来带入极值点的极值不同

Octave / MATLAB 中的 deal() 函数有啥意义?

Matlab,输入参数太多错误?