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

Dask: why has CPU usage suddenly dropped?(DASK:为什么CPU使用率突然下降?)
本文介绍了DASK:为什么CPU使用率突然下降?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为一个模型做一些蒙特卡罗计算,我认为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. .还有其他可能的解释吗?
  6. 是否可以在DASK仍在运行原始命令的情况下,"告诉"它继续努力工作并返回使用所有CPU能力?
  7. 是否可以中断执行并保留已执行的计算?我注意到,停止当前命令似乎没有多大作用。
  8. 是否可以在运行时查询计算的整体进度?我想知道,在这种缓慢的速度下,还剩下多少模型跑才能知道需要多长时间才能完成。我过去曾尝试使用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使用率突然下降?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)