首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新硬件运行R码比旧硬件慢

新硬件运行R码比旧硬件慢
EN

Stack Overflow用户
提问于 2018-07-31 21:59:36
回答 1查看 124关注 0票数 0

为了测试一个新系统并了解性能,我重新运行了一个老R工程,它有一个用于机器学习的定时代码块。

New: 雷森72700X (8个核心,16个线程;base/boost clock = 3.7/4.3 GHz),Fedora 28

英特尔i7 4710总部英特尔i7 4710总部(4个核心,8个线程;基/升压时钟= 2.5/3.5 GHz),Windows 7

结果令我震惊--新系统比旧系统慢了20%以上。

非硬件差异:

  • Windows 7与Fedora 28 (不知道这是否会影响性能,但这个职位报告有显著差异)。默认情况下,Windows中的R有更多的优化库吗?
  • R的版本(来自system的Fedora: R-3.5.0-4.fc28 )和使用的包不一样,但由于2+年份的不同,我认为更新的版本和硬件将具有性能优势。

运行7或15个线程之间的差别仅为6%,因此并行化不能很好地扩展,但我仍然希望新的和更高时钟的硬件能够更快地完成.当然也不会变慢。

为什么会这样呢?

编辑:--我运行了许多不同线程数的场景,CPB和SMT打开或关闭。请注意,在某些情况下,系统使用得很轻,所以接近的结果应该在误差范围内考虑。

代码语言:javascript
复制
| user    | system | elapsed  | OS        | CPU       | Threads | Turbo/CPB | HT/SMT | Load average |  
|---------|--------|----------|-----------|-----------|---------|-----------|--------|--------------|  
| 126.421 | 0.532  | 2275.998 | Fedora 28 | R7 2700X  | 8       | ON        | OFF    | >42          |
| 126.583 | 0.541  | 2324.118 | Fedora 28 | R7 2700X  | 7       | ON        | OFF    | ?            |
| 136.636 | 0.574  | 2433.931 | Fedora 28 | R7 2700X  | 7       | OFF       | OFF    | ?            |
| 221.49  | 7.48   | 2679.77  | Windows 7 | i7 4710HQ | 7       | ON        | ON     | ?            |
| 155.427 | 0.555  | 3233.690 | Fedora 28 | R7 2700X  | 15      | ON        | ON     | >100         |
| 168.859 | 0.609  | 3247.277 | Fedora 28 | R7 2700X  | 15      | ON        | ON     | ?            |
| 173.312 | 0.650  | 3250.313 | Fedora 28 | R7 2700X  | 16      | ON        | ON     | >70          |
| 161.403 | 0.611  | 3270.098 | Fedora 28 | R7 2700X  | 14      | ON        | ON     | ?            |
| 162.120 | 0.540  | 3442.758 | Fedora 28 | R7 2700X  | 7       | ON        | ON     | ?            |

摘要:更多的线程更好,CPB=ON似乎总是有帮助,但是转动SMT=OFF获得最快的结果。

偶尔对负荷平均值的观察表明,它们会变得非常高,远远超过岩心的数量。也许上下文切换会降低性能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-14 03:06:48

高核心计数CPU性能下降的原因是嵌套并行,这是由于caret和模型(在本例中为xgboost)都并行化造成的。这会重载CPU,这是由高负载平均值指示的,并导致执行时间缓慢。

来自caret's 文档

train、rfe、sbf、bag和avNNet在各自的控制文件allowParallel中添加了一个参数,默认为TRUE。如果为真,如果注册了并行后端(例如doMC),代码将并行执行。当allowParallel = FALSE时,并行后端总是被忽略。用例是rfe或sbf调用train时。如果使用具有P处理器的并行后端,则这些函数的组合将创建P^2进程。

如果有P CPU内核的P^2进程,这意味着每个内核被过载为P的一个因子,因此更高的核心数量CPU可能会因为更多的重载而表现得更糟。

解决方案是避免嵌套并行,方法之一是:

  • 使用模型的并行化而不使用并行后端。这可以通过设置caretallowParallel = FALSE来完成。
  • 使用并行后端,不允许模型并行化。在xgboost的情况下,这可以通过设置nthread = 1来完成。这个参数可以用caret::train设置,也可以在caretEnsemble::caretList中设置。tuneList=list(xgbLinear=caretModelSpec(method="xgbLinear", nthread=1))

有趣的博客文章的作者caret的作者帮助展示了每种方法何时更有利:在单个长时间运行的模型中,前者的解决方案;如果有多个resample,后者。

通常,我们希望并行化算法中运行时间最长的部分。

使用后一种方法,使用15个辅助后端SMT=ON、CPB=ON、Fedora 28,Ryzen 7 2700X上的总体执行时间大幅提高,减少了大约2.8倍,达到:

代码语言:javascript
复制
##     user   system  elapsed 
##  109.160    0.638 1168.102

训练的执行时间仅为xgboost模型( 2433秒或40.55分钟),占总执行时间的大多数,减少了8倍至5分钟。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51622703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档