【问题标题】:Limiting the number of threads used by XGBoost限制 XGBoost 使用的线程数
【发布时间】:2022-03-25 03:36:26
【问题描述】:

我想将 XGBoost 用于在线生产目的(Python 2.7 XGBoost API)。 为了能够做到这一点,我想在 predict 操作中控制和限制 XGBoost 使用的线程数

我正在使用 XGBoost (xgboost.XGBRegressor) 提供的 sklearn 兼容回归器,并尝试使用参数 nthread回归器的构造函数将使用的最大线程数限制为 1。

不幸的是,XGBoost 一直使用多个线程,而不管 nthread 中设置的值如何。

还有其他方法可以限制 XGBoost 并强制它使用 n=1 个线程执行 predict 操作吗?

【问题讨论】:

  • 阅读他们的文档并留意有关 OpenMP 和 BLAS/LAPACK 的提及。也许它是一个编译时选项,也许它可以动态完成。
  • nthread 已被弃用。如果您使用的是新版本的 xgboost,请尝试设置 n_jobs

标签: python scikit-learn python-multithreading xgboost


【解决方案1】:

我遇到了同样的问题并想通了。正确答案是设置系统环境变量。 对于 python 脚本:

import os
os.environ['OMP_NUM_THREADS'] = "1"

会起作用的。

确保在导入任何其他包之前放置这两行,否则可能无法正常工作。

【讨论】:

    【解决方案2】:

    回答: 使用 nthread 的标准 set_params 失败,但在使用 regr._Booster.set_param('nthread', 1) 时,我能够将 XGBoost 限制为使用单个线程。

    如上所述,环境变量OMP_NUM_THREADS=1 也可以工作。

    【讨论】:

      【解决方案3】:

      目前n_jobs可用于在预测时间限制线程:

      model._Booster.set_param('n_jobs', 2)

      更多信息

      以前(但现在已弃用):

      model._Booster.set_param('nthread', 2)

      【讨论】:

        【解决方案4】:

        没有使用XGBoost-1.5.2 API设置用于预测的线程数的选项,不幸的是,设置DMatrixnthreads参数无效。

        XGBoost 使用 OpenMP 进行并行化。将环境变量 OMP_THREAD_LIMIT 设置为 OpenMP 可以使用的最大线程数。例如。 export OMP_THREAD_LIMIT=1 导致以下消息:

        OMP: Warning #96: Cannot form a team with 32 threads, using 1 instead.
        OMP: Hint Consider unsetting KMP_DEVICE_THREAD_LIMIT (KMP_ALL_THREADS), KMP_TEAMS_THREAD_LIMIT, and OMP_THREAD_LIMIT (if any are set).
        

        在 Python 中,在其他导入之前添加这些行:

        import os
        os.environ["OMP_THREAD_LIMIT"] = "1"
        

        【讨论】:

          猜你喜欢
          • 2018-02-28
          • 2013-06-24
          • 1970-01-01
          • 1970-01-01
          • 2021-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多