这项工作得到 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 遇到来自更多领域的更复杂的问题,我们不断遇到当前启发式算法表现不佳的问题。本次发布重写了我们的静态任务优先级启发式算法。这将提高 Dask 遍历复杂计算的能力,同时保持内存使用量较低。
为了辅助调试,我们还将这些启发式算法集成到 visualize 方法生成的 GraphViz 风格图中。
x = da.random.random(...)
...
x.visualize(color='order', cmap='RdBu')
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 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 下显著提速。这些更改甚至导致内存略微增加。但是,我们对代码可读性的结果感到满意,并希望其他人也认为这很有用。
感谢 Antoine Pitrou,他在这里完成了大部分工作。
您现在可以提交具有不同优先级的任务。
x = client.submit(f, 1, priority=10) # 优先级越高越优先执行
y = client.submit(f, 1, priority=-10) # 优先级越低越后执行
需要说明的是,Dask 一直都有优先级,只是不容易由用户设置。优先级高的任务会优先执行。所有任务的默认优先级为零。您也可以为集合(如数组和数据帧)设置优先级
df = df.persist(priority=5) # 为此计算设置更高的优先级。
几个相关项目也正在发布新版本
以下是在 11 月 14 日发布 0.16.0 版本以来为 dask/dask 仓库做出贡献的人员
以下是在 11 月 14 日发布 1.20.0 版本以来为 dask/distributed 仓库做出贡献的人员