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 包。有关详细信息,请参阅安装指南。
params = dict()
params["device"] = "cuda"
params["tree_method"] = "hist"
Xy = xgboost.QuantileDMatrix(X, y)
xgboost.train(params, Xy)
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 支持使用 Dask、Spark 和 PySpark 进行完全分布式 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.QuantileDMatrix 和 inplace_predict()。最后但同样重要的是,将 QuantileDMatrix 与数据迭代器作为输入是增加内存容量的好方法,请参阅使用 Quantile DMatrix 和数据迭代器的演示。
CPU-GPU 互操作性
模型可以在任何设备上使用,无论用于训练的设备是什么。例如,使用 GPU 训练的模型仍然可以在纯 CPU 机器上工作,反之亦然。有关模型序列化的更多信息,请参阅模型 IO 简介。
开发者须知
通过向 cmake 指定 USE_NTVX,可以对应用程序进行带注释的分析。当 verbosity 设置为 3 时,CUDA 代码中由“Monitor”类覆盖的区域将自动出现在 nsight 分析器中。
参考文献
NVIDIA Parallel Forall:使用 CUDA 进行梯度提升、决策树和 XGBoost
贡献者
非常感谢以下贡献者(按字母顺序排列)
Andrey Adinets
Jiaming Yuan
Jonathan C. McKinney
Matthew Jones
Philip Cho
Rong Ou
Rory Mitchell
Shankara Rao Thejaswi Nanditale
Sriram Chandramouli
Vinay Deshpande
请向 XGBoost 问题列表报告错误。