为了测试一个新系统并了解性能,我重新运行了一个老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%以上。
非硬件差异:
运行7或15个线程之间的差别仅为6%,因此并行化不能很好地扩展,但我仍然希望新的和更高时钟的硬件能够更快地完成.当然也不会变慢。
为什么会这样呢?
编辑:--我运行了许多不同线程数的场景,CPB和SMT打开或关闭。请注意,在某些情况下,系统使用得很轻,所以接近的结果应该在误差范围内考虑。
| 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获得最快的结果。
偶尔对负荷平均值的观察表明,它们会变得非常高,远远超过岩心的数量。也许上下文切换会降低性能?
发布于 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可能会因为更多的重载而表现得更糟。
解决方案是避免嵌套并行,方法之一是:
caret的allowParallel = 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倍,达到:
## user system elapsed
## 109.160 0.638 1168.102训练的执行时间仅为xgboost模型( 2433秒或40.55分钟),占总执行时间的大多数,减少了8倍至5分钟。
https://stackoverflow.com/questions/51622703
复制相似问题