XGBoost 2.1 版本深度解析:网络栈重构、联邦学习与多输出新特性全览
2026/9/19 22:15:40 网站建设 项目流程

XGBoost 2.1 版本深度解析:网络栈重构、联邦学习与多输出新特性全览

【免费下载链接】xgboostScalable, Portable and Distributed Gradient Boosting (GBDT, GBRT or GBM) Library, for Python, R, Java, Scala, C and more. Runs on single machine, Hadoop, Spark, Dask, Flink and DataFlow项目地址: https://gitcode.com/gh_mirrors/xg/xgboost

本指南基于仓库内官方发布说明 doc/changes/v2.1.0.rst 撰写,系统梳理 XGBoost 2.1.0 主版本及 2.1.1~2.1.4 补丁版本的核心变更:网络层 RABIT 模块重构、NCCL 动态加载、glibc 双变体分发、联邦学习 column-split、多输出(multi-output)训练以及大量 Python/JVM 包级改进,并结合仓库源码给出实现层面的佐证。读完本文,你将完整掌握 2.1 系列版本的特性清单、破坏性变更与迁移要点,能够据此评估和升级自己的 XGBoost 环境。

版本概览:一个主版本与四个补丁版本

2.1.0 于 2024 年 6 月 20 日发布,是 2.1 系列的主版本。官方在该版本中明确说明:由于正在开发一套全新的 R 接口,此版本暂不包含 R 包,R 包将随新接口就绪后单独更新。其后共发布了四个补丁版本,各自聚焦不同的修复目标:

  • 2.1.4(2025 年 2 月 6 日):兼容 scikit-learn 1.6;使用 CUDA 12.8 构建 wheel 并启用 Blackwell 支持;适配 RMM 25.02 的 logger 变更。
  • 2.1.3(2024 年 11 月 26 日):修复 [pyspark] 大模型体积支持、列采样器(column sampler)的随机数生成问题、cudf.pandas代理对象的正确处理。
  • 2.1.2(2024 年 10 月 23 日):清理 release 脚本、修复 ellpack 分类特征含缺失值、无偏 LTR 与训练续跑、特征约束潜在竞态、arrow 后端 DataFrame 的布尔数组、cub 错误检查、线程数上限、大集群修复以及 POSIX 兼容的poll.h/mmap
  • 2.1.1(2024 年 7 月 31 日):修复 Dask 广播导致 predict 挂起、空分区处理、加密 GRPC 后端的联邦学习、列切分器竞态、系统文件不可读时的优雅降级、FreeBSD 构建等;同时新增 JVM 包 Linux ARM64 发布、独立 CPU wheel(xgboost-cpu)以及 CUDA Toolkit 12.5 + 最新 CCCL 构建支持。

注意:以上补丁版本均基于 2.1.0 主线累积,本文后续章节主要以 2.1.0 主版本的变更脉络展开,并在相关小节中并入补丁版本的关键修复。

网络层重构:RABIT 模块全面翻新

2.1 最重要的底层工作是对通信模块的彻底重构。XGBoost 原有的网络库继承自 RABIT 项目,已无法满足弹性扩展(scaling)与跨平台联邦学习的新需求。官方选择自研替代方案而非引入现成库,原因是该模块仍处于高频演进期——例如联邦学习需要持续加载额外插件这类新特性请求不断出现。

从源码结构看,重构后的通信层集中在 src/collective 目录,包含 allreduce、allgather、broadcast、comm、coll、tracker 等模块。其中 aggregator.h 实现了求和、求最大等归约操作(如Allreduce(ctx, values, collective::Op::kSum)),allgather.h 提供BroadcastAllgatherVRingAllgatherV等 gather 变体,这些正是新 RABIT 内置操作(broadcast、allgatherV、allreduce)的实现基础。

新实现带来的能力包括:

  • CPU 与 GPU 双通道通信:GPU 通信基于 NCCL。
  • 可复用的 tracker:同一套 tracker 同时服务 Python 包与 JVM 包,JVM 包从此不再依赖 Python 作为运行时组件。
  • 联邦通信模式:CPU 与 GPU 均支持。
  • 超时(timeout)支持:高层接口参数当前硬编码为 30 分钟,官方计划后续改进为可配置。
  • 显著更多的数据类型支持,以及基于线程的 worker。
  • 改进的 worker 错误处理:当训练中某个对端(peer)死亡时,给出更清晰的错误信息。
  • IPv6 支持:目前仅 Dask 接口支持。
  • 内建操作集:broadcast、allgatherV、allreduce 等。

同时,RABIT 中既有的MPI 选项被移除(对应 PR #9525)。如果你此前依赖 MPI 方式运行分布式训练,升级 2.1 后需要改用内置的 socket/NCCL 通信路径。

NCCL 改为从 PyPI 动态加载

在 2.1 之前,XGBoost 将 NCCL 静态链接进二进制,导致二进制体积显著膨胀,甚至触及 PyPI 的上传体积上限。2.1 起改为运行时从外部动态加载 NCCL

  • 二进制体积大幅缩小;
  • PyPI 包安装时会自动拉取nvidia-nccl-cu12依赖;
  • 由于下游包也在复用同一份 NCCL,用户环境整体可以变得更精简。

这意味着 2.1 之后的 GPU 环境依赖管理方式发生了变化:安装xgboost的 GPU 版本时,nvidia-nccl-cu12会作为依赖被一并解析,这一点在排查"GPU 训练报找不到 NCCL"类问题时值得注意。

分发策略调整:glibc 2.28+ 与双变体 wheel

从 2.1.0 开始,XGBoost Python 包以两种变体分发:

变体适用系统功能范围
manylinux_2_28glibc 2.28 或更新版本全部特性开启(含 GPU 算法与联邦学习)
manylinux2014glibc 早于 2.28 的旧发行版不含GPU 算法与联邦学习

pip会根据目标系统自动选择合适的变体。官方同时给出明确时间表:自 2025 年 5 月 31 日起停止分发manylinux2014变体,只保留manylinux_2_28,原因是 CI/CD 流水线不想再依赖已到达生命周期终点(EOL)的组件(如 CentOS 7)。

如果你需要在旧发行版上使用 GPU 算法或联邦学习,官方给出的两条路径是:

  1. 升级到 glibc 2.28+ 的新发行版;
  2. 从源码自行构建 XGBoost。

多输出(Multi-output)与向量叶进展

2.1 继续推进多目标(multi-target)与向量叶(vector leaf)特性,虽然官方明确提示该特性仍在开发中、尚不适合生产使用,但本轮改动非常实质:

  • 新 APIXGBoosterTrainOneIter:重写了自定义目标(custom objective)的支持方式。从 C 头文件 include/xgboost/c_api.h 可见,XGBoosterTrainOneIter(handle, dtrain, iter, grad, hess)接受以 JSON 编码的(cuda)_array_interface形式的梯度和 Hessian,因此天然支持 strided 矩阵和 CUDA 输入;自定义目标函数的预测返回形状(shape)也在此版本中得到修正。旧的XGBoosterBoostOneIter已标注@deprecated since 2.1.0
  • hinge目标函数支持多目标回归
  • 修复向量叶场景下的增益(gain)计算
  • 支持多目标树的 graphviz 可视化(对应 PR #10093)。
  • 修复交替策略(alternating strategies)下的多输出

联邦学习:column-split 全面增强

2.1 在联邦学习上取得了重要进展,重点是**列切分(column-split,即按特征维度横向切分数据)**支持的完善:

  • 列切分同时支持 CPU 与 GPU;
  • 分类数据(categorical data)现在兼容列切分
  • 引入UBJson(Universal Binary JSON)来序列化列切分时的条目(split entries),这为向量叶配合基于列的切分提供了支撑;
  • 伴随若干文档与细节修复。

在实现层面,UBJSON 已成为 JSON 模块的一等公民:在 src/common/json_utils.h 的LoadVector中可以看到,同一份数据可以按 JSON 数组(F32Array/F64Array)或 UBJSON 数组(Array+Number)两种路径解析,说明核心数据结构对两种序列化格式是统一对待的。

SYCL 支持:从推理到训练的进行时

XGBoost 正在开发面向 SYCL 设备的插件,起步范围是hist树方法(相关实现位于 plugin/sycl)。2.1 的进展是:

  • 支持在 SYCL 设备上启动推理(inference)
  • 训练(training)的 SYCL 支持仍在开发中
  • 官方规划在后续版本完成训练支持,然后重点提升 SYCL 的测试覆盖率(尤其是 Python 测试)。

注意 SYCL 目前是插件形态,并非默认编译进核心二进制。

性能优化

2.1 的性能相关工作集中在三处:

  • CUDA 上的列采样器(column sampler):为 GPU 树方法实现了 CUDA 版本的列采样,配合列采样(colsample_*参数)训练时速度更快。对应类ColumnSampler定义于 src/common/random.h,在 src/tree/hist/evaluate_splits.h 中由 hist 树方法在每个分裂节点获取特征集时调用。
  • CMake LTO 与 CUDA arch:构建系统的链接时优化(LTO)与 CUDA 架构选择得到改进(PR #9677)。
  • 外部内存(external memory)的小型线程池优化:减少了迭代期间启动的线程数量。

弃用与破坏性变更清单

升级到 2.1 前,请务必核对以下破坏性变更:

变更影响替代方案
命令行接口(CLI)弃用机器学习生态日益复杂,用 shell 命令行训练模型不再可行且易误导新手使用 Python / JVM / R 等编程接口
Universal binary JSON(UBJSON)成为默认模型保存格式旧格式仍可读取,但新保存的模型默认使用 UBJSON无,格式自动切换
移除XGBoosterGetModelRaw该 API 自 1.6 起已弃用,2.1 正式删除使用基于 array interface 的新 API
不再支持加载远程文件该功能缺乏测试用专门的库先抓取远程内容再本地加载
移除 dense libsvm 解析插件该插件从未被测试或文档化使用标准 libsvm 格式
弃用XGDMatrixSetDenseInfoXGDMatrixSetUIntInfo旧式元信息设置接口弃用使用 array interface 方案

Python 包还有一个独立的破坏性变更:sklearn 接口的fit方法中不再接受eval_metricearly_stopping_roundscallbacks(1.6 起弃用,2.1 移除),这些参数必须在构造器中同名传入。

通用新特性

以下是所有语言绑定通用的新特性:

  • 原生 DataFrame 数据格式支持:XGBoost 核心现在可以直接消费 dataframe 结构(pandas、arrow、R dataframe),在性能与内存占用上均有改善。Arrow 支持即构建于此之上。
  • gamma 回归默认度量改为deviance
  • 新增lambdarank_normalization参数:使学习排序(learning to rank)的归一化变为可选项。从 src/common/ranking_utils.h 的LambdaRankParam定义看,该参数默认值为true,含义为"是否对 lambda rank 的叶值进行归一化";实际训练时在 src/objective/lambdarank_obj.cc 中据此决定是否对梯度做归一化。
  • QuantileDMatrix支持 CPU 上的贡献度(contribution)预测(即 SHAP 类贡献分解)。
  • macOS 构建不再捆绑 OpenMP 运行时:用户可自行通过包管理器安装最新运行时;同时 macOS 上的 JVM 包改为启用 OpenMP 构建。

2.1 还更换了全新的 XGBoost logo(PR #10270)。

Python 包更新

Dask 接口

除网络层变更外,Dask 接口的优化包括:

  • 在 worker 上过滤模型而非在客户端过滤,避免客户端机器 OOM;
  • 推荐使用from xgboost import dask而非import xgboost.dask,以免非 Dask 用户引入不必要的依赖。这一用法在 python-package/xgboost/dask/init.py 的模块文档中即采用from xgboost import dask as dxgb的写法;
  • 新增与 k8s 结合使用 Dask XGBoost 的文档;
  • 为 demo 添加随机种子,保证可复现;
  • 修复空分区产生的未对齐指针,以及最新 dask 中的竞态问题。

PySpark

PySpark 接口新增多项能力:

  • stage-level scheduling:支持在 yarn/k8s 等平台进行阶段级调度训练;
  • 基于 GPU 的 transform 方法
  • 避免不必要的 repartition,减少开销;
  • 按 task ID 排序 worker,使结果确定化;
  • 重构日志与 GPU 代码路径,修复verbosity=3等问题。

Python 新特性与修复

  • sklearn 自定义目标函数支持样本权重;
  • 新数据类型:cudf.pandastorch.Tensor及更多 scipy 类型;
  • 支持 pandas 2.2 与 numpy 2.0;
  • 支持最新 rapids(含 rmm);
  • data iterator 的数据缓存选项改进;
  • random_state接受 numpy generator;
  • sklearn 接口支持返回 base score 作为截距;
  • 通过 pandas ext types 支持 arrow;
  • 处理模型切片与预测中的 np 整数;
  • 改进 sklearn tags 支持;
  • 构建 Linux wheel 的基础镜像更新为 rockylinux8。

修复方面:DMatrixNone输入、原生库发现逻辑、分类数据与 ranker score 函数的配合等均有修正。维护侧,Python 预测返回值改用 array interface,测试数据集改为合成的 AMES housing 数据。

JVM 包更新

JVM 包与 PySpark 一样获得stage-level scheduling能力,并包含:

  • 允许 JVM 包访问 inplace predict 方法;
  • 支持 JDK 17 测试;
  • 大量依赖更新;
  • 移除 rabit checkpoint;
  • 修复错误处理中的内存泄漏与 GPU 包的 group col 问题。

维护、文档与 CI

2.1 在工程基建上的投入同样可观:

  • CMake 脚本增加格式化与 lint 要求;
  • 对 32 位架构直接抛出错误;
  • 修复 mingw 在 regex 上的挂起问题;
  • 新增 XGBoost 特性的粗粒度地图与语言绑定一致性指南(doc/contrib/consistency.rst)等文档改进;
  • CI 方面:上传 Python 包元信息便于解析、改进 Apple 设备支持、Windows 流水线在 pytest 失败时停止、新 commit 发布时取消旧的 GH Action 任务、用 CMake 测试 R 包、测试 32 位架构构建、用 GitHub Action 测试联邦插件。

升级与迁移建议

结合 2.1 系列的变更,给出如下实操建议:

  1. 检查运行时依赖:GPU 用户确认nvidia-nccl-cu12可被 pip 正常解析;macOS 用户按需自行安装 OpenMP 运行时。
  2. 评估操作系统:如果仍在 CentOS 7 等 glibc < 2.28 的环境,2.1 只能获得功能受限的manylinux2014变体,且该变体将于 2025 年 5 月 31 日停止分发,建议规划系统升级或源码构建。
  3. 核对 API 使用:检查代码中是否用到XGBoosterGetModelRawXGDMatrixSetDenseInfo/XGDMatrixSetUIntInfo、sklearnfit中的eval_metric等参数,及时迁移到新 API。
  4. 知晓模型格式变化:2.1 起保存的模型默认使用 UBJSON 格式,跨版本加载模型时留意格式兼容性。
  5. 分布式用户:确认不再依赖 MPI 选项;Dask 用户改用from xgboost import dask导入,并注意 IPv6 仅在 Dask 接口可用。

关于新 R 接口与 SYCL 训练支持,官方明确列为后续版本的工作重点,属于"进行中"状态,生产选型时应结合这一前提评估。

【免费下载链接】xgboostScalable, Portable and Distributed Gradient Boosting (GBDT, GBRT or GBM) Library, for Python, R, Java, Scala, C and more. Runs on single machine, Hadoop, Spark, Dask, Flink and DataFlow项目地址: https://gitcode.com/gh_mirrors/xg/xgboost

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询