仪表盘诊断

分析并行代码可能具有挑战性,但 Dask 的 分布式调度器 提供的交互式仪表板通过实时监控 Dask 计算,使得这一过程变得更加容易。该仪表板使用 Bokeh 构建,并且会在调度器创建时自动启动,返回一个指向仪表板的链接。

在本地,这是当你创建一个 客户端 并连接调度器时:

from dask.distributed import Client
client = Client()  # start distributed scheduler locally.

在 Jupyter Notebook 或 JupyterLab 会话中显示客户端对象将显示仪表板地址:

客户端 html 表示在 JupyterLab 会话中显示仪表板链接。

你也可以从 client.dashboard_link 查询地址(或者对于分布式旧版本,从 client.scheduler_info()['services'] 查询)。

默认情况下,当在本地机器上启动调度器时,仪表板将在 http://localhost:8787/status 提供服务。您可以将此地址输入浏览器以访问仪表板,但如果端口 8787 被占用,可能会被重定向到其他地方。您还可以使用 dashboard_address 参数配置地址(参见 LocalCluster)。

有众多诊断图表可供使用。在本指南中,您将了解一些最常用的图表,这些图表显示在仪表板入口点上:

主仪表板分为两列,包含五个窗格。左列有三个条形图。前两个显示存储的总字节数和每个工作者的字节数。底部有三个标签,用于在任务处理、CPU利用率和占用率之间切换。右列有两个条形图,分别用相应的颜色显示随时间变化的任务活动,称为任务流和进度。

存储的字节数和每个工作者的字节数

这两张图显示了集群上总体内存使用情况(存储的字节数),以及每个工作节点的单独使用情况(每个工作节点的字节数)。这些图上的颜色表示如下。

Memory under target (default 60% of memory available)
Memory is close to the spilling to disk target (default 70% of memory available)
When the worker (or at least one worker) is paused (default 80% of memory available) or retiring
Memory spilled to disk
两张内存使用情况的条形图。顶部图表显示了总集群内存,以单一条形表示,大部分低于目标内存 - 根据内存使用情况改变颜色,(蓝色 - 低于目标,橙色 - 内存即将溢出,红色 - 暂停或即将退役,以及一小部分溢出到磁盘的灰色部分。底部图表显示每个工作节点的内存使用情况,每个工作节点有一个单独的条形。四个条形可以看到各种颜色,蓝色表示低于目标,橙色表示工作节点的内存接近溢出到磁盘的目标,第二个和第四个工作节点的条形中有一部分是灰色,对应溢出到磁盘的量,第四个工作节点的条形是红色,表示暂停或即将退役。

这些图表上不同级别的透明度与内存类型(托管、非托管和近期非托管)相关,你可以在 Worker 内存管理文档 中找到它们的详细解释。

任务处理/CPU 利用率/占用率/数据传输

任务处理

图中的 处理 标签显示了已分配给每个工作者的任务数量。并非所有这些任务当前都处于 执行 状态:一个工作者一次只能执行与其线程数相等的任务。分配给工作者的任何额外任务将根据其 优先级 以及它们的依赖项是否在工作者的内存中来等待运行。

调度器将尝试确保工作者处理的任务数量大致相同。如果其中一个条完全为白色,这意味着该工作者没有任务,正在等待任务。这通常发生在计算接近完成时(无需担心),但也可能意味着任务在工作者之间的分配没有优化。

在这个图中,有三种不同的颜色可以出现:

Processing tasks.
Saturated: It has enough work to stay busy.
Idle: Does not have enough work to stay busy.
任务处理条形图,显示每个工作者的任务数量相对均匀。

在这个仪表板上的图表中,我们有两个额外的标签,包含以下信息:

CPU 利用率

CPU” 标签显示了每个工作者的 CPU 使用情况,这些数据由 psutil 指标报告。

占用率

Occupancy” 标签显示每个工人的占用时间。一个工人的总占用时间是 Dask 预计运行所有任务并从其他工人传输任何依赖项所需的时间,如果执行和传输是逐一进行的。例如,如果一个工人的占用时间为 10 秒,并且它有 2 个线程,您可以预计该工人完成所有任务大约需要 5 秒的挂钟时间。

数据传输

数据传输” 标签显示了每个工作者之间开放数据传输的大小。

任务流

任务流是每个工作线程上运行的任务的视图。每行代表一个线程,每个矩形代表一个单独的任务。每个矩形的颜色对应于正在执行的任务的任务前缀,并与 进度图 的颜色相匹配。这意味着所有属于 inc 任务前缀的单个任务,例如,将具有相同的颜色(从 viridis 颜色图中随机选择)。

请注意,当一个新的工作者加入时,即使它是替代一个最近离开的工作者,它也会获得一个新的行。因此,在任务流上可能会暂时看到比当前集群中实际线程数更多的行,因为旧工作者和新工作者的历史记录都会被显示。

某些颜色是为特定类型的操作保留的:

Transferring data between workers.
Reading from or writing to disk.
Serializing/deserializing data.
Erred tasks.

在某些情况下,仪表板会在每个矩形之间有空白区域。在那段时间,工作线程处于空闲状态。过多的空白区域表明资源使用效率不高。此外,许多长红色条(传输)可能表明存在性能问题,原因可能包括块大小过大、图表过于复杂,甚至是调度选择不当。

堆积条形图,每个工作线程对应一个条形,不同任务用不同深浅的蓝色和绿色表示,偶尔会有非常窄的红色条形重叠在其上。

一个健康的任务流的示例,几乎没有空白区域。传输(红色)迅速,并与计算重叠。

堆积条形图,每个工作线程对应一个条形,大部分是空的(白色)。每行只有偶尔的几次活动爆发。还有一些红色和橙色的条形,其中一些很长,不与其他颜色重叠。

一个不健康的任务流的例子,包含大量空白区域。工人大部分时间处于空闲状态。此外,存在一些长时间传输(红色),这些传输与计算不重叠。我们还看到磁盘溢出(橙色)。

进展

进度条图显示了每个任务前缀的进度。每条进度条的颜色与任务流中相同任务前缀的单个任务颜色相匹配。每条水平进度条从左到右有四个不同的组成部分:

  • Tasks that have completed, are not needed anymore, and now have been released from memory.
  • Tasks that have completed and are in memory.
  • Tasks that are ready to run.
  • Tasks that are queued. They are ready to run, but not assigned to workers yet, so higher-priority tasks can run first.
  • Tasks that do not have a worker to run on due to restrictions or limited resources.
进度条图表,每个任务前缀匹配名称 "add"、"double"、"inc" 和 "sum" 各有一条进度条。"double"、"inc" 和 "add" 进度条的进度约为总任务的三分之一,以各自的颜色显示,透明度不同。"double" 和 "inc" 进度条有条纹灰色背景,而 "sum" 进度条为空。

Dask JupyterLab 扩展

JupyterLab Dask 扩展 允许你将 Dask 的仪表盘图直接嵌入到 JupyterLab 窗格中。

一旦安装了 JupyterLab Dask 扩展,您可以选择任何可用的单个图表,并将其作为面板集成到您的 JupyterLab 会话中。例如,在下图中,我们选择了 任务流进度工作内存图表 图表。

Dask JupyterLab 扩展显示了从绘图选项中选择的四个窗格的排列。显示的窗格是任务流、每个工作者的字节数、进度和任务图。