提交新活动

谢谢!您的提交已收到!
哎呀!提交表单时出现问题。

提交新闻稿

谢谢!您的提交已收到!
哎呀!提交表单时出现问题。

订阅时事通讯

谢谢!您的提交已收到!
哎呀!提交表单时出现问题。
2018年2月12日

Dask 发布 0.17.0 版本

作者

这项工作得到 Anaconda Inc.和来自 MooreFoundation的数据驱动发现倡议的支持。

很高兴宣布发布 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 在 Amazon EC2 上启动 Dask 集群。我们现在通常推荐在 Amazon EC2、Google Cloud 和 Azure 上使用 Kubernetes。
  • dask.pydata.org/en/latest/setup/kubernetes.html
  • 分布式调度器的内部状态发生了显著变化。这可能会影响那些检查此状态进行调试或诊断的高级用户。

任务排序

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

为了辅助调试,我们还将这些启发式算法集成到 visualize 方法生成的 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) # 优先级越高越优先执行
y = client.submit(f, 1, priority=-10) # 优先级越低越后执行

需要说明的是,Dask 一直都有优先级,只是不容易由用户设置。优先级高的任务会优先执行。所有任务的默认优先级为零。您也可以为集合(如数组和数据帧)设置优先级

df = df.persist(priority=5) # 为此计算设置更高的优先级。

相关项目

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

  • Tornado 正在更新到 5.0 版本(目前已有 Beta 版)。这是一个重大变更,将使 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