诊断(分布式)

The 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, ...])

跟踪期货的进展

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 笔记本。例如,如果我们选择这样做,我们可以通过 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)[源代码]

跟踪期货的进展

这在笔记本和控制台中的操作方式不同

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

  • 控制台:此操作会一直阻塞,直到计算完成

参数
未来未来

要跟踪的未来列表或键

笔记本bool (可选)

是否在笔记本中运行(默认为猜测)

bool (可选)

独立跟踪不同的功能(默认为True)

完成bool (可选)

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

按组可调用对象 | 字面量[“spans”] | 字面量[“prefix”]

使用跨度而不是任务键名来分组任务(默认为“前缀”)

注释

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

示例

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

在上下文块中收集任务流

这提供了在此块活动期间运行的每个任务的诊断信息。

这必须作为上下文管理器使用。

参数
plot: boolean, str

如果为真,则还返回一个 Bokeh 图形。如果 plot == ‘save’,则将图形保存到文件中。

filename: str (可选)

如果你设置 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 。这个过程应该会提供一个可分享的链接,其他人可以使用该链接查看你的任务流图。