提交新活动

谢谢您!您的提交已收到!
糟了!提交表单时出现问题。

提交新闻专题

谢谢您!您的提交已收到!
糟了!提交表单时出现问题。

订阅新闻通讯

谢谢您!您的提交已收到!
糟了!提交表单时出现问题。
2021年8月23日

2021年Google编程之夏 - Dask项目

作者

概述

以下是有关可视化Dask图和HTML表示的新功能更新。您今天就可以使用2021.08.1或更高版本尝试这些新功能。这项工作由Freyam Mehta在2021年Google编程之夏期间完成。Dask在NumFOCUS伞形组织的框架下参与了该项目。

目录

可视化Dask图

HTML表示

可视化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的拉取请求#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的拉取请求#7973 “为graphviz添加工具提示”

按层类型着色

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

虽然对于如何使Dask计算高效没有硬性规定,但有一些通用准则

     
  • 数据框混洗是特别昂贵的操作。您可以在此处阅读更多相关信息
  •  
  • 从存储/网络服务读取和写入数据通常延迟较高,因此会成为瓶颈。
  •  
  • 块级层通常对计算是高效的。
  •  
  • 所有层在计算过程中都会被具体化。

有关创建更高效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的拉取请求#7974 “添加颜色以表示高级层类型”

visualize方法中的错误修复

Freyam还修复了一个错误,该错误导致用户尝试使用filename=None调用dask.visualize()时出错(问题#7685,由拉取请求#7740修复)。

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

import dask
import dask.array as da

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

参考:Freyam Mehta的拉取请求#7740 “修复使用filename=None调用.visualize()的问题”

HTML表示

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

最近,我们在Dask中引入了高级图的HTML表示,并且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的拉取请求#7886 “将dask.array SVG添加到HTML表示”

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的拉取请求#5181 “为ProcessInterface类及其所有子类添加HTML表示”

Security类的新HTML表示

拉取请求#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的拉取请求#5178 “为Security类添加HTML表示”