前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >xgboost 多线程,解决默认开启线程数为cpu个数问题

xgboost 多线程,解决默认开启线程数为cpu个数问题

作者头像
lovelife110
发布2021-01-14 16:22:50
发布2021-01-14 16:22:50
2.2K00
代码可运行
举报
文章被收录于专栏:爱生活爱编程爱生活爱编程
运行总次数:0
代码可运行

环境

python 3.6 xgboost 1.0.1

现象

在一台48c的服务器上,就import xgboost,还没进行训练,通过命令发现,线程数就达到48个 代码:

代码语言:javascript
代码运行次数:0
复制
import time
import xgboost

if __name__ == '__main__':
    print("睡眠开始")
    time.sleep(15)
    print("睡眠结束")

这里启了一个镜像,通过Linux中/proc/pid/status查询线程数

代码语言:javascript
代码运行次数:0
复制
pid=`docker top fad7c792ccf35b65ddd | grep test.py |  awk '{print $2}'`;cat /proc/$pid/status  

查询到的线程数为48

原理

在XGBoost里,单机多线程,并没有通过显式的pthread这样的方式来实现,而是通过OpenMP来完成多线程的处理,这可能跟XGBoost里多线程的处理逻辑相对简单,没有复杂的线程之间同步的需要,所以通过OpenMP可以支持得比较好,也简化了代码的开发和维护负担。

OpenMP

OpenMP 是 Open MultiProcessing 的缩写。是一套支持跨平台共享内存方式的多线程并发的编程API。 在项目程序已经完成好的情况下不需要大幅度的修改源代码,只需要加上专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。 例如 #pragma omp parallel for

解决方案

omp_num_threads

对于调用OpenMP的lib编译编译成OpenMP的程序,对于加了#pragma的代码,默认情况下会调用和你CPU内核数相同数量的线程来执行这段程序。而可以通过设置环境变量OMP_NUM_THREADS 来控制线程数。

python可以通过以下设置环境变量omp_num_threads

代码语言:javascript
代码运行次数:0
复制
import os
os.environ['OMP_NUM_THREADS'] = "1"

xgboost多线程

对于sklearn的XGBClassifier、XGBModel 可以通过设置n_jobs来控制线程数

对于原生的xgboost,通过nthread来控制线程数

如果没有通过OMP_NUM_THREADS变量来控制,那么配置了n_jobs或者nthread,则在原有48核的基础上,再调整线程数。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/09/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境
  • 现象
  • 原理
    • OpenMP
  • 解决方案
    • omp_num_threads
  • xgboost多线程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档