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 秒。
因此,一些问题是:
- 运行宁其他软件(Chrome, MS Word)和电脑"take back"一些CPU 来自 python?
- 或者相反,这是否与我 运行 一个 第二个 Spyder 实例?
的事实有关
- 甚至,计算机是否会以某种方式 运行 内存不足 ?但是这样命令不会停止 运行ning?
- ...还有其他可能的解释吗?
- 是否有可能 "tell" Dask 继续努力并在它仍然 运行 执行原始命令时返回使用所有 CPU 电源?
- 是否可以中断执行并保留已经执行的计算?我注意到停止当前命令似乎没有太大作用。
- 是否可以在运行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
有什么想法吗?
这表明脚本是多么简单:
仪表板:
更新:我采用的方法是:
- 设置大量分区(
npartitions=nCores*200
)。这使得可视化进度变得更加容易。我不确定设置这么多分区是否是个好习惯,但它的工作速度没有太大下降。
- 我没有尝试在最后
.compute()
得到一个巨大的 pandas DataFrame,而是得到了要写入 Parquet 的 dask 数据帧(这样每个分区被写入一个单独的文件)。后来,将所有文件读入一个 dask 数据帧并将其 compute
转换为 pandas DataFrame 并不困难,如果中间出现问题至少我不会丢失分区成功处理写入。
这是给定点的样子:
Dask 有许多诊断工具可以帮助您了解计算内部发生的情况。参见 http://docs.dask.org/en/latest/understanding-performance.html
我特别建议在本地使用分布式调度程序并查看 Dask 仪表板以了解您的计算中发生了什么。参见 http://docs.dask.org/en/latest/diagnostics-distributed.html#dashboard
这是一个您可以访问的网页,它将准确告诉您所有处理器中正在发生的事情。
我正在为一个模型做一些 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 秒。
因此,一些问题是:
- 运行宁其他软件(Chrome, MS Word)和电脑"take back"一些CPU 来自 python?
- 或者相反,这是否与我 运行 一个 第二个 Spyder 实例? 的事实有关
- 甚至,计算机是否会以某种方式 运行 内存不足 ?但是这样命令不会停止 运行ning?
- ...还有其他可能的解释吗?
- 是否有可能 "tell" Dask 继续努力并在它仍然 运行 执行原始命令时返回使用所有 CPU 电源?
- 是否可以中断执行并保留已经执行的计算?我注意到停止当前命令似乎没有太大作用。
- 是否可以在运行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
有什么想法吗? 这表明脚本是多么简单:
仪表板:
更新:我采用的方法是:
- 设置大量分区(
npartitions=nCores*200
)。这使得可视化进度变得更加容易。我不确定设置这么多分区是否是个好习惯,但它的工作速度没有太大下降。 - 我没有尝试在最后
.compute()
得到一个巨大的 pandas DataFrame,而是得到了要写入 Parquet 的 dask 数据帧(这样每个分区被写入一个单独的文件)。后来,将所有文件读入一个 dask 数据帧并将其compute
转换为 pandas DataFrame 并不困难,如果中间出现问题至少我不会丢失分区成功处理写入。
这是给定点的样子:
Dask 有许多诊断工具可以帮助您了解计算内部发生的情况。参见 http://docs.dask.org/en/latest/understanding-performance.html
我特别建议在本地使用分布式调度程序并查看 Dask 仪表板以了解您的计算中发生了什么。参见 http://docs.dask.org/en/latest/diagnostics-distributed.html#dashboard
这是一个您可以访问的网页,它将准确告诉您所有处理器中正在发生的事情。