XGBoost - 我应该如何设置 nthread 参数?

XGBoost - how should I set the nthread parameter?

我正在尝试优化我的 python 训练脚本(我需要多次 运行,因此尝试加快速度是有意义的)。我有一个由 9 个月的数据组成的数据集。验证设置是一种 "temporal validation",我在其中留出一个月,然后在剩余的几个月(使用不同的采样方法)上进行训练,然后对 "test month" 进行预测。

months # set of months
for test_month in months:
    sample_list = generate_different_samples([months - test-months])
    for sample in sample_list:
         xgb.train(sample)
         xgb.predict(test_month)
         # evalutaion after

实际上,我每个月都有近 100 个不同的训练样本。我 运行 在一台有 16 个内核和 64GB RAM 的机器上编写我的代码。内存不是问题(数据集包含数百万个实例,但它们不会填满内存)。我目前在 "test_month" 级别进行并行化,从而创建了一个 ProcessPool,这 9 个月一起 运行,但是,我正在努力设置 xgboost 的 nthread 参数。目前是2,这样一来每个线程都会运行在一个核上,但是我看网上有不同意见(https://github.com/dmlc/xgboost/issues/3042)。我应该增加这个数字吗?我知道这个问题可能有点含糊,但我一直在寻找一种系统的方法来 select 基于数据集结构的最佳价值。

这并不奇怪,但没有单一的金鹅策略。至少到目前为止我从来没有碰到过一个。如果你建立了一个,请在这里分享-我将有兴趣学习。

lightgbm中有一个建议,它是一个竞争对手的 GBM 工具,其中 they say:

for the best speed, set this to the number of real CPU cores, not the number of threads (most CPUs use hyper-threading to generate 2 threads per CPU core)

我不知道 xgboost 作者是否有类似的推荐。但是对于零阶近似值,我看不出为什么这两个实现的缩放比例不同。

我看到的最深入的 GBM 工具基准测试是 this one by Laurae。除其他事项外,它还显示了作为线程数函数的性能扩展。请注意,它真的很先进,从那里得出的结论可能不会直接适用,除非在 OS 级别上实施相同的准备步骤。