You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XGBRegressor GPU与CPU计算结果不一致问题咨询

问题描述

我的代码如下:

xgb = XGBRegressor(
    max_depth= int(3.1847420232679196),
    n_estimators = int(27.03977712011383),
    subsample =  0.9130850193972424,
    tree_method = 'gpu_hist',
    gpu_id=0
)
xgb.fit(x_train, y_train)
r2_score(xgb.predict(x_test), y_test), r2_score(xgb.predict(x_train), y_train)

运行结果为 (0.9322279800331514, 0.9838467922872913),但不使用GPU时结果不同:

xgb = XGBRegressor(
    max_depth= int(3.1847420232679196),
    n_estimators = int(27.03977712011383),
    subsample =  0.9130850193972424,
)
xgb.fit(x_train, y_train)
r2_score(xgb.predict(x_test), y_test), r2_score(xgb.predict(x_train), y_train)

结果为 (0.6763052034789518, 0.9805904489567225)。我的GPU为NVIDIA GeForce MX250,在搭载RTX2080Ti的其他电脑上运行该代码,结果也存在差异。现咨询该现象的原因及解决办法。

原因分析
  • 浮点精度差异:GPU版本默认使用单精度(float32)运算以提升性能,而CPU版本默认采用双精度(float64)。这种精度偏差会在迭代训练中被逐步放大,导致最终模型参数和预测结果出现明显差异。不同GPU的硬件架构(比如MX250入门级与RTX2080Ti高端卡)也存在细微的计算实现区别,进一步加剧结果不一致。
  • 分裂策略实现差异:XGBoost的CPU和GPU版本在特征分裂点计算、数据采样的逻辑上有细节差异。gpu_hist为了并行效率,采用近似分裂点选择算法,和CPU的精确计算逻辑不同,最终影响树的结构与模型泛化能力。
  • 随机性未受控:subsample等参数会引入随机采样,若未固定随机种子,CPU与GPU的随机数生成器实现不同,会导致每次训练的采样结果不一致,进而引发模型结果差异。
解决办法
  1. 统一浮点精度
    强制CPU和GPU使用相同精度,消除精度差异带来的影响:

    # CPU版本强制单精度,对齐GPU默认设置
    xgb = XGBRegressor(
        max_depth= int(3.1847420232679196),
        n_estimators = int(27.03977712011383),
        subsample =  0.9130850193972424,
        float_type='float32'
    )
    
    # GPU版本改用双精度(会降低性能,仅用于结果对齐)
    xgb = XGBRegressor(
        max_depth= int(3.1847420232679196),
        n_estimators = int(27.03977712011383),
        subsample =  0.9130850193972424,
        tree_method='gpu_hist',
        gpu_id=0,
        float_type='float64'
    )
    
  2. 固定随机种子
    在模型参数中设置固定随机种子,消除随机性导致的差异:

    xgb = XGBRegressor(
        max_depth= int(3.1847420232679196),
        n_estimators = int(27.03977712011383),
        subsample =  0.9130850193972424,
        tree_method='gpu_hist',
        gpu_id=0,
        random_state=42  # 固定随机种子
    )
    
  3. 统一树方法(牺牲性能换一致性)
    让GPU版本使用和CPU相同的精确树方法,仅适合小数据集验证结果:

    xgb = XGBRegressor(
        max_depth= int(3.1847420232679196),
        n_estimators = int(27.03977712011383),
        subsample =  0.9130850193972424,
        tree_method='exact',  # 和CPU默认树方法一致
        gpu_id=0
    )
    
  4. 统一环境与版本
    确保所有运行环境使用相同版本的XGBoost、CUDA和依赖库,避免版本差异带来的实现变化。同时检查数据预处理流程,确保训练集和测试集在不同环境中完全一致。

内容的提问来源于stack exchange,提问作者Big-Yellow-J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:52:47