XGBoost GPU 支持

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

备注

CUDA 11.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值

XGBoost 在使用 GPU 时,利用 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 教程 (版本 1.6.1+)。最后,对于使用 PySpark 进行分布式 GPU 训练,请参阅 使用 PySpark 的分布式 XGBoost

内存使用

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

在xgboost训练过程中,内存通常用于两个目的——存储数据集和工作内存。

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

工作内存根据行数在算法内部按比例分配,以跟踪梯度、树位置和其他每行统计信息。内存根据箱数、特征数和树中的节点数为直方图箱分配。出于性能原因,我们将树中先前节点的直方图保留在内存中,当内存使用量达到某个阈值时,我们停止这样做以节省内存,但会损失一些性能。

如果你在大数据集上遇到内存不足的错误,尝试使用 xgboost.QuantileDMatrix外部内存版本。注意,当使用 外部内存 进行 GPU hist 时,最好也采用基于梯度的采样。最后但同样重要的是,当数据已经在 GPU 上时,inplace_predict 可以优于 predict。如果你使用的是 scikit-learn 接口,QuantileDMatrixinplace_predict 都会自动启用。

CPU-GPU 互操作性

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

开发者笔记

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

参考文献

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

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

核心外GPU梯度提升

贡献者

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

  • 安德烈·阿迪内茨

  • Jiaming Yuan

  • 乔纳森·C·麦金尼

  • 马修·琼斯

  • 菲利普·赵

  • 荣鸥

  • Rory Mitchell

  • Shankara Rao Thejaswi Nanditale

  • Sriram Chandramouli

  • Vinay Deshpande

请将错误报告提交到 XGBoost 问题列表:https://github.com/dmlc/xgboost/issues。对于一般问题,请访问我们的用户论坛:https://discuss.xgboost.ai/