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

标签 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 s。

因此,一些问题是:


运行其他软件(Chrome,MS Word)与使计算机从python“收回”一些CPU之间是否有任何关系?
或者相反,这可能与某个事实有关:我在某个时候运行了第二个Spyder实例?
甚至,计算机是否会以某种方式耗尽内存?但是,命令不会停止运行吗?
...还有其他可能的解释吗?
是否可以“告诉” Dask以继续进行艰苦的工作,并在仍运行原始命令的同时恢复使用所有CPU的能力?
是否可以中断执行并保留已执行的任何计算?我已经注意到,停止当前命令似乎没有太大作用。
可以查询运行过程中的总体进度吗?我想知道还剩下多少个模型运行,以了解以这种缓慢的速度完成需要多长时间。我过去曾尝试使用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(通过这种方式,每个分区都被写入了一个单独的文件)。后来,将所有文件读入dask数据框并将其compute转换为pandas DataFrame并不困难,而且如果中间出现问题,至少我不会丢失已经成功处理和写入的分区。


在给定点是这样的:

enter image description here

最佳答案

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

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

这是一个您可以访问的网页,它将确切告诉您所有处理器的运行状况。

关于python - Dask:为什么CPU使用率突然下降?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52707190/

相关文章:

python - 具有静态(类似数据)大小的 Matplotlib RegularPolyCollection?

python - Keras pad_sequences 为基数为 10 的 int () 抛出无效文字

python - 将 if 条件放在列表理解中的哪里?

python - 什么是从 python dict 或 list 中深度复制数据的快速 pythonic 方法?

python - 标准库中 python 的 random.random() 范围

python - 使用正则表达式将字符串插入文件路径字典中

python - 如何根据其他列的值从 pandas 数据框中提取数据?

python - Pandas left join 给出 NaN

python - 按特定顺序向 Pandas DataFrame 添加值和列

python - 使用 Wine 和 py2exe 从 Python 项目创建 Windows 应用程序