这项工作由 Continuum Analytics摩尔基金会 (Moore Foundation) 的数据驱动发现倡议 (Data Driven Discovery Initiative) 提供支持。

我很高兴宣布 Dask 0.15.0 版本发布。此版本包含性能和稳定性增强,以及一些重大变更。这篇博文概述了自 5 月 5 日上次发布以来的显著变化。

和往常一样,你可以通过 conda 安装 Dask

conda install dask distributed

或通过 pip 从 PyPI 安装

pip install dask[complete] --upgrade

Conda 包在 defaults 和 conda-forge 两个通道都可用。

完整的更新日志在这里提供

以下是一些显著的变化。

NumPy ufuncs 现在可以作为 Dask.array ufuncs 运行

得益于 NumPy 1.13.0 中的近期更改,NumPy ufuncs 现在可以作为 Dask.array ufuncs 运行。此前,它们会将参数转换为 NumPy 数组,然后进行具体操作。

import dask.array as da
import numpy as np

x = da.arange(10, chunks=(5,))

# Before
>>> np.negative(x)
array([ 0, -1, -2, -3, -4, -5, -6, -7, -8, -9])

# Now
>>> np.negative(x)
dask.array<negative, shape=(10,), dtype=int64, chunksize=(5,)>

为了庆祝这一变化,我们还改进了对更多 NumPy ufunc 和 reduction API 的支持,例如对 out 参数的支持。这意味着实际 NumPy API 的非平凡子集可以直接与 dask.arrays 无缝协作。这使得编写能够无缝处理这两种数组类型的代码变得更加容易。

注意:此 ufunc 特性要求将 NumPy 更新到 1.13.0 或更高版本。PyPI 和 conda 的 defaults 和 conda-forge 通道都提供了相应的包。

异步客户端

Dask.distributed API 能够在 Tornado 或 Asyncio 事件循环中运行,这在与网络服务器等其他并发系统集成时,或在机器学习及其他领域构建更高级算法时非常有用。以前,实现此功能的 API 有些隐藏,只有少数人知道,并且使用下划线来表示方法是异步的。

# Before
client = Client(start=False)
await client._start()

future = client.submit(func, *args)
result = await client._gather(future)

这些方法仍然存在,但启动客户端的过程已发生变化,我们现在建议即使在异步情况下也使用完全公开的方法(以前这些方法会阻塞)。

# Now
client = await Client(asynchronous=True)

future = client.submit(func, *args)
result = await client.gather(future)  # no longer use the underscore

你也可以直接 await futures

result = await future

如果你更喜欢 Python 2,可以使用 yield 代替 await

更多信息请参阅 https://distributed.dask.org.cn/en/latest/asynchronous.html

单线程调度器从 dask.async 移至 dask.local

单机调度器以前位于 dask.async 模块中。由于 async 自 Python 3.5 起成为关键字,我们被迫重命名它。现在可以在 dask.local 中找到该代码。这尤其会影响使用单线程调度器的用户,该调度器以前称为 dask.async.get_sync。术语 dask.get 可用于在不同版本中可靠地引用单线程基础调度器。

停用 distributed.collections 模块

早期的博文曾提及诸如 futures_to_dask_array 之类的函数,它们位于 distributed.collections 模块中。这些函数现已被 Futures 和 Delayed 对象之间更好的交互方式完全取代。此模块已被完全移除。

始终使用 –local-directory 标志创建新目录

Dask 工作节点会创建一个目录来存放临时文件。通常这会进入你的操作系统临时目录(Linux 和 Mac 上的 /tmp)。

在网络文件系统上的一些用户会使用 dask-worker ... --local-directory 选项明确指定此目录,指向一个更好的位置,例如本地 SSD 驱动器。以前 Dask 会将文件直接放入提供的目录中。现在它将创建一个新的子目录并将文件放在那里。这对于网络文件系统上的用户来说通常更加方便。

$ dask-worker scheduler-address:8786 --local-directory /scratch
$ ls /scratch
worker-1234/
$ ls /scratch/worker-1234/
user-script.py disk-storage/ ...

Bag.map 不再自动展开元组

以前 map 方法会检查函数并自动展开元组以填充参数

import dask.bag as db
b = db.from_sequence([(1, 10), (2, 20), (3, 30)])

>>> b.map(lambda x, y: return x + y).compute()
[11, 22, 33]

尽管很方便,但此行为导致了一些边缘情况,并阻止我们支持多 Bag 映射函数。因此该行为已被移除。不过,好处是现在可以将两个共同分区的 Bag 映射在一起。

a = db.from_sequence([1, 2, 3])
b = db.from_sequence([10, 20, 30])

>>> db.map(lambda x, y: x + y, a, b).compute()
[11, 22, 33]

样式

客户端和 Futures 在 Jupyter notebook 中显示更美观的 HTML 表示。

仪表盘保持合适的宽度,并新增了导航栏,其中包含指向其他仪表盘页面的链接。此模板现已统一应用于所有仪表盘页面。

多客户端协调

已添加更多基本原语,以帮助同一集群上的多个客户端之间进行协调。这包括用于 futures 的 队列 (Queues) 和共享变量 (Variables)

通过预分散改进 Joblib 性能

当使用 Dask 通过 joblib.parallel_backend 上下文管理器来驱动 Joblib 计算(例如在 Scikit-Learn 中进行的计算)时,你现在可以将选定的数据预先分散到所有工作节点。这可以通过减少重复的数据传输来显著加快一些 scikit-learn 计算。

import distributed.joblib
from sklearn.externals.joblib import parallel_backend

# Serialize the training data only once to each worker
with parallel_backend('dask.distributed', scheduler_host='localhost:8786',
                      scatter=[digits.data, digits.target]):
      search.fit(digits.data, digits.target)

其他数组改进

  • 完善了 dask.array.fft 模块
  • 添加了基本的 dask.array.stats 模块,其中包含诸如 chisquare 之类的函数
  • 支持 @ 矩阵乘法运算符

总体性能和稳定性

和往常一样,发现并解决了一些错误,并实现了一些性能优化。感谢所有持续帮助发现和改进领域的用户和开发者。用户通常会获得更流畅的体验。

移除了 ZMQ 网络后端

我们移除了实验性的 ZeroMQ 网络后端。这在实践中并不是特别有用。但在我们使网络通信层可以通过不同协议进行插拔时,它在作为示例方面非常有效。

以下相关项目也于近期发布,可能值得更新

  • NumPy 1.13.0
  • Pandas 0.20.2
  • Bokeh 0.12.6
  • Fastparquet 0.1.0
  • S3FS 0.1.1
  • Cloudpickle 0.3.1 (pip)
  • lz4 0.10.0 (pip)

致谢

以下是自 5 月 5 日 0.14.3 版本发布以来为 dask/dask 仓库做出贡献的人员

  • Antoine Pitrou
  • Elliott Sales de Andrade
  • Ghislain Antony Vaillant
  • John A Kirkham
  • Jim Crist
  • Joseph Crail
  • Juan Nunez-Iglesias
  • Julien Lhermitte
  • Martin Durant
  • Matthew Rocklin
  • Samantha Hughes
  • Tom Augspurger

以下是自 5 月 5 日 1.16.2 版本发布以来为 dask/distributed 仓库做出贡献的人员

  • A. Jesse Jiryu Davis
  • Antoine Pitrou
  • Brett Naul
  • Eugene Van den Bulke
  • Fabian Keller
  • Jim Crist
  • Krisztián Szűcs
  • Matthew Rocklin
  • Simon Perkins
  • Thomas Arildsen
  • Viacheslav Ostroukh

博客评论由 Disqus 提供支持