这项工作得到了 Anaconda Inc. 以及来自 摩尔基金会 (Moore Foundation) 数据驱动发现计划的支持。

我很高兴宣布 Dask 0.17.0 版本发布。这是一个重要的主要版本,包含新功能、破坏性变更和稳定性改进。这篇博文概述了自 11 月 21 日 0.16.0 版本发布以来值得注意的变更。

您可以通过 conda 安装 Dask

conda install dask -c conda-forge

或通过 pip 从 PyPI 安装

pip install dask[complete] --upgrade

完整的更新日志可在以下位置查看

以下是一些值得注意的变更。

弃用

  • 移除了 dask.dataframe.rolling_* 方法,这些方法之前已在 dask.dataframe 和 pandas 中弃用。它们已被 rolling.* 命名空间取代。
  • 我们已普遍停止维护 dask-ec2 项目,该项目用于使用 Salt 在亚马逊 EC2 上启动 Dask 集群。我们通常建议在亚马逊 EC2、谷歌云和 Azure 上都改用 kubernetes。

    dask.pydata.org/en/latest/setup/kubernetes.html

  • 分布式调度器的内部状态发生了重大变化。这可能会影响检查此状态进行调试或诊断的高级用户。

任务排序

随着 Dask 遇到来自更多领域的更复杂问题,我们不断遇到其当前启发式算法表现不佳的问题。此版本重写了我们的静态任务优先级启发式算法。这将提高 Dask 在遍历复杂计算时保持低内存使用的能力。

为了帮助调试,我们还将这些启发式算法集成到了可视化方法生成的 GraphViz 风格的图中。

x = da.random.random(...)
...
x.visualize(color='order', cmap='RdBu')

嵌套 Joblib

Dask 通过扩展 Scikit-Learn 用于并行的底层库 Joblib 来支持 Scikit-Learn 的并行化。这使得 Dask 只需用上下文管理器包装 一些 SKLearn 算法即可将其分布到集群上。

这种关系得到了加强,尤其关注了将一个并行计算嵌套在另一个并行计算中的情况,例如在另一个并行计算(如 GridSearchCV)中训练并行估计器(如 RandomForest)。以前,这会导致产生过多的线程/进程,通常是硬件资源超额分配。

由于 Joblib 和 Dask 最近的联合开发,现在可以将此类情况高效地交给 Dask 处理,即使在单机情况下也能提供加速。

from sklearn.externals import joblib
import distributed.joblib  # register the dask joblib backend

from dask.distributed import Client
client = Client()

est = ParallelEstimator()
gs = GridSearchCV(est)

with joblib.parallel_backend('dask'):
    gs.fit()

请参阅 Tom Augspurger 最近的博文,了解这项工作的更多详情

感谢 Tom AugspurgerJim CristOlivier Grisel 完成了这项工作的大部分。

调度器内部重构

分布式调度器经过重大重构,将其从字典森林

priority = {'a': 1, 'b': 2, 'c': 3}
dependencies = {'a': {'b'}, 'b': {'c'}, 'c': []}
nbytes = {'a': 1000, 'b': 1000, 'c': 28}

变为对象集合

tasks = {'a': Task('a', priority=1, nbytes=1000, dependencies=...),
         'b': Task('b': priority=2, nbytes=1000, dependencies=...),
         'c': Task('c': priority=3, nbytes=28, dependencies=[])}

(状态信息远多于上面列出的,但希望上面的示例是清楚的。)

这样做的原因有几点

  1. 我们想尝试 Cython 和 PyPy,对于它们来说,这样的对象可能比字典更有效。
  2. 我们认为这对于调度器新手开发者来说可能更容易理解。状态字典的泛滥不易被发现。

第一个目标最终并未实现。使用这种新布局,我们尚未能在 Cython 或 PyPy 下显著加快调度器的速度。这些变更甚至导致内存略有增加。但是,我们对代码可读性方面的结果感到满意,并希望其他人也觉得这很有用。

感谢 Antoine Pitrou,他完成了这项工作的大部分。

用户优先级

您现在可以提交具有不同优先级的任务。

x = client.submit(f, 1, priority=10)   # Higher priority preferred
y = client.submit(f, 1, priority=-10)  # Lower priority happens later

需要澄清的是,Dask 一直都有优先级,只是用户不容易设置。优先级较高的任务会被优先处理。所有任务的默认优先级为零。您也可以为集合(如数组和数据框)提交优先级。

df = df.persist(priority=5)  # give this computation higher priority.

几个相关项目也正在发布新版本

  • Tornado 正在更新到 5.0 版本(目前已发布测试版)。这是一个重大变化,将使 Tornado 在 Python 3 中运行于 Asyncio 事件循环之上。它还包含许多针对高带宽网络的性能增强功能。
  • Bokeh 0.12.14 刚刚发布。

    请注意,您需要更新 Dask 才能使用此版本的 Bokeh

  • Daskernetes,一个用于在 Kubernetes 集群上启动 Dask 的新项目

致谢

自 11 月 14 日 0.16.0 版本发布以来,以下人员为 dask/dask 仓库做出了贡献

  • Albert DeFusco
  • Apostolos Vlachopoulos
  • castalheiro
  • James Bourbeau
  • Jon Mease
  • Ian Hopkinson
  • Jakub Nowacki
  • Jim Crist
  • John A Kirkham
  • Joseph Lin
  • Keisuke Fujii
  • Martijn Arts
  • Martin Durant
  • Matthew Rocklin
  • Markus Gonser
  • Nir
  • Rich Signell
  • Roman Yurchak
  • S. Andrew Sheppard
  • sephib
  • Stephan Hoyer
  • Tom Augspurger
  • Uwe L. Korn
  • Wei Ji
  • Xander Johnson

自 11 月 14 日 1.20.0 版本发布以来,以下人员为 dask/distributed 仓库做出了贡献

  • Alexander Ford
  • Antoine Pitrou
  • Brett Naul
  • Brian Broll
  • Bruce Merry
  • Cornelius Riemenschneider
  • Daniel Li
  • Jim Crist
  • Kelvin Yang
  • Matthew Rocklin
  • Min RK
  • rqx
  • Russ Bubley
  • Scott Sievert
  • Tom Augspurger
  • Xander Johnson

博客评论由 Disqus 提供支持