概述

这里是关于可视化 Dask 图和 HTML 表示的新功能的最新信息。您可以使用版本 2021.08.1 或更高版本立即试用这些新功能。这项工作由 Freyam Mehta 在 Google 夏日代码之约 2021 期间完成。Dask 在 NumFOCUS 伞状组织的赞助下参与了该项目。

目录

可视化 Dask 图

有几个涉及 Dask 任务图可视化的新功能。任务图是 Dask 计算中每个独立任务的顺序和依赖关系的视觉表示。它们是非常有用的诊断工具,并且已经被使用了很长时间。

An example task graph visualization.

Freyam 致力于使这些可视化更具说明性、吸引力和信息量。Graphviz 库拥有一套出色的属性集,可以对其进行修改以创建更具视觉吸引力的输出。

这些功能主要改进了 Dask 高级图的可视化。低级和高级 Dask 图都可以通过非常相似的方法访问

  • Dask 低级图: result.visualize()
  • Dask 高级图: result.dask.visualize()

…其中 result 是一个 dask 对象或集合。

Graphviz 节点大小缩放

您可能注意到的 Dask 高级图的第一个变化是,节点大小已根据每层中任务的数量进行调整以实现缩放。任务更多的层会比其他层看起来更大。

这是一个很有用的功能,因为现在用户可以更直观地了解他们大部分计算发生在哪里。

示例

import dask.array as da

array = da.random.random((10000, 10000), chunks=(200, 200))
result = array + array.T - array.mean(axis=0)

result.dask.visualize()  # Dask high level graph

Example: graphviz node size scaling, pull request #7869

注意:此更改仅影响 Dask 高级图的 graphviz 输出。低级图保持不变,因为每个可视化节点对应一个任务。

参考:Freyam Mehta 的 Pull request #7869 “向高级图的 Graphviz 输出添加节点大小缩放”

新工具提示

Dask 高级图现在包含悬停工具提示,以提供更详细信息的简要摘要。要使用工具提示,请生成一个 dask 高级图(例如:result.dask.visualize()),然后将鼠标悬停在您感兴趣的层上。

Example: tooltips provide extra information, pull request #7973

工具提示提供有关层类型和与之关联的任务数量等信息。还为特定的 dask 集合提供了额外信息,例如 dask 数组和数据帧。

Dask 数组工具提示信息还包括

  • 数组形状
  • 块大小
  • 块类型(例如:数组块是 numpy、cupy、sparse 等类型吗)
  • 数据类型(例如:数组值是浮点型、整型、布尔型等类型吗)

Dask 数据帧工具提示信息还包括

  • 分区数量
  • 数据帧类型
  • 数据帧列

用户曾要求对 dask 任务图提供一种不那么令人不知所措的视图。我们希望高级图视图结合更详细的工具提示信息能够提供这种中间地带,既有足够的信息可用,又不至于像大型计算的低级任务图那样令人不知所措。

注意:此功能适用于 SVG 输出。其他图像格式,例如 .png 等,不支持工具提示。

参考:Freyam Mehta 的 Pull request #7973 “向 graphviz 添加工具提示”

按层类型着色

还有一个新功能,允许用户根据层类型对高级图进行颜色编码。可以通过传递 color="layer_type" 关键字参数启用此选项,例如:result.dask.visualize(color="layer_type")。此更改旨在让用户更容易看到哪种层类型占主导地位。

虽然关于如何使 Dask 计算高效没有硬性规定,但有一些通用指南

  • 数据帧混洗(shuffle)是特别耗费资源的操作。您可以在此处阅读更多相关信息
  • 从存储/网络服务读写数据通常延迟很高,因此是一个瓶颈。
  • 分块层(Blockwise layers)通常对计算是高效的。
  • 所有层在计算期间都会被具体化(materialized)。

有关创建更高效 Dask 计算的更多信息,请参阅 Dask 最佳实践页面。

示例

import dask
import dask.dataframe as dd

df = dask.datasets.timeseries()
df2 = df[df.y > 0]
df3 = df2.groupby('name').x.std()

df3.dask.visualize(color="layer_type")  # Dask high level graph with colored nodes by layer type

Example: Dask graph colored by layer type, pull request #7974

参考:Freyam Mehta 的 Pull request #7974 “添加颜色表示高级层类型”

visualize 方法中的 Bug 修复

Freyam 还修复了一个错误,该错误在使用 filename=None 调用 dask.visualize() 时会导致错误(问题 #7685,由 pull request #7740 修复)。

通过在到达错误之前添加额外条件修复了该 bug。如果格式为 None,Dask 现在默认使用 png 格式。

import dask
import dask.array as da

array = da.arange(10)
dask.visualize(array, filename=None)  # success

参考:Freyam Mehta 的 Pull request #7740 “修复使用 filename=None 调用 .visualize()”

HTML 表示

Dask 在多个地方使用了 HTML 表示,例如在 Array 和 Dataframe 类等 Dask 集合中(背景阅读请参阅这篇博客文章)。

最近,我们已将高级图的 HTML 表示引入 Dask,Jacob Tomlinson 也在 dask distributed 库的多个地方实现了 HTML 表示(进一步阅读请参阅这篇其他博客文章)。

在 Freyam 的 Google 夏日代码之约项目期间,他扩展了 Dask 高级图的 HTML 表示以包含图像,并在 dask distributed 库中引入了两个全新的 HTML 表示。

高级图 HTML 表示中的数组图像

dask 高级图的 HTML 表示已得到扩展,现在包含计算中间阶段的 dask 数组 SVG 图像。

此功能的动机类似于前面讨论的添加工具提示的动机。用户希望更轻松地访问有关 Dask 计算在每个计算阶段如何变化的信息。我们希望对 Dask 高级图 HTML 表示的此改进能够一目了然地提供每个阶段的数组形状和块大小摘要。

示例

import dask.array as da

array = da.ones((10, 20), chunks=(5, 10))
array = array.T

array.dask  # shows the HTML representation in Jupyter

Example: Array images now included in HTML representation of Dask high level graphs, pull request #7886

参考:Freyam Mehta 的 Pull request #7886 “向 HTML 表示添加 dask.array SVG”

ProcessInterface 类的新 HTML 表示

已为 dask distributed 中的 ProcessInterface 类创建了一个新的 HTML 表示。

该 HTML 表示显示进程的状态、地址和外部地址。

有三种可能的状态选项

  • 进程已创建,尚未运行(蓝色图标)
  • 进程正在运行(绿色图标)
  • 进程已关闭(橙色图标)

Example: New HTML representation for distributed ProcessInterface class, pull request #5181

ProcessInterface 类不打算直接使用。相反,通常通过 SSH 调度器或工作器等子类访问此信息。

示例

from dask.distributed import LocalCluster, Client, SSHCluster

cluster = SSHCluster(["127.0.0.1", "127.0.0.1", "127.0.0.1"])
cluster.scheduler  # HTML representation for the SSH scheduler, shown in Jupyter
cluster.workers  # dict of all the workers
# or
cluster.workers[0]  # HTML representation for the first SSH worker in the cluster

Example: New HTML representation for distributed ProcessInterface class, pull request #5181

参考:Freyam Mehta 的 Pull request #5181 “为 ProcessInterface 类及其所有子类添加 HTML 表示”

Security 类的新 HTML 表示

Pull request #5178dask distributed 库中的 Security 类添加了一个新的 HTML 表示。

Security HTML 表示显示

  • 是否需要加密
  • 对象实例是使用 Security.temporary() 创建的还是使用 Security(**paths_to_keys) 创建的。
    • 对于临时安全对象,密钥是动态生成的,并且只有一份副本保存在内存中。
    • 对于使用存储在磁盘上的密钥创建的安全对象,HTML 表示将显示磁盘上相关安全证书的完整文件路径。

示例:临时安全对象

from dask.distributed import Security

s = Security.temporary()
s  # shows the HTML representation in Jupyter

示例:使用保存到磁盘的证书的安全对象

from dask.distributed import Security

s = Security(require_encryption=True, tls_ca_file="ca.pem", tls_scheduler_cert="scert.pem")
s  # shows the HTML representation in Jupyter

Example: New HTML representation for distributed Security class, pull request #5178

此外,文本表示也已更新,以反映与 HTML 表示中相同的信息。

Example: New text representation for distributed Security class, pull request #5178

参考:Freyam Mehta 的 Pull request #5178 “为 Security 类添加 HTML 表示”


博客评论由 Disqus 提供支持