XGBoost GPU 支持

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

注意

需要 CUDA 11.0,计算能力 (Compute Capability) 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 Memory Manager (RMM) 插件结合使用

内存使用

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

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

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

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

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

CPU-GPU 互操作性

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

开发者注意事项

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

参考文献

Mitchell R, Frank E. (2017) Accelerating the XGBoost algorithm using GPU computing. PeerJ Computer Science 3:e127 https://doi.org/10.7717/peerj-cs.127

NVIDIA Parallel Forall: Gradient Boosting, Decision Trees and XGBoost with CUDA

Out-of-Core GPU Gradient Boosting

贡献者

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

  • Andrey Adinets

  • Jiaming Yuan

  • Jonathan C. McKinney

  • Matthew Jones

  • Philip Cho

  • Rong Ou

  • Rory Mitchell

  • Shankara Rao Thejaswi Nanditale

  • Sriram Chandramouli

  • Vinay Deshpande

请将错误报告到 XGBoost 的问题列表