执行摘要
目前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高级图层。以下是一个非详尽列表。
迄今为止的工作
亮点包括(排名不分先后)
- Rick Zamora 合并的 PR:为 DataFrame IO(parquet, csv, and orc)使用 Blockwise #7415
- Rick Zamora 合并的 PR:将 read_hdf 移至 Blockwise 7625
- Rick Zamora 合并的 PR:将 timeseries 和 daily-stock 移至 Blockwise #7615
- John Kirkham 合并的 PR:使用 da.blockwise 重写 da.fromfunction #7704
正在进行的工作
其他许多与 Blockwise 相关的工作正在进行中
- Ian Rose:Blockwise 数组创建重述 #7417。该 PR 为 from_array 和 from_zarr 函数创建了 Blockwise 实现。
- Rick Zamora:将 DataFrame from_array 和 from_pandas 移至 Blockwise #7628
- Bruce Merry:对于带有 block_id 或 block_info 的 map_blocks 使用 BlockwiseDep #7686
map overlap 的高级图
总结
研究 Dask 的 map_overlap 的高级图是一个由用户需求驱动的项目。人们告诉我们,有时仅仅生成任务图所需的时间(在实际计算发生之前)就可能是一个很大的用户体验问题。因此,我们正在寻找改进它的方法。
迄今为止的工作
- Genevieve Buckley 合并的 PR:map_overlap 的 HighLevelGraph 抽象层 #7595
这个 PR 推迟了创建 Dask 任务图涉及的大部分计算,但没有减少总的端到端计算时间。因此还需要进一步优化。
正在进行的工作
后续工作包括
- 在不实例化层的情况下找到 overlap 层中的任务数量 #7788 https://github.com/dask/dask/issues/7788
- 为 ArrayOverlapLayer 实现 cull 方法 #7789 https://github.com/dask/dask/issues/7789 (culling 是通过移除不必要的任务来简化 Dask 图)
切片与高级图
总结
对 map_overlap 进行性能分析时,我们发现大量时间花费在切片操作上。因此,切片是下一步研究高级图可能带来的性能改进的合乎逻辑的选择。
同时,Rick Zamora 一直在研究 Dask 的 dataframe 部分,利用高级图改进 dataframe 的切片/选择。
迄今为止的工作
几项小的错误修复/改进
- Genevieve Buckley 合并的 PR:SimpleShuffleLayer 应该将 parts_out 与 set(self.parts_out) 进行比较 #7787
- Genevieve Buckley 合并的 PR:将 Layer get_output_keys 正式设为抽象方法 #7775
正在进行的工作
- Rick Zamora:[进行中] 添加 DataFrameGetitemLayer 以简化 HLG 优化 #7663
- Genevieve Buckley:数组切片 HighLevelGraph 层 #7655
可视化
总结
我们还投入了一些工作来改进 Dask 对象(包括高级图)的可视化。
为您的类定义一个 _repr_html_ 方法是使用 jupyter notebooks 时获得漂亮 HTML 输出的好方法。您可以阅读这篇文章以查看其他科学计算 Python 库中更多简洁的 HTML 表示。
Dask 已经在许多地方使用了 HTML 表示(例如 Array 和 Dataframe 类)。我们现在有了 HighLevelGraph 和 Layer 对象的新 HTML 表示,以及 Dask distributed 中的 Scheduler 和 Client 对象。
迄今为止的工作
- Jacob Tomlinson 合并的 PR:为 scheduler_info 添加 HTML 表示并整合到 client 和 cluster 表示中 #4857
- Jacob Tomlinson 合并的 PR:CLient.who_has 和 Client.has_what 的 HTML 表示
- Genevieve Buckley 合并的 PR:HighLevelGraph 层的 HTML 表示实现 #7763 https://github.com/dask/dask/pull/7763
- Genevieve Buckley 合并的 PR 在 jupyter notebooks 中自动显示图可视化 #771
- Genevieve Buckley 合并的 PR:向 dask 高级图添加块和类型信息 #7309。这个 PR 向高级图插入额外信息,以便我们稍后可以使用这些额外上下文创建更丰富的可视化。
示例
之前
之后(HTML 表示)
之后(纯文本表示)
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用户还是开发人员。
如果您想关注这些讨论或提供帮助,您可以订阅相关议题