我正在我的 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程序的编写风格造成的?
其他一些信息:
我正在使用http://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html用于 SARIMA 调整。
我正在使用进程队列技术来并行化代码
SARIMA 在 1 个核心上需要 9 小时(如上图所示,最大为 1200%),如果我使用多重处理,则需要超过 24 小时。
我是 stackoverflow 的新手,很乐意补充所需的任何其他信息。如果有任何不清楚的地方,请告诉我。
更新: 我在金字塔包的官方仓库上提出了一个问题,作者已经回复了。可以在这里访问相同的内容:https://github.com/alkaline-ml/pmdarima/issues/301
最佳答案
明显的原因是 SARIMA 是为在 CPU 的多个内核上工作而开发的。而移动平均线没有实现该功能。这与您编写代码的风格无关。只是包作者以两种不同的方式开发了包代码,即
- 没有对移动平均线的 native 多处理支持
- 对 SARIMA 的 native 多处理支持
您的理解中还有一点需要纠正,在 SARIMA 的情况下,操作系统不会自动将工作分配到不同的内核。 SARIMA 的软件包代码是在 CPU 的不同内核上分配所有工作的大师,因为它的作者是为了支持和使用多个内核而开发的。
更新:
您的预感是,具有客户端级多处理+ native 多处理的多处理代码应该表现得更好。但实际上它的表现并没有更好。这是因为,
- 由于 SARIMA 的 native 多处理本身会占用 CPU 所有内核的资源,因此您的客户端级多处理需要多少计算能力才能加快进程,因为 CPU 所有内核上的所有计算能力都在是否被 SARIMA 的 native 多重处理所利用?
- 这就是 Linux 操作系统或任何操作系统的工作方式。当某个进程没有剩余的 CPU 资源时(在您的情况下,该进程用于客户端级多处理进程),该进程会被操作系统放入队列中,直到 CPU 可供其使用。由于您的客户端级多处理进程被放置在队列中,并且由于根本没有 CPU 剩余而没有主动执行,因此它会停止运行。你可以引用Linux操作系统文档来验证我所说的。
关于Python SARIMA 模型自动使用 CPU 的所有核心。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60294725/