python - XGBoost - 我应该如何设置 nthread 参数?
问题描述
我正在尝试优化我的 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 内存的机器上运行我的代码。内存不是问题(数据集包含数百万个实例,但它们不会填满内存)。我目前在“test_month”级别进行并行化,因此创建了一个ProcessPool
可以一起运行所有 9 个月的程序,但是,我在设置nthread
xgboost 的参数时遇到了困难。目前是2
这样,每个线程都将在一个内核上运行,但我正在阅读网上不同的意见(https://github.com/dmlc/xgboost/issues/3042)。我应该增加这个数字吗?我知道这个问题可能有点模糊,但我一直在寻找一种系统的方法来根据数据集结构选择最佳值。
解决方案
这并不令人意外,但没有单一的金鹅策略。至少到目前为止我从来没有碰到过一个。如果您建立一个,请在此处分享-我将有兴趣学习。
有一个建议lightgbm
,这是一个竞争对手的 GBM 工具,他们说:
为了获得最佳速度,请将其设置为实际 CPU 内核的数量,而不是线程数(大多数 CPU 使用超线程来为每个 CPU 内核生成 2 个线程)
我不知道 xgboost 作者是否有类似的建议。但是对于零阶近似,我看不出为什么这两种实现会以不同的方式扩展。
我看到的最深入的 GBM 工具基准测试是Laurae 的这个。除其他外,它显示了作为线程数函数的性能扩展。请注意,它确实很先进,并且从那里得出的结论可能不会直接适用,除非在操作系统级别实施相同的准备步骤。
推荐阅读
- android - 遵循 Android Studio 初学者指南时未找到默认活动错误
- sql - 尝试仅使用 where 条件定义左连接
- python - Tensorflow - 构建 LSTM 模型 - 需要 tf.keras.layers.Dense()
- java - 在 GLJpanel 中绘制图像的正确方法
- mysql - 节点脚本查询时数据库中的日期不匹配
- javascript - 如何使该函数作为参数的文本加粗
- datetime - 在 API 中传递日期
- laravel - 使用 laravel mailable 发送多封电子邮件(到)
- smartcontracts - 从合同 Vyper 创建新合同
- reactjs - 渲染时调用 Componentwillunmount