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 包。有关详细信息,请参阅安装指南。
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 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 接口,QuantileDMatrix
和 inplace_predict
都会自动启用。
CPU-GPU 互操作性
该模型可以在任何设备上使用,无论用于训练它的是哪个设备。例如,使用 GPU 训练的模型仍然可以在仅支持 CPU 的机器上工作,反之亦然。有关模型序列化的更多信息,请参阅模型 IO 简介。
开发者注意事项
可以通过向 cmake 指定 USE_NTVX
来对应用程序进行带注释的性能分析。当 verbosity 设置为 3 时,CUDA 代码中由 'Monitor' 类覆盖的区域将自动出现在 nsight profiler 中。
参考文献
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 的问题列表。