r - 为什么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 提供减少的(...)好处”。
解决方案
推荐阅读
- java - 为什么 Java 中的 hashcode 不使用 long 来存储 hash 值?
- botframework - 尝试了来自 Microsoft.Bot.Sample.AadV2Bot 的代码,但甚至在本地获取 AADSTS50011(回复 url 不匹配)
- java - Web 应用程序是否将代码隐式包装在禁止 JVM 优化的 try-catch 块中?
- python - 保证在进程终止时调用销毁
- python - 字典值的总和列表
- jquery - Jquery 到 setTimeout()
- java - 使用 Akka Kafka Streams 时不兼容的等式约束
- spring - OncePerRequestFilter - 处理带有 @ResponseStatus 注释的异常
- python - 如何从 react-js 执行 python 脚本?
- python - 如何在整数字段中使用 Django intcomma