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 包。详情请参阅 安装指南。
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值
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 支持使用 Dask、Spark
和 PySpark
进行完全分布式的 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 接口,QuantileDMatrix
和 inplace_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
贡献者
非常感谢以下贡献者(按字母顺序排列):
安德烈·阿迪内茨
Jiaming Yuan
乔纳森·C·麦金尼
马修·琼斯
菲利普·赵
荣鸥
Rory Mitchell
Shankara Rao Thejaswi Nanditale
Sriram Chandramouli
Vinay Deshpande
请将错误报告提交到 XGBoost 问题列表:https://github.com/dmlc/xgboost/issues。对于一般问题,请访问我们的用户论坛:https://discuss.xgboost.ai/。