【问题标题】:How do I speed up an optimized CPU-bound process that runs within a parallelized program in Python?如何加快在 Python 并行程序中运行的优化 CPU 密集型进程?
【发布时间】:2022-01-25 01:10:24
【问题描述】:

我的一个 Python 程序使用 multiprocessing 模块来并行化搜索问题的迭代。除了做其他事情之外,每次迭代都会循环一个已经在 Cython 中优化的 CPU 昂贵的过程。因为这个进程在循环时会被多次调用,这会显着减慢总运行时间。

在这种情况下,实现加速的推荐方法是什么?由于无法对昂贵的进程进行进一步的 CPU 优化,因此我考虑了并行化循环。但是,由于循环存在于已经并行化的(multiprocessing)程序中,我认为这在同一台机器上是不可能的。

我对此的研究未能找到任何最佳实践或任何方向。

【问题讨论】:

  • 这不是我的专业领域,但您是否考虑过使用无 GIL 的 Python 实现并让进程产生线程?
  • 您是指 CPython 还是 Cython?没有什么神奇的方法可以让程序使用比实际可用更多的资源。您唯一的方法是更有效地使用它们,或者在第一个无法完成的情况下重新考虑(仅)使用其他计算资源。你确定计算真的是最优的吗?根据我的经验,大多数 Python 代码离最佳时间还很远。例如:你使用最好的算法吗?最好的数据结构? CPython 的开销可以忽略不计吗?当前的代码是否可以很好地扩展?等等。我们需要更多信息来帮助您。
  • @JérômeRichard 这是 Cython(已更正)。对于上下文,代码在以下方法上花费了大量时间,该方法针对速度进行了优化:github.com/statsmodels/statsmodels/blob/main/statsmodels/tsa/…
  • 有趣!该代码似乎使用了 L-BFGS 算法,该算法应该是计算界限的。它还使用了一些 Numpy 函数(例如 log 和 sum),这些函数可能没有针对您的平台进行很好的优化。我很难看出哪一部分是瓶颈。如果您使用与您的需求匹配的上下文/输入(例如并行使用)来调用它的最小可重现示例,那么我将尝试检查代码是否可以进一步改进。我认为还有改进的余地,但代码已经使用 Numpy 并且 Numpy 代码非常好。所以不要指望会有巨大的进步。

标签: python performance optimization parallel-processing python-multiprocessing


【解决方案1】:

作为一种快速查看是否可能可以优化现有代码的方法,您可以在代码运行时检查计算机的 CPU 使用率。

如果你所有的核心都在 100% 左右,那么添加更多进程等不太可能改善情况。

在这种情况下你可以

1 - 尝试进一步的算法优化(尽管最好的方法是先分析您的代码,看看哪里慢)。 如果你已经在使用 Cython,那么这可能会带来有限的回报

2 - 尝试更快的机器和/或更多内核

然而,另一种方法(我使用过的方法)是开发无服务器设计,并使用任何云供应商无服务器模型运行 CPU 密集型、并行算法部分。

我个人使用过 AWS lamda,我们将代码并行化以运行 200 多个并发 lambda 进程,这大致相当于一台 200 多个内核的单机。

对我们而言,与在 8 核服务器上运行相比,这实质上导致性能提高了 50-100 倍(以总处理时间的减少来衡量)。

您确实必须做更多的工作来实现无服务器部署模型,然后封装代码来管理所有内容,这并非易事。但是,基本上无限水平扩展的能力可能对您有意义。

【讨论】:

  • 我同意第一部分但不同意第二部分:使用更多资源应该是最后要做的事情(在检查算法、方法、需求和输入以及可能的错误之后) 除非它们已经免费提供。在实践中没有免费的午餐:使用更多的机器更昂贵,消耗更多的能量,可能会增加一些运行代码的复杂性,并且通常会增加对特定提供商(例如 AWS/Azure)的依赖。我见过很多人使用在大量资源上运行的效率非常低的并行代码,而优化的顺序代码几乎更快。
  • @JérômeRichard 我不得不同意你的观点——我已经为在超级计算机上运行的科学代码编写了库,你将大部分时间都花在优化上,而如今似乎关注的是“懒惰”编码并且设计wrt优化浪费了很多资源。尤其是如今的编码不再是真正的编码,而是更多地将第 3 方“服务”粘合在一起。当然,它可能会更快上市,但它更慢、更复杂、更脆弱、更不透明等等。
  • @laos ...并不是在这里暗示你错过了什么。如果您已经花时间沿着 Cython 路线走下去,那么您可能已经在每个核心级别进行了很好的优化。如果您已经用尽了每个核心级别的优化,那么下一步可能是 AWS lambda。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多