诊断 (分布式)

Dask 分布式调度器 以两种形式提供实时反馈

  1. 包含许多图表和表格的交互式仪表板,提供实时信息

  2. 适用于控制台或笔记本交互式使用的进度条

仪表板

有关 Dask 仪表板的信息,请参阅 仪表板诊断

捕获诊断信息

get_task_stream([client, plot, filename])

在上下文块内收集任务流

Client.profile([key, start, stop, workers, ...])

收集近期工作的统计分析信息

performance_report([filename, stacklevel, ...])

收集性能报告

您可以使用 get_task_streamClient.profile 函数捕获仪表板提供的部分信息,以便进行离线处理。这些函数捕获每个任务和数据传输的开始和结束时间,以及统计分析器的结果。

with get_task_stream(plot='save', filename="task-stream.html") as ts:
    x.compute()

client.profile(filename="dask-profile.html")

history = ts.data

此外,Dask 可以使用 performance_report 上下文管理器一次保存多个诊断仪表板,包括任务流、工作进程分析、带宽等信息。

from dask.distributed import performance_report

with performance_report(filename="dask-report.html"):
    ## some dask computation

以下视频更详细地演示了 performance_report 上下文管理器

进度条

progress(*futures[, notebook, multi, ...])

跟踪 futures 进度

dask.distributed 进度条与用于本地诊断ProgressBar 不同。progress 函数接受一个在后台执行的 Dask 对象

# Progress bar on a single-machine scheduler
from dask.diagnostics import ProgressBar

with ProgressBar():
    x.compute()

# Progress bar with the distributed scheduler
from dask.distributed import Client, progress

client = Client()  # use dask.distributed by default

x = x.persist()  # start computation in the background
progress(x)      # watch progress

x.compute()      # convert to final result when done if desired

连接到仪表板

某些计算机网络可能会限制对特定端口的访问,或者只允许从特定机器访问。如果您无法访问仪表板,可能需要联系您的 IT 管理员。

下面是一些常见问题和解决方案

指定可访问端口

有些集群限制了对外部可见的端口。这些端口可能包括 Web 接口的默认端口 8787。有几种方法可以处理这种情况

  1. 向外部开放端口 8787。这通常需要询问您的集群管理员。

  2. dask-scheduler 命令中使用 --dashboard-address :8787 选项指定一个可公开访问的不同端口。

  3. 使用更高级的技术,例如端口转发

端口转发

如果您有 SSH 访问权限,那么访问被阻止端口的一种方法是通过 SSH 端口转发。一个典型的用例如下

local$ ssh -L 8000:localhost:8787 user@remote
remote$ dask-scheduler  # now, the web UI is visible at localhost:8000
remote$ # continue to set up dask if needed -- add workers, etc

然后就可以访问 localhost:8000 并看到 Dask Web UI。这种方法并非 dask.distributed 所特有,而是可以用于任何通过网络运行的服务,例如 Jupyter Notebooks。例如,如果我们选择这样做,可以使用 ssh -L 8001:localhost:8888 user@remote 将端口 8888(默认的 Jupyter 端口)转发到端口 8001。

所需包

必须在调度器的环境中安装 Bokeh 才能运行仪表板。如果未安装,仪表板页面会提示您安装。

根据您的配置,您可能还需要安装 jupyter-server-proxy 来访问仪表板。

API

dask.distributed.progress(*futures, notebook=None, multi=True, complete=True, group_by='prefix', **kwargs)[source]

跟踪 futures 进度

在 Notebook 和控制台中,此函数的操作方式不同

  • Notebook: 立即返回,并在屏幕上留下一个 IPython 小部件

  • 控制台: 阻塞直到计算完成

参数
futuresFutures

要跟踪的 futures 或键列表

notebook布尔值 (可选)

是否在 Notebook 中运行 (默认为猜测)

multi布尔值 (可选)

独立跟踪不同的函数 (默认为 True)

complete布尔值 (可选)

跟踪所有键 (True) 或仅跟踪尚未运行的键 (False) (默认为 True)

group_byCallable | Literal[“spans”] | Literal[“prefix”]

使用 spans 而不是任务键名对任务进行分组 (默认为 “prefix”)

注意

在 Notebook 中,progress 的输出必须是单元格中的最后一条语句。通常这意味着在单元格末尾调用 progress

示例

>>> progress(futures)  
[########################################] | 100% Completed |  1.7s
dask.distributed.get_task_stream(client=None, plot=False, filename='task-stream.html')[source]

在上下文块内收集任务流

此函数提供在此块处于活动状态期间运行的每个任务的诊断信息。

此函数必须用作上下文管理器。

参数
plot: 布尔值, 字符串

如果为 True,则同时返回一个 Bokeh 图。如果 plot == ‘save’,则将图保存到文件。

filename: 字符串 (可选)

如果设置了 plot='save',要保存的文件名

另请参阅

Client.get_task_stream

此上下文管理器的函数版本

示例

>>> with get_task_stream() as ts:
...     x.compute()
>>> ts.data
[...]

获取一个 Bokeh 图,并可选择保存到文件

>>> with get_task_stream(plot='save', filename='task-stream.html') as ts:
...    x.compute()
>>> ts.figure
<Bokeh Figure>

要与他人共享此文件,您可能希望将其上传并在网上提供服务。一种常见方法是将文件作为 gist 上传,然后通过 https://raw.githack.com 提供服务。

$ python -m pip install gist
$ gist task-stream.html
https://gist.github.com/8a5b3c74b10b413f612bb5e250856ceb

然后,您可以导航到该网站,点击 task-stream.html 文件右侧的“Raw”按钮,然后将该 URL 提供给 https://raw.githack.com。此过程应提供一个可共享的链接,供他人查看您的任务流图。