问题描述
我正在为一个模型做一些蒙特卡罗计算,我认为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秒。
因此,以下是一些问题:
- 运行其他软件(Chrome、MS Word)和让计算机从Python"收回"一些CPU之间有什么关系吗?
- 或者相反,这是否与我在某个时候运行了第二个Spyder实例? 有关
- 甚至,计算机是否可能因某种原因内存不足?但是,该命令不是已经停止运行了吗?
- .还有其他可能的解释吗?
- 是否可以在DASK仍在运行原始命令的情况下,"告诉"它继续努力工作并返回使用所有CPU能力?
- 是否可以中断执行并保留已执行的计算?我注意到,停止当前命令似乎没有多大作用。
- 是否可以在运行时查询计算的整体进度?我想知道,在这种缓慢的速度下,还剩下多少模型跑才能知道需要多长时间才能完成。我过去曾尝试使用ProgressBar,但它一直挂在0%上,直到计算结束前几秒钟。
明确地说,上传模型和必要的数据将非常复杂。我还没有创建一个可重复的例子,也是因为我害怕让问题变得更糟(至少目前该模型仍在运行……)因为--正如你现在可能已经知道的--我对可能导致它的原因几乎一无所知,我也不指望任何人能够复制它。我知道这不是最好的做法,并提前道歉。然而,如果任何人以前有过类似的透彻经历和/或有使用DASK的经验,我将非常感激关于可能发生的事情和可能的方法的一些想法。
正在运行:-MacOS 10.13.6(内存:16 GB|处理器:2.5 GHz英特尔酷睿i7|4核)-Spyder 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
有什么想法吗?这显示了该脚本是多么简单:
仪表板:
更新:我采取的方法是:
- 设置大量分区(
npartitions=nCores*200
)。这使得想象进展变得容易得多。我不确定设置这么多分区是否是好的做法,但它没有太大的减慢。 - 没有尝试通过
.compute()
最终获得一个巨大的 pandas DataFrame,而是将DaskDataFrame写入到Parket(通过这种方式,每个分区都被写入到一个单独的文件)。后来,将所有文件读取到DaskDataFrame中并将其compute
发送给 pandas DataFrame并不困难,如果中间出现问题,至少我不会丢失已经成功处理和写入的分区。
这是它在给定点的样子:
推荐答案
DASK有许多诊断工具可帮助您了解计算内部发生的情况。请参见http://docs.dask.org/en/latest/understanding-performance.html
尤其是,我建议在本地使用分布式调度程序并查看Dask仪表板,以了解您的计算中发生了什么。请参见http://docs.dask.org/en/latest/diagnostics-distributed.html#dashboard这是一个您可以访问的网页,它将确切地告诉您所有处理器中正在发生的事情。
这篇关于DASK:为什么CPU使用率突然下降?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!