Fork me on GitHub

一次XGBoost性能优化-超线程影响运算速度

一、问题背景

  1. 一个朋友在使用 XGBoost 框架进行机器学习编码,他们的一个demo, 在笔记本的虚拟机(4核)运行的时候,只要8s, 但是在一个64核128G 的物理机上面的虚拟机去跑的时候,发现时间需要更长。

    image-20220517103920522

    笔记本执行:

    image-20220517104217425

二、问题定位和解决

首先看到负载是比较高的,内存占用比较少。因为是计算型的,所以这种状态是正常的。

一开始我觉得是GIL 锁,后面询问是使用了 XGBoost 框架,想去官网看看能不能找到相关内容

XGBoost 多线程支持 文档的一段话提醒了我:

我们可以在具有更多核心的机器上运行相同的代码。例如大型的 Amazon Web Services EC2 具有 32 个核心。我们可以调整上面的代码来计算具有 1 到 32 个核心的模型所需的训练时间。结果如下图。

img

XGBoost 在 1 到 32 个核心上训练模型所需的时间

值得注意的是,在多于 16 个线程(大约 7 秒)的情况下,我们没有看到太多进步。我想其原因是 Amazon 仅在硬件中提供 16 个内核,而另外的 16 个核心是通过超线程提供额外。结果表明,如果您的计算机具有超线程能力,则可能需要将 num_threads 设置为等于计算机中物理 CPU 核心的数量。

示例: https://github.com/dmlc/xgboost/blob/master/demo/guide-python/sklearn_parallel.py

我们通过示例将 n_job 的值调整为 cpu 核心的一半,

n_jobs=multiprocessing.cpu_count()//2

发现解决了问题

image-20220517104911783

posted @ 2022-05-29 15:54  自由早晚乱余生  阅读(1115)  评论(0编辑  收藏  举报