Dask 0.17.0 版本发布
这项工作得到了 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 遇到来自更多领域的更复杂问题,我们不断遇到其当前启发式算法表现不佳的问题。此版本重写了我们的静态任务优先级启发式算法。这将提高 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 最近的博文,了解这项工作的更多详情
- http://tomaugspurger.github.io/distributed-joblib.html
- joblib/joblib #595
- dask/distributed #1705
- joblib/joblib #613
感谢 Tom Augspurger、Jim Crist 和 Olivier 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=[])}
(状态信息远多于上面列出的,但希望上面的示例是清楚的。)
这样做的原因有几点
- 我们想尝试 Cython 和 PyPy,对于它们来说,这样的对象可能比字典更有效。
- 我们认为这对于调度器新手开发者来说可能更容易理解。状态字典的泛滥不易被发现。
第一个目标最终并未实现。使用这种新布局,我们尚未能在 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 提供支持