Windows与Ubuntu系统中XGBoost执行时间差异原因及优化咨询
XGBoost在Ubuntu上运行远慢于Windows的原因及优化方法
我有一个包含405行、45列的小型数值型数据集,计划使用R语言的xgboost库构建回归模型,代码如下:
library(tidyverse) library(xgboost) df = read_csv('df.csv') y_train = as.matrix(df$y) x_train = as.matrix(df[, 2:45]) params = list(max_depth = 6, eta = 0.05, subsample=0.8, objective = "reg:squarederror") xgb_train = xgb.DMatrix(data = x_train, label = y_train) s1 = Sys.time() model = xgb.train(data=xgb_train, nrounds = 100, params = params) s2 = Sys.time() print(s2-s1)
在搭载Intel Xeon处理器、128GB内存的Windows电脑上运行该代码耗时约0.5秒,而在搭载Intel Xeon处理器、256GB内存的Ubuntu机器上耗时达1.12分钟。以下是可能的原因及优化方法:
可能的原因
- XGBoost编译版本差异:Windows上的xgboost多为预编译的多线程优化版本,而Ubuntu上的xgboost可能在编译时未启用OpenMP多线程支持,或默认线程数设置过低,无法充分利用CPU核心。
- 编译优化缺失:Ubuntu上的R或xgboost可能使用默认编译选项构建,未开启针对Intel Xeon的CPU指令集优化(如AVX、SSE),而Windows版本通常会做针对性优化。
- 系统资源调度差异:Linux和Windows的线程调度机制不同,Ubuntu可能未给R进程分配足够的CPU资源,或进程优先级较低,导致运行时被其他进程抢占资源。
- 磁盘IO性能差异:若Ubuntu机器使用的磁盘(如机械硬盘)IO性能远低于Windows的SSD,数据读取阶段的耗时会被计入总运行时间,拖慢整体速度。
优化方法
- 启用并配置多线程:
- 先检查xgboost的OpenMP支持:运行
xgboost::xgb.config(),若输出显示OpenMP support: enabled则正常,否则需重新编译xgboost并开启OpenMP。 - 在参数中手动指定线程数,比如修改
params为:
直接利用全部可用CPU核心。params = list(max_depth = 6, eta = 0.05, subsample=0.8, objective = "reg:squarederror", nthread = parallel::detectCores())
- 先检查xgboost的OpenMP支持:运行
- 重新编译xgboost并开启CPU优化:
- 从GitHub克隆xgboost源码,编译时添加优化选项:
之后在R中安装本地编译的版本:git clone --recursive https://github.com/dmlc/xgboost cd xgboost mkdir build && cd build cmake -DUSE_OPENMP=ON -DUSE_AVX=ON -DUSE_SSE=ON .. make -j$(nproc)install.packages("../", repos = NULL, type = "source")。
- 从GitHub克隆xgboost源码,编译时添加优化选项:
- 提升进程优先级:
- 在Ubuntu上运行脚本时,用
nice命令提高R进程优先级:
让系统优先分配CPU资源给该进程。nice -n -10 Rscript your_script_name.R
- 在Ubuntu上运行脚本时,用
- 优化数据读取:
- 改用
data.table包的fread()函数读取数据,其在Linux环境下的读取速度显著优于read_csv():library(data.table) df = fread('df.csv')
- 改用
- 更新xgboost版本:
- 检查当前版本:
packageVersion("xgboost"),若版本较旧,更新到最新稳定版:install.packages("xgboost"),新版本通常会修复性能问题。
- 检查当前版本:
内容的提问来源于stack exchange,提问作者Álvaro Méndez Civieta
相关产品推荐
相关产品推荐

