Dask:为什么 CPU 使用率突然下降了?

Dask: why has CPU usage suddenly dropped?

我正在为一个模型做一些 Monte Carlo,我认为 Dask 对于​​这个目的可能非常有用。在最初的 35 个小时左右,一切都 运行 相当 "smoothly"(除了风扇噪音,给人一种计算机正在起飞的感觉)。每个模型 运行 大约需要 2 秒,并且有 8 个分区 运行 并行处理它。 Activity 监视器显示 8 个 python3.6 个实例。

但是,计算机已经变成"silent"并且CPU使用率(在Spyder中显示)几乎不超过20%。模型 运行 是按顺序发生的(不是并行发生的),每个发生大约需要 4 秒。这发生在今天的某个时候,当时我正在处理其他事情。我知道根据操作顺序,Dask 不会同时使用所有内核。然而,在这种情况下,实际上只有一项任务要执行(见下文),因此可以预期所有分区 运行 并或多或少同时完成。 编辑:整个设置在过去已经 运行 成功进行了 10.000 次模拟,不同之处在于现在有将近 500.000 次模拟 运行.

编辑 2:现在它已转移到并行执行 2 个分区(而不是之前的 1 个和原来的 8 个)。似乎有什么东西让它改变了同时处理的分区数。

编辑 3:根据建议,我使用了 dask.distributed.Client 来跟踪正在发生的事情,并且 运行 它用于前 400 行。下面包含了完成后的样子的插图。我很难理解 x 轴标签,将鼠标悬停在矩形上显示大约 143 秒。

因此,一些问题是:

  1. 运行宁其他软件(Chrome, MS Word)和电脑"take back"一些CPU 来自 python?
  2. 或者相反,这是否与我 运行 一个 第二个 Spyder 实例?
  3. 的事实有关
  4. 甚至,计算机是否会以某种方式 运行 内存不足 ?但是这样命令不会停止 运行ning?
  5. ...还有其他可能的解释吗?
  6. 是否有可能 "tell" Dask 继续努力并在它仍然 运行 执行原始命令时返回使用所有 CPU 电源?
  7. 是否可以中断执行并保留已经执行的计算?我注意到停止当前命令似乎没有太大作用。
  8. 是否可以在运行ning的时候查询整体的计算进度?我想知道还有多少模型 运行 可以知道以这种缓慢的速度完成需要多长时间。我过去曾尝试使用 ProgressBar,但它一直挂在 0% 上,直到计算结束前几秒钟。

需要说明的是,上传模型和必要的数据会非常复杂。我还没有创建一个可重现的例子,要么是因为害怕让问题变得更糟(目前模型至少仍然 运行ning...),因为 - 正如你现在可能会说的那样 - 我有非常不知道是什么原因造成的,我不希望任何人能够重现它。我知道这不是最佳做法,请提前致歉。但是,如果有人在 and/or 有 Dask 经验之前已经彻底了解过类似的事情,我真的很感激关于可能发生的事情和可能的解决方法的一些想法。

运行: - macOS 10.13.6(内存:16 GB | 处理器:2.5 GHz Intel Core i7 | 4 核) - 蜘蛛 3.3.1 - 达斯克 0.19.2 - pandas 0.23.4

如果有什么需要更清楚的地方,请告诉我

如果您认为它是相关的,脚本的主要思想是:

# Create a pandas DataFrame where each column is a parameter and each row is a possible parameter combination (cartesian product). At the end of each row some columns to store the respective values of some objective functions are pre-allocated too.
# Generate a dask dataframe that is the DataFrame above split into 8 partitions
# Define a function that takes a partition and, for each row:
 # Runs the model with the coefficient values defined in the row
 # Retrieves the values of objective functions
 # Assigns these values to the respective columns of the current row in the partition (columns have been pre-allocated)
 # and then returns the partition with columns for objective functions populated with the calculated values
# map_partitions() to this function in the dask dataframe

有什么想法吗? 这表明脚本是多么简单:

仪表板:

更新:我采用的方法是:

这是给定点的样子:

Dask 有许多诊断工具可以帮助您了解计算内部发生的情况。参见 http://docs.dask.org/en/latest/understanding-performance.html

我特别建议在本地使用分布式调度程序并查看 Dask 仪表板以了解您的计算中发生了什么。参见 http://docs.dask.org/en/latest/diagnostics-distributed.html#dashboard

这是一个您可以访问的网页,它将准确告诉您所有处理器中正在发生的事情。