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

时间:2019-03-20 01:08:37

标签: python xgboost

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

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)。我应该增加这个数字吗?我知道这个问题可能有点含糊,但我一直在寻找一种系统的方法来根据数据集结构选择最佳值。

1 个答案:

答案 0 :(得分:1)

这不足为奇,但是对此没有单一的金鸡策略。至少到目前为止,我从未碰到过。如果您建立了一个,请在这里分享-我将有兴趣学习。

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

  

为获得最佳速度,请将其设置为实际CPU内核数,而不是线程数(大多数CPU使用超线程为每个CPU内核生成2个线程)

我不知道是否有来自xgboost作者的类似建议。但是对于零阶近似,我看不出一个理由,为什么这两种实现的缩放比例会有所不同。

我看到的GBM工具最深入的基准测试是this one by Laurae。除其他外,它显示了作为线程数量函数的性能扩展。请注意,它确实是高级的,并且从那里得出的结论可能不会直接适用,除非人们在操作系统级别上执行相同的准备步骤。