【问题标题】:Reduce multiprocessing for statsmodels glm减少 statsmodels glm 的多处理
【发布时间】:2018-05-25 23:45:48
【问题描述】:

我目前正在为我们的一个需要逻辑回归的业务流程进行概念验证。我一直在使用 statsmodels glm 对我们的数据集进行分类(按照下面的代码)。我们的数据集由大约 1000 万行和大约 80 个特征组成(其中几乎 70+ 是虚拟变量,例如基于定义的分类变量的“1”或“0”)。使用较小的数据集,glm 工作正常,但是如果我对完整的数据集运行它,python 会抛出错误“无法分配内存”。

glmmodel = smf.glm(formula, data, family=sm.families.Binomial())
glmresult = glmmodel.fit()
resultstring = glmresult.summary().as_csv()

这让我想到这可能是因为 statsmodels 旨在利用所有可用的 cpu 内核,并且下面的每个子进程都会将数据集的副本创建到 RAM 中(如果我弄错了,请纠正我)。现在的问题是,glm 是否有办法只使用最少数量的内核?我不喜欢性能,只是希望能够针对完整的数据集运行 glm。

作为参考,以下是机器配置和更多信息(如果需要)。

CPU: 10 cores
RAM: 40 GB (usable/free ~25GB as there are other processes running on the 
same machine)
swap: 16 GB
dataset size: 1.4 GB (based on Panda's DataFrame.info(memory_usage='deep')

【问题讨论】:

    标签: python-3.x statsmodels


    【解决方案1】:

    GLM 仅通过线性代数库使用多重处理

    以下内容复制了来自https://github.com/statsmodels/statsmodels/issues/2914 的我的常见问题解答问题描述 它包括一些指向其他问题的链接。

    (引用:)

    Statsmodels 在我们控制的一些地方使用 joblib 进行并行处理。目前主要用于bootstrap,没有直接用在模型中。

    但是,numpy/scipy 中的一些底层 Blas/Lapack 库也使用多核。这对于具有大型数组的线性代数可能很有效,但它也会减慢运算速度,尤其是当我们想要在更高级别上使用并行处理时。

    我们如何限制线性代数库使用的核心数量?

    这取决于使用哪个线性代数库。见邮件列表线程 https://groups.google.com/d/msg/pystatsmodels/Lz9-In0pgPk/BtcYsj_ABQAJ

    openblas:尝试设置环境变量 OMP_NUM_THREADS=1

    在 OSX 上加速,设置 VECLIB_MAXIMUM_THREADS

    蟒蛇中的mkl:

    import mkl
    mkl.set_num_threads(1)
    

    【讨论】:

      【解决方案2】:

      这是因为 Statsmodels 在估计 GLM 时使用 IRLS,而 IRLS 过程利用其 WLS 回归例程,该例程再次使用 QR 分解。 QR 分解直接在 X 上完成,您的 X 有 1000 万行、80 列,结果对内存和 CPU 造成了很大压力。

      这是来自 statsmodels 的源代码:

              if method == 'pinv':
                  pinv_wexog = np.linalg.pinv(self.wexog)
                  params = pinv_wexog.dot(self.wendog)
              elif method == 'qr':
                  Q, R = np.linalg.qr(self.wexog)
                  params = np.linalg.solve(R, np.dot(Q.T, self.wendog))
              else:
              params, _, _, _ = np.linalg.lstsq(self.wexog, self.wendog,
      

      【讨论】:

        猜你喜欢
        • 2017-07-25
        • 2017-07-23
        • 1970-01-01
        • 2016-11-03
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        相关资源
        最近更新 更多