Dask 的现状
这项工作由 Continuum Analytics 和 XDATA 项目 支持,是 Blaze 项目 的一部分
太长不看 我们将介绍并行计算系统 Dask 的各个组成部分。
引言
Dask 五个月前开始作为一个并行的磁盘数组项目;自那时起,它已得到了扩展。我非常享受撰写有关其发展的文章。随着最近 0.5.0 版本的发布,我决定花点时间概述一下 dask 的各个组成部分、它们的状态以及当前的开发情况。
集合、图和调度器
Dask 模块可以分解如下:
左侧是数组(arrays)、袋(bags)和数据框(dataframes)等集合。它们分别复制了 NumPy、PyToolz 和 Pandas 的 API,面向数据科学用户,允许他们处理更大的数据集。对这些 dask 集合进行操作会生成任务图,这些任务图是计算所需结果的“食谱”,利用了许多各自都能装入内存的小计算。例如,如果我们想对一万亿个数字求和,我们可以将这些数字分解成百万个元素的块,对这些块求和,然后对这些和求和。一个先前不可能完成的任务变成了百万零一个简单的任务。
右侧是调度器(schedulers)。调度器在不同情况下执行任务图,通常是并行执行。值得注意的是,有一些针对单机环境的调度器,以及一个新的分布式调度器原型。
中间是有向无环图(directed acyclic graph)。这个图充当了集合和调度器之间的“胶水”。dask 图格式很简单,不包含任何 dask 类;它只是函数、字典和元组,因此易于构建,并且技术含量低到可以立即理解。这种分离在 dask 的开发过程中非常有用;一侧的改进会立即影响到另一侧,新开发者也出乎意料地少遇到麻烦。此外,来自不同背景的开发者大约在一小时内就能快速上手。
这种分离对其他项目也很有用。有向无环图如今在许多领域都很流行。通过公开 dask 的调度器,其他项目可以绕过 dask 集合,直接使用执行引擎。
一个 github issue 中的一段赞美之词:
到目前为止,dask 帮助很大,因为它让我可以跳过实现所有常见的图操作。特别是正确地进行异步执行,原本需要大量工作。
谁在使用 dask?
Dask 开发者与一些非常出色的用户密切合作:
-
Climate Corp 的 Stephan Hoyer 已将
dask.array
集成到xray
中,xray 是一个管理大量气象数据(和其他带标签数组)的库。 -
Scikit image 现在包含一个 apply_parallel 操作 (github PR),它使用 dask.array 来并行化图像处理例程。(由 Blake Griffith 完成的工作)
-
杜克大学的博士后 Mariano Tepper 在其关于矩阵分解的研究中使用了 dask。Mariano 也是
dask.array.linalg
模块的主要作者,该模块包含了针对“高瘦”矩阵的高效且稳定的 QR 和 SVD。请参阅 Mariano 在 arXiv 上的论文。 -
最后,我个人在日常工作中使用了 dask,尤其是在与 XData 项目 相关的工作中。这往往会推动一些新功能的开发。
其他一些团队也偶尔在 github 上出现;我很想了解更多关于人们如何使用 dask 的详细信息。
工作正常的部分和不正常的部分
Dask 是模块化的。每个集合和每个调度器实际上都是独立的项目。这些子项目处于不同的开发阶段。了解每个子项目的稳定性可以帮助您确定如何使用和依赖 dask。
Dask.array
和 dask.threaded
运行良好,稳定,并且持续有人使用。它们收到的错误报告相对较少,且能迅速得到处理。
Dask.bag
和 dask.multiprocessing
的 API 变动较大,但在有一些注意事项的情况下,基本已准备好供公众使用。dask.dataframe
和
dask.distributed
尚未准备好供公众使用;它们的 API 变动很大,并且存在已知错误。
当前工作
在我看来,当前的开发状态如下:
- Dask.bag 和 dask.dataframe 进展良好。我的个人工作依赖于这些模块,因此它们受到了很多关注。
- 目前,我专注于通过快速混洗(shuffles)实现分组和连接操作;我希望很快能撰写关于这个问题的文章。
- Pandas API 庞大且复杂。以分块方式重新实现其一部分虽然思路简单,但需要详细考虑并耗费时间。这会是社区贡献的好地方。
- Dask.distributed 是新的。它还需要更多的测试,但这是一个令人兴奋的进展。
- 对于部署,我们计划以 IPython parallel 为基础,它已经对许多并行作业系统有相当好的支持(参见 Blake 的 #208)。
- 近来,Dask.array 的开发重心放在推广上。我们已经找到了 dask 非常有用的应用领域;我们希望找到更多。
- 集合(Array、Bag、DataFrame)并不能涵盖所有情况。我想开始寻找独立使用任务调度器的方法。在复杂情况下,它们可以充当“减压阀”。
更多信息
您可以使用 conda
安装 dask:
conda install dask
或者使用 pip
:
pip install dask
or
pip install dask[array]
or
pip install dask[bag]
您可以在文档或 github 上阅读更多关于 dask 的信息。
博客评论由 Disqus 提供支持