XGBoost 2.1 版本深度解析:网络栈重构、联邦学习与多输出新特性全览
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.12.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.42025 年 2 月 6 日兼容 scikit-learn 1.6使用 CUDA 12.8 构建 wheel 并启用 Blackwell 支持适配 RMM 25.02 的 logger 变更。2.1.32024 年 11 月 26 日修复 [pyspark] 大模型体积支持、列采样器column sampler的随机数生成问题、cudf.pandas代理对象的正确处理。2.1.22024 年 10 月 23 日清理 release 脚本、修复 ellpack 分类特征含缺失值、无偏 LTR 与训练续跑、特征约束潜在竞态、arrow 后端 DataFrame 的布尔数组、cub 错误检查、线程数上限、大集群修复以及 POSIX 兼容的poll.h/mmap。2.1.12024 年 7 月 31 日修复 Dask 广播导致 predict 挂起、空分区处理、加密 GRPC 后端的联邦学习、列切分器竞态、系统文件不可读时的优雅降级、FreeBSD 构建等同时新增 JVM 包 Linux ARM64 发布、独立 CPU wheelxgboost-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 提供BroadcastAllgatherV、RingAllgatherV等 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 算法或联邦学习官方给出的两条路径是升级到 glibc 2.28 的新发行版从源码自行构建 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现在兼容列切分引入UBJsonUniversal Binary JSON来序列化列切分时的条目split entries这为向量叶配合基于列的切分提供了支撑伴随若干文档与细节修复。在实现层面UBJSON 已成为 JSON 模块的一等公民在 src/common/json_utils.h 的LoadVector中可以看到同一份数据可以按 JSON 数组F32Array/F64Array或 UBJSON 数组ArrayNumber两种路径解析说明核心数据结构对两种序列化格式是统一对待的。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 JSONUBJSON成为默认模型保存格式旧格式仍可读取但新保存的模型默认使用 UBJSON无格式自动切换移除XGBoosterGetModelRaw该 API 自 1.6 起已弃用2.1 正式删除使用基于 array interface 的新 API不再支持加载远程文件该功能缺乏测试用专门的库先抓取远程内容再本地加载移除 dense libsvm 解析插件该插件从未被测试或文档化使用标准 libsvm 格式弃用XGDMatrixSetDenseInfo与XGDMatrixSetUIntInfo旧式元信息设置接口弃用使用 array interface 方案Python 包还有一个独立的破坏性变更sklearn 接口的fit方法中不再接受eval_metric、early_stopping_rounds、callbacks1.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 logoPR #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 中的竞态问题。PySparkPySpark 接口新增多项能力stage-level scheduling支持在 yarn/k8s 等平台进行阶段级调度训练基于 GPU 的 transform 方法避免不必要的 repartition减少开销按 task ID 排序 worker使结果确定化重构日志与 GPU 代码路径修复verbosity3等问题。Python 新特性与修复sklearn 自定义目标函数支持样本权重新数据类型cudf.pandas、torch.Tensor及更多 scipy 类型支持 pandas 2.2 与 numpy 2.0支持最新 rapids含 rmmdata iterator 的数据缓存选项改进random_state接受 numpy generatorsklearn 接口支持返回 base score 作为截距通过 pandas ext types 支持 arrow处理模型切片与预测中的 np 整数改进 sklearn tags 支持构建 Linux wheel 的基础镜像更新为 rockylinux8。修复方面DMatrix的None输入、原生库发现逻辑、分类数据与 ranker score 函数的配合等均有修正。维护侧Python 预测返回值改用 array interface测试数据集改为合成的 AMES housing 数据。JVM 包更新JVM 包与 PySpark 一样获得stage-level scheduling能力并包含允许 JVM 包访问 inplace predict 方法支持 JDK 17 测试大量依赖更新移除 rabit checkpoint修复错误处理中的内存泄漏与 GPU 包的 group col 问题。维护、文档与 CI2.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 系列的变更给出如下实操建议检查运行时依赖GPU 用户确认nvidia-nccl-cu12可被 pip 正常解析macOS 用户按需自行安装 OpenMP 运行时。评估操作系统如果仍在 CentOS 7 等 glibc 2.28 的环境2.1 只能获得功能受限的manylinux2014变体且该变体将于 2025 年 5 月 31 日停止分发建议规划系统升级或源码构建。核对 API 使用检查代码中是否用到XGBoosterGetModelRaw、XGDMatrixSetDenseInfo/XGDMatrixSetUIntInfo、sklearnfit中的eval_metric等参数及时迁移到新 API。知晓模型格式变化2.1 起保存的模型默认使用 UBJSON 格式跨版本加载模型时留意格式兼容性。分布式用户确认不再依赖 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),仅供参考