提交新活动

谢谢!您的提交已收到!
糟糕!提交表单时出错了。

提交新闻报道

谢谢!您的提交已收到!
糟糕!提交表单时出错了。

订阅新闻邮件

谢谢!您的提交已收到!
糟糕!提交表单时出错了。
2021年7月7日

高级图更新

作者

执行摘要

目前Dask在高级图方面有很多工作正在进行。我们想分享一下该领域的当前工作快照。这篇博文适合对Dask幕后性能改进技术细节感兴趣的人。使用Dask并不需要了解这些。

目录

简要背景

什么是高级图?

高级图是生成完整低级任务图所需指令的一种更紧凑的表示形式。关于Dask高级图的文档页面在这里:https://docs.dask.org.cn/en/latest/high-level-graphs.html

为什么它们有用?

高级图有助于实现更快的调度。我们可以向worker发送更小的高级图表示,而不是在scheduler和worker之间发送非常大的任务图。减少需要传递的数据量有助于提高整体性能。

您可以在我们之前的博文中阅读更多关于更快速调度的信息。最近,Adam Breindel在Coiled博客上写了一篇关于此的文章(链接)。

我需要修改代码才能使用它们吗?

不,您不需要修改任何内容。这项工作正在Dask内部进行,您应该会在不修改代码的情况下看到一些速度提升。

事实上,您可能已经从高级图中受益了

“从Dask 2021.05.0版本开始,Dask DataFrame的计算将默认直接从客户端向调度器发送HighLevelGraph。因此,对于大型DataFrame计算,用户应该会注意到调用.compute()和相应任务开始在worker上运行之间的延迟大大减少。”https://coiled.io/dask-heartbeat-by-coiled-2021-06-10/

请继续阅读以了解其他领域的进展快照。

分块层进展

总结

Blockwise 高级图层在2020.12.0版本的Dask中引入。自那以后,为了提高性能,尤其是在IO操作方面,人们付出了很多努力,尽可能使用Blockwise高级图层。以下是一个非详尽列表。

迄今为止的工作

亮点包括(排名不分先后)

     
  1. Rick Zamora 合并的 PR:为 DataFrame IO(parquet, csv, and orc)使用 Blockwise #7415
  2.  
  3. Rick Zamora 合并的 PR:将 read_hdf 移至 Blockwise 7625
  4.  
  5. Rick Zamora 合并的 PR:将 timeseries 和 daily-stock 移至 Blockwise #7615
  6.  
  7. John Kirkham 合并的 PR:使用 da.blockwise 重写 da.fromfunction #7704

正在进行的工作

其他许多与 Blockwise 相关的工作正在进行中

     
  1. Ian Rose:Blockwise 数组创建重述 #7417。该 PR 为 from_arrayfrom_zarr 函数创建了 Blockwise 实现。
  2.  
  3. Rick Zamora:将 DataFrame from_array 和 from_pandas 移至 Blockwise #7628
  4.  
  5. Bruce Merry:对于带有 block_id 或 block_info 的 map_blocks 使用 BlockwiseDep #7686

map overlap 的高级图

总结

研究 Dask 的 map_overlap 的高级图是一个由用户需求驱动的项目。人们告诉我们,有时仅仅生成任务图所需的时间(在实际计算发生之前)就可能是一个很大的用户体验问题。因此,我们正在寻找改进它的方法。

迄今为止的工作

     
  1. Genevieve Buckley 合并的 PR:map_overlap 的 HighLevelGraph 抽象层 #7595

这个 PR 推迟了创建 Dask 任务图涉及的大部分计算,但没有减少总的端到端计算时间。因此还需要进一步优化。

正在进行的工作

后续工作包括

     
  1. 在不实例化层的情况下找到 overlap 层中的任务数量 #7788 https://github.com/dask/dask/issues/7788
  2.  
  3. 为 ArrayOverlapLayer 实现 cull 方法 #7789 https://github.com/dask/dask/issues/7789 (culling 是通过移除不必要的任务来简化 Dask 图)

切片与高级图

总结

map_overlap 进行性能分析时,我们发现大量时间花费在切片操作上。因此,切片是下一步研究高级图可能带来的性能改进的合乎逻辑的选择。

同时,Rick Zamora 一直在研究 Dask 的 dataframe 部分,利用高级图改进 dataframe 的切片/选择。

迄今为止的工作

几项小的错误修复/改进

     
  1.    Genevieve Buckley 合并的 PR:SimpleShuffleLayer 应该将 parts_out 与 set(self.parts_out) 进行比较 #7787  
  2.  
  3.    Genevieve Buckley 合并的 PR:将 Layer get_output_keys 正式设为抽象方法 #7775  

正在进行的工作

     
  1.    Rick Zamora:[进行中] 添加 DataFrameGetitemLayer 以简化 HLG 优化 #7663  
  2.  
  3.    Genevieve Buckley:数组切片 HighLevelGraph 层 #7655  

可视化

总结

我们还投入了一些工作来改进 Dask 对象(包括高级图)的可视化。

为您的类定义一个 _repr_html_ 方法是使用 jupyter notebooks 时获得漂亮 HTML 输出的好方法。您可以阅读这篇文章以查看其他科学计算 Python 库中更多简洁的 HTML 表示。

Dask 已经在许多地方使用了 HTML 表示(例如 ArrayDataframe 类)。我们现在有了 HighLevelGraphLayer 对象的新 HTML 表示,以及 Dask distributed 中的 SchedulerClient 对象。

迄今为止的工作

     
  1. Jacob Tomlinson 合并的 PR:为 scheduler_info 添加 HTML 表示并整合到 client 和 cluster 表示中 #4857
  2.  
  3. Jacob Tomlinson 合并的 PR:CLient.who_has 和 Client.has_what 的 HTML 表示
  4.  
  5. Genevieve Buckley 合并的 PR:HighLevelGraph 层的 HTML 表示实现 #7763 https://github.com/dask/dask/pull/7763
  6.  
  7. Genevieve Buckley 合并的 PR 在 jupyter notebooks 中自动显示图可视化 #771
  8.  
  9. Genevieve Buckley 合并的 PR:向 dask 高级图添加块和类型信息 #7309。这个 PR 向高级图插入额外信息,以便我们稍后可以使用这些额外上下文创建更丰富的可视化。

示例

之前

之后(HTML 表示)

HTML representation for a Dask high level graph

之后(纯文本表示)

from dask.datasets import timeseries

ddf = timeseries().shuffle("id", shuffle="tasks").head(compute=False)
ddf.dask
HighLevelGraph with 3 layers.
<dask.highlevelgraph.HighLevelGraph object at 0x7fc259015b80>
 0. make-timeseries-94aab6e7236cbd9828bcbfb35fe6caee
 1. simple-shuffle-cd01443e43b7a6eb9810ad67992c40b6
 2. head-1-5-simple-shuffle-cd01443e43b7a6eb9810ad67992c40b6

这为我们提供了一个更有意义的表示,并且已经被开发高级图的开发人员使用。

文档

最后,关于高级图的文档很稀缺。这是因为它们相对较新,并且一直在发生相当大的变化。然而,这给人们带来了困难。我们计划改进文档,无论是针对Dask用户还是开发人员。

如果您想关注这些讨论或提供帮助,您可以订阅相关议题