首页 > 解决方案 > 为什么gam的拟合时间会随着使用的线程数增加而增加?

问题描述

常识表明,我们使用的内核或线程越多,任何计算都应该越快。如果缩放不好,计算时间不会随着线程数量的增加而改善。因此,如本例所示,当使用 R 包 MGCV 拟合游戏时,增加线程如何显着减少计算时间?:

library(boot) # loads data "amis"

t1<-Sys.time()

mod <- gam(speed ~ s(period, warning, pair, k = 12), data = amis, family=tw (link = log),method="REML",control=list(nthreads=1))  # 

t2<-Sys.time()

print("Model fitted in:")
print(t2-t1)

如果将此示例中的线程数增加到 2、4 等,拟合过程将花费越来越长的时间,而不是像我们预期的那样更快。在我的特殊情况下:

1 个线程:32.85333 秒

2 个线程:50.63166 秒

3 个线程:1.2635 分钟

为什么是这样?如果我做错了什么,我该怎么做才能获得所需的行为(即,随着线程数量的增加提高性能)?

一些注意事项:

1) 此处显示的模型、族和求解方法没有特别意义。这只是一个例子。然而,我已经用真实数据和一个合理的模型解决了这个问题(但为了简单起见,我使用这个小代码来举例说明这个问题)。数据、模型的功能形式、系列、求解方法似乎都无关紧要:经过多次测试,我总是得到相同的行为,即增加使用的线程数,降低性能(即增加计算时间)。

2)操作系统:Linux Ubuntu 18.04;

3) 架构:DELL Power Edge 带有两个物理 CPU Intel Xeon X5660,每个 CPU 有 6 个内核 @2800 Mhz,每个内核能够处理 2 个线程(即总共 24 个线程)。80Gb 内存。

4)安装了OpenMP库(函数gam的多线程能力所需)

sudo apt-get install libomp-dev

5)我知道多核使用 gam 的帮助页面(https://stat.ethz.ch/R-manual/R-devel/library/mgcv/html/mgcv-parallel.html)。那里写的唯一指出随着线程数量增加而降低性能的是“因为 mgcv 中的计算负担全部在线性代数中,那么并行计算可能会通过调整的 BLAS 提供减少的(...)好处”。

标签: rmultithreadingperformancegammgcv

解决方案


推荐阅读