gpt4 book ai didi

python-3.x - 减少 statsmodels glm 的多处理

转载 作者:行者123 更新时间:2023-12-04 15:07:15 27 4
gpt4 key购买 nike

我目前正在为我们需要逻辑回归的业务流程之一进行概念验证。我一直在使用 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')

最佳答案

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

python 中的mkl:

import mkl
mkl.set_num_threads(1)

关于python-3.x - 减少 statsmodels glm 的多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47770106/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com