这项工作由 Anaconda Inc. 提供支持。
我很高兴宣布 Dask 0.18.0 版本发布。这是一个包含重大更改和新功能的主要版本。上一个版本 0.17.5 发布于5月4日。这篇博文概述了自3月21日发布 0.17.2 版本的博文以来值得关注的变化。
您可以通过 conda 安装 Dask
conda install dask
或者从 PyPI 通过 pip 安装
pip install dask[complete] --upgrade
完整的变更日志可在此处获取
我们下面列出了一些破坏性更改,随后是重要性较低但仍然有趣的变化。
Dask 核心库即将发布 1.0 版本。在此之前,我们需要进行一些清理工作。本次发布开始了这一过程,替换了一些现有接口,并构建了一些所需的基础设施。本次发布几乎所有的更改都包含清晰的弃用警告,但未来的版本将移除旧功能,因此现在是检查的好时机。
正如任何开始引入破坏性更改的版本一样,许多其他较小的破坏也会随之而来。我个人对这次发布感到非常高兴,因为使用 Dask 的许多方面现在感觉更加清晰了,但 Dask 的重度用户可能会遇到一些轻微的摩擦。希望这篇博文能帮助解释一些较大的变化。
充分利用 Dask 有时需要用户配置,特别是在分布式环境中。这可能是为了控制日志详细程度、指定集群配置、提供安全凭据,或在生产环境中出现的其他几个选项中的任何一个。
我们发现不同的计算文化喜欢通过几种不同的方式指定配置
以前,这在不同的 dask 子项目中通过各种不同的解决方案来处理。dask-distributed 项目有一种系统,dask-kubernetes 有另一种,等等。
现在我们将配置集中在 dask.config 模块中,该模块从配置文件、环境变量和运行时代码收集配置,并将其集中提供给所有 Dask 子项目。许多 Dask 子项目 (dask.distributed, dask-kubernetes, 和 dask-jobqueue) 正同时发布,以利用此特性。
如果您之前积极使用 Dask.distributed 的配置文件,一些事情已经改变了
但是,您的旧配置文件仍然会被找到,并且其值会得到适当的使用。不过,我们不会尝试将您的旧配置值迁移到新位置。如果您想特别干净,可能希望在某个时候删除自动生成的 ~/.dask/config.yaml 文件。
您可以在 Dask 的配置文档中了解有关 Dask 配置的更多信息。
Dask 可以使用基于线程、进程、单线程执行或分布式集群的多种调度器后端来执行代码。
以前,用户使用通用名称 get= 关键字在这些后端之间进行选择
x.compute(get=dask.threaded.get)
x.compute(get=dask.multiprocessing.get)
x.compute(get=dask.local.get_sync)
我们用一个更新、希望更清晰的 scheduler= 关键字替换了它
x.compute(scheduler='threads')
x.compute(scheduler='processes')
x.compute(scheduler='single-threaded')
get= 关键字已被弃用,并将引发警告。它将在下一个主要版本中完全移除。
更多信息,请参阅有关选择不同调度器的文档。
与配置更改相关,我们现在将运行时状态包含在配置中。以前人们使用 dask.set_options 上下文管理器来设置运行时状态。现在我们推荐使用 dask.config.set
with dask.set_options(scheduler='threads'): # 之前
...
with dask.config.set(scheduler='threads'): # 之后
...
dask.set_options 函数现在是 dask.config.set 的别名。
此包未被宣传,使用极少。所有功能(及更多)现在都可在Dask-ML 中获得。
Dask.array 现在透明地支持 Numpy 风格的广义通用函数 (gufuncs)。这意味着您可以将普通 Numpy GUFuncs(例如下面示例中的 eig)直接应用于 Dask 数组
import dask.array as da
import numpy as np
# 将 Numpy GUFunc(eig)直接应用于 Dask 数组
x = da.random.normal(size=(10, 10, 10), chunks=(2, 10, 10))
w, v = np.linalg._umath_linalg.eig(x, output_dtypes=(float, float))
# w 和 v 是沿后两个轴应用 eig 的 dask 数组
Numpy 有许多内部函数的 gufuncs,但它们尚未决定将这些函数切换到公共 API。此外,我们可以与其他项目(如 Numba)一起定义 GUFuncs
import numba
@numba.vectorize([float64(float64, float64)])
def f(x, y)
return x + y
z = f(x, y) # 如果 x 和 y 是 dask 数组,那么 z 也会是
我喜欢这一点是因为 Dask 和 Numba 的开发者在此功能上完全没有协调,只是它们都支持 Numpy GUFunc 协议,所以您可以免费获得这样的交互。
更多信息请参阅Dask 的 GUFunc 文档。这项工作由Markus Gonser (@magonser) 完成。
Dask 数组现在接受一个值“auto”,该值可以在以前接受 chunk 值的地方使用。这会指示 Dask 重新分块这些维度,以达到良好的默认 chunk 大小。
x = x.rechunk({
0: x.shape[0], # 此维度上的单个 chunk
# 1: 100e6 / x.dtype.itemsize / x.shape[0], # 之前需要手动计算
1: 'auto' # 现在我们允许此维度响应以获取理想的 chunk 大小
})
# 或者
x = da.from_array(img, chunks='auto')
这也检查 array.chunk-size 配置值以获取最佳 chunk 大小
>>> dask.config.get('array.chunk-size')
'128MiB'
需要明确的是,这并不支持“自动分块”,这通常是一个非常困难的问题。用户仍然需要了解他们的计算以及他们想要如何分块,这只是让做出良好决策稍微容易一些。
得益于Simon Perkins,Dask.array 获得了完整的 einsum 实现。
此外,Dask.array 的 QR 分解在两个方面变得更好
这项工作非常值得赞赏,并由Jeremy Chan 完成。
得益于Martin Durant 和 John A Kirkham,对分块 N 维数组的 Zarr 格式 的原生支持已落地。Zarr 因其速度、简单的规范、支持完整的 NetCDF 风格约定以及对云存储的适应性而特别有用。
像往常一样,Dask Dataframes 有许多小改进。值得注意的是持续兼容刚发布的 Pandas 0.23,以及一些新的数据摄取格式。
得益于Tom Augspurger,Dask.dataframe 与近期 Pandas 0.23 版本中的更改保持一致。
Dask.dataframe 新增了对 Apache ORC 格式的读取器。
Orc 是一种用于表格数据存储的格式,在 Hadoop 生态系统中很常见。新的 dd.read_orc 函数围绕 PyArrow 中类似的新 ORC 功能进行并行化。感谢 Jim Crist 在 Arrow 方面的工作,以及 Martin Durant 使用 Dask 进行并行化。
Dask.dataframe 现在也新增了对 JSON 文件的读取器。
dd.read_json 函数匹配了 pandas.read_json API 的大部分功能。
这是在最近一个比较 Spark 和 Dask Dataframe 的PyCon 2018 演讲之后不久实现的,当时 Irina Truong 提到了此功能缺失。感谢 Martin Durant 和 Irina Truong 的贡献。
有关 JSON、ORC 或 Dask.dataframe 支持的任何其他格式的更多信息,请参阅dataframe 数据摄取文档。
用于 Scikit-Learn 中并行计算的 Joblib 库已拥有一个 Dask 后端一段时间了。虽然它一直都相当易于使用,但现在即使没有太多专业知识也能更好地使用它变得更加容易。在与 Scikit-Learn 开发者一起实践使用一段时间后,我们发现并解决了许多可用性问题。这些更改只有在下一个 Scikit-Learn 版本发布后(希望很快)才能完全可用,届时我们可能会发布一篇专门讨论该主题的新博文。
本次发布与以下软件包同时进行
还有一个新的仓库用于在 YARN(Hadoop 环境中常见的作业调度器)上部署应用程序,名为skein。欢迎早期采用者。
自3月21日起,以下人员为以下仓库做出了贡献
用于并行算法的核心 Dask 仓库
用于分布式计算的 dask/distributed 仓库
用于在 Kubernetes 上部署 Dask 的 dask-kubernetes 仓库
用于在 HPC 作业调度器上部署 Dask 的 dask-jobqueue 仓库
用于可扩展机器学习的 dask-ml 仓库
感谢 Scott Sievert 和 James Bourbeau 帮助编辑本文。