达斯(Dask):为什么CPU使用率突然下降?

时间:2018-10-08 17:16:02

标签: python python-3.x pandas spyder dask

我正在为模型做一些蒙特卡洛(Monte Carlo)的工作,并认为达斯克(Dask)可以非常有用。在最初的35个小时左右,一切运行都非常“顺畅”(除了风扇发出的噪音外,还感觉到计算机正在起飞)。每次运行模型大约需要2秒钟,并且有8个分区并行运行。活动监视器显示了8个python3.6实例。

但是,计算机已变得“无声”,CPU使用率(如Spyder中所示)几乎不会超过20%。模型运行是顺序进行的(不是并行进行的),每个过程大约需要4秒钟。今天,这是在我从事其他工作的某个时候发生的。我了解,根据操作顺序,Dask不会同时使用所有内核。但是,在这种情况下,实际上只执行一项任务(请参见下文),因此可以期望所有分区或多或少同时运行和完成。 编辑:过去,整个设置已经成功运行了10.000个模拟,现在的区别是要运行近500.000个模拟

编辑2:现在它已转变为并行进行2个分区(而不是之前的1个分区和原来的8个分区)。似乎正在改变它同时处理多少个分区的事情。

编辑3:按照建议,我使用了dask.distributed.Client来跟踪正在发生的事情,并在前400行中运行了它。下面包括完成后的外观说明。我正在努力理解x轴标签,将鼠标悬停在矩形上会显示约143秒。

因此,一些问题是:

  1. 运行其他软件(Chrome,MS Word)与让计算机从python“收回”一些CPU之间是否有任何关系?
  2. 或者相反,这可能与我在某个时候运行第二个Spyder实例的事实有关吗?
  3. 甚至,计算机是否可能会以某种方式内存不足?但是命令会不会停止运行?
  4. ...还有其他可能的解释吗?
  5. 是否可以“告诉” Dask以继续进行艰苦的工作,并在仍运行原始命令的同时恢复使用所有CPU的能力?
  6. 是否可以中断执行并保留已执行的任何计算?我已经注意到,停止当前命令似乎没什么用。
  7. 是否可以查询正在运行的计算的总体进度?我想知道还剩下多少个模型运行,以了解以这种缓慢的速度完成需要多长时间。我过去曾尝试使用ProgressBar,但是它一直挂在0%上,直到计算结束前几秒钟。

要清楚,上载模型和必要的数据将非常复杂。出于担心使问题变得更糟的原因,我还没有创建可复制的示例(目前至少该模型仍在运行...),并且-正如您可能已经知道的那样-我几乎不知道该怎么办造成它,我不希望有人能够复制它。我知道这不是最佳做法,请提前道歉。但是,如果有人以前曾做过类似的事情和/或有过使用Dask的经验,那么我将不胜感激,对可能发生的事情以及解决该问题的可能方式进行一些思考。

运行:  -macOS 10.13.6(内存:16 GB |处理器:2.5 GHz Intel Core i7 | 4核)  -Spyder 3.3.1  -黄昏0.19.2  -熊猫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

有什么想法吗? 这说明脚本非常简单:

Graph

信息中心:

Dashboard

更新:我采用的方法是:

  • 设置大量分区(npartitions=nCores*200)。这使得可视化进度变得更加容易。我不确定设置这么多的分区是否是一个好习惯,但是这样做并没有造成太大的影响。
  • 我没有试图通过.compute()最后获得一个大熊猫DataFrame,而是将dask数据帧写入Parquet(这样,每个分区都被写入了一个单独的文件)。后来,将所有文件读入一个简单的数据框并将其compute写入一个熊猫数据框并不难,而且如果中间出现问题,至少我不会丢失已经成功处理和写入的分区。

这是给定点的样子:

enter image description here

1 个答案:

答案 0 :(得分:1)

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

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

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