Python SARIMA 模型自动使用 CPU 的所有核心。如何?

标签 python multithreading parallel-processing operating-system multiprocessing

我正在我的 12 核机器上运行移动平均线和 SARIMA 模型来进行时间序列预测。

移动平均模型在单核上运行需要 25 分钟。通过使用多处理模块,我能够将运行时间缩短至约 4 分钟(通过使用 12 个核心中的 8 个)。在检查“top”命令的结果时,我们可以很容易地看到多处理实际上正在使用 8 个内核,并且行为符合预期。

移动平均线(1核) -> CPU Usage for Moving Average 1 core

移动平均线(8核) -> CPU Usage for Moving Average 8 cores

我首先使用 SARIMA 模型运行相同的例程,而不使用多重处理。令我惊讶的是,它会自动使用所有核心/在所有核心上分配工作。与移动平均模型(图 1)不同,在移动平均模型中,我可以看到单个进程的 CPU 使用率为 100%,使用 8 个核心时累计约为 800%,这里单个核心的 CPU 使用率仅在 1000% 之间波动-1200%(即所有 12 个核心)。正如预期的那样,多处理模块在这种情况下并没有给我带来太大帮助,而且结果更糟糕。

SARIMA(1核) -> CPU USage Sarima 1 core

SARIMA(8 核) -> CPU Usage Sarima 8 core (在这种情况下,不是一个进程使用 1200%,而是某些进程超过 100%)

我的问题是,为什么在 SARIMA 模型中操作系统会自动将工作分配到不同的内核上,而在移动平均模型中我必须显式地执行此操作(使用多处理)。难道是因为python程序的编写风格造成的?

其他一些信息:

  1. 我正在使用http://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html用于 SARIMA 调整。

  2. 我正在使用进程队列技术来并行化代码

  3. SARIMA 在 1 个核心上需要 9 小时(如上图所示,最大为 1200%),如果我使用多重处理,则需要超过 24 小时。

我是 stackoverflow 的新手,很乐意补充所需的任何其他信息。如果有任何不清楚的地方,请告诉我。

更新: 我在金字塔包的官方仓库上提出了一个问题,作者已经回复了。可以在这里访问相同的内容:https://github.com/alkaline-ml/pmdarima/issues/301

最佳答案

明显的原因是 SARIMA 是为在 CPU 的多个内核上工作而开发的。而移动平均线没有实现该功能。这与您编写代码的风格无关。只是包作者以两种不同的方式开发了包代码,即

  1. 没有对移动平均线的 native 多处理支持
  2. 对 SARIMA 的 native 多处理支持

您的理解中还有一点需要纠正,在 SARIMA 的情况下,操作系统不会自动将工作分配到不同的内核。 SARIMA 的软件包代码是在 CPU 的不同内核上分配所有工作的大师,因为它的作者是为了支持和使用多个内核而开发的。

更新:

您的预感是,具有客户端级多处理+ native 多处理的多处理代码应该表现得更好。但实际上它的表现并没有更好。这是因为,

  1. 由于 SARIMA 的 native 多处理本身会占用 CPU 所有内核的资源,因此您的客户端级多处理需要多少计算能力才能加快进程,因为 CPU 所有内核上的所有计算能力都在是否被 SARIMA 的 native 多重处理所利用?
  2. 这就是 Linux 操作系统或任何操作系统的工作方式。当某个进程没有剩余的 CPU 资源时(在您的情况下,该进程用于客户端级多处理进程),该进程会被操作系统放入队列中,直到 CPU 可供其使用。由于您的客户端级多处理进程被放置在队列中,并且由于根本没有 CPU 剩余而没有主动执行,因此它会停止运行。你可以引用Linux操作系统文档来验证我所说的。

关于Python SARIMA 模型自动使用 CPU 的所有核心。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60294725/

相关文章:

GIT 并行克隆所有存储库,即克隆所有存储库的总时间接近于最大存储库 : fatal: index-pack failed 所需的时间

python - 如何混合pandas和beautifulsoup从xml文件目录中提取一些元素标签?

python - python中的条件类继承定义

c# - 我可以从后台线程更新 UI,为什么?

C++/SDL 线程 - 事件分解

c - 什么时候应该忽略关键部分以及什么时候不需要等待?开放式MP

python - Matplotlib 绘图窗口是黑色的

python - Tkinter 按钮调用对象上的方法

java 中断行为不稳定吗?

c++ - 将生成的进程的输出捕获到字符串