我正在尝试优化我的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”级别进行并行化,从而创建了一起运行所有9个月的ProcessPool
,但是,我正在努力设置xgboost的nthread
参数。目前是2
,这样每个线程将运行在一个核心,但我在网上阅读不同的意见(https://github.com/dmlc/xgboost/issues/3042)。我应该增加这个数字吗?我知道这个问题可能有点模糊,但我一直在寻找一种基于数据集结构选择最佳值的系统方法。
这不会让人感到惊讶,但对此没有单一的金鹅策略。至少到目前为止我从来没碰到过一个。如果你建立一个,请在这里分享 - 我将有兴趣学习。
在lightgbm
有一个建议,这是一个竞争对手的GBM工具,其中they say:
为了获得最佳速度,请将其设置为实际CPU核心数,而不是线程数(大多数CPU使用超线程为每个CPU核心生成2个线程)
我不知道xgboost作者是否有类似的建议。但是对于零阶近似,我没有看到一个原因,为什么这两个实现会以不同的方式扩展。
我看到的GBM工具最深入的基准是this one by Laurae。除其他外,它显示了作为线程数的函数的性能缩放。请注意,除非在操作系统级别实现相同的准备步骤,否则它确实非常先进并且可能无法直接应用。