XGBoost GPU 支持

本页面包含有关 XGBoost 支持的 GPU 算法的信息。

注意

需要 CUDA 12.0,计算能力 5.0(请参阅此列表以查找您的 GPU 卡的计算能力)。

CUDA 加速的树构建算法

XGBoost 中的大多数算法,包括训练、预测和评估,都可以使用支持 CUDA 的 GPU 进行加速。

用法

要启用 GPU 加速,请将 device 参数指定为 cuda。此外,可以使用 cuda:<ordinal> 语法指定设备序号(如果您在同一节点中有多个设备,则指定要使用的 GPU),其中 <ordinal> 是表示设备序号的整数。XGBoost 默认为 0(CUDA 运行时报告的第一个设备)。

GPU 算法目前适用于 CLI、Python、R 和 JVM 包。有关详细信息,请参阅安装指南

Python 示例
params = dict()
params["device"] = "cuda"
params["tree_method"] = "hist"
Xy = xgboost.QuantileDMatrix(X, y)
xgboost.train(params, Xy)
使用 Scikit-Learn 接口
XGBRegressor(tree_method="hist", device="cuda")

GPU 加速的 SHAP 值

当使用 GPU 时,XGBoost 使用 GPUTreeShap 作为计算 SHAP 值的后端。

booster.set_param({"device": "cuda:0"})
shap_values = booster.predict(dtrain, pred_contribs=True)
shap_interaction_values = model.predict(dtrain, pred_interactions=True)

有关工作示例,请参阅使用 GPU 加速 SHAP 值计算

多节点多 GPU 训练

XGBoost 支持使用 DaskSparkPySpark 进行完全分布式 GPU 训练。要开始使用 Dask,请参阅我们的教程使用 Dask 的分布式 XGBoost 和工作示例XGBoost Dask 特性演练,以及 Python 文档Dask API 以获取完整参考。有关使用 Scala 的 Spark 的用法,请参阅XGBoost4J-Spark-GPU 教程。最后,有关使用 PySpark 进行分布式 GPU 训练,请参阅使用 PySpark 的分布式 XGBoost

RMM 集成

XGBoost 提供对 RMM 集成的可选支持。有关更多信息,请参阅将 XGBoost 与 RAPIDS 内存管理器 (RMM) 插件一起使用

内存使用

以下是关于 GPU 上 hist 树方法的设备内存使用的一些指导原则。

XGBoost 训练中的内存通常由两个原因分配:存储数据集和工作内存。

数据集本身以压缩的 ELLPACK 格式存储在设备上。ELLPACK 格式是一种稀疏矩阵类型,它以恒定的行步长存储元素。与 CSR 相比,这种格式便于并行计算,因为每个元素的行索引可以直接从其内存地址中得知。ELLPACK 格式的缺点是,如果最大行长度显著大于平均行长度,则其内存效率会降低。元素被量化并存储为整数。这些整数被压缩到最小位长度。根据特征的数量,我们通常不需要 32 位整数的完整范围来存储元素,因此将其压缩。压缩后的量化 ELLPACK 格式通常只占用浮点 CSR 矩阵的 1/4 空间。

工作内存是根据行数在算法内部分配的,用于跟踪梯度、树位置和其他每行统计信息。内存按直方图 bins 的数量、特征数量和树中的节点数量成比例分配给直方图 bins。出于性能考虑,我们会在树中从上一个节点开始保留直方图在内存中,当内存使用达到一定阈值时,我们会停止这样做以节省内存,但这会损失一些性能。

如果您在大型数据集上遇到内存不足错误,请首先尝试使用 xgboost.QuantileDMatrix。如果您可以使用 NVLink-C2C 设备,请参阅外部内存版本。此外,当数据已在 GPU 上时,应优先使用 inplace_predict() 而不是 predict。如果您使用的是 scikit-learn 接口,则会自动启用 xgboost.QuantileDMatrixinplace_predict()。最后但同样重要的是,将 QuantileDMatrix 与数据迭代器作为输入是增加内存容量的好方法,请参阅使用 Quantile DMatrix 和数据迭代器的演示

CPU-GPU 互操作性

模型可以在任何设备上使用,无论用于训练的设备是什么。例如,使用 GPU 训练的模型仍然可以在纯 CPU 机器上工作,反之亦然。有关模型序列化的更多信息,请参阅模型 IO 简介

开发者须知

通过向 cmake 指定 USE_NTVX,可以对应用程序进行带注释的分析。当 verbosity 设置为 3 时,CUDA 代码中由“Monitor”类覆盖的区域将自动出现在 nsight 分析器中。

参考文献

Mitchell R, Frank E. (2017) 使用 GPU 计算加速 XGBoost 算法。PeerJ Computer Science 3:e127 https://doi.org/10.7717/peerj-cs.127

NVIDIA Parallel Forall:使用 CUDA 进行梯度提升、决策树和 XGBoost

核外 GPU 梯度提升

贡献者

非常感谢以下贡献者(按字母顺序排列)

  • Andrey Adinets

  • Jiaming Yuan

  • Jonathan C. McKinney

  • Matthew Jones

  • Philip Cho

  • Rong Ou

  • Rory Mitchell

  • Shankara Rao Thejaswi Nanditale

  • Sriram Chandramouli

  • Vinay Deshpande

请向 XGBoost 问题列表报告错误。