提交新活动

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

提交新闻报道

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

订阅时事通讯

谢谢!您的提交已收到!
哎呀!提交表单时出错。
2018年6月14日

Dask 0.18.0 版本发布

作者

这项工作由 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 有时需要用户配置,特别是在分布式环境中。这可能是为了控制日志详细程度、指定集群配置、提供安全凭据,或在生产环境中出现的其他几个选项中的任何一个。

我们发现不同的计算文化喜欢通过几种不同的方式指定配置

  1. 配置文件
  2. 环境变量
  3. 直接在 Python 代码中

以前,这在不同的 dask 子项目中通过各种不同的解决方案来处理。dask-distributed 项目有一种系统,dask-kubernetes 有另一种,等等。

现在我们将配置集中在 dask.config 模块中,该模块从配置文件、环境变量和运行时代码收集配置,并将其集中提供给所有 Dask 子项目。许多 Dask 子项目 (dask.distributed, dask-kubernetes, 和 dask-jobqueue) 正同时发布,以利用此特性。

如果您之前积极使用 Dask.distributed 的配置文件,一些事情已经改变了

  1. 配置现在有了命名空间,并且嵌套更深。这里是今天 dask.distributed 默认配置文件中的一个例子
  2. distributed
    version: 2
    scheduler
    allowed-failures: 3 # 任务被视为不良之前重试的次数
    work-stealing: True # workers 应该相互窃取任务
    worker-ttl: null # 例如 '60s'。Workers 的心跳必须快于此值

    worker
    multiprocessing-method: forkserver
    use-file-locking: True
  3. 默认配置位置已从 ~/.dask/config.yaml 移至 ~/.config/dask/distributed.yaml,它将与其他几个文件(如 kubernetes.yaml、jobqueue.yaml 等)一起位于此处。

但是,您的旧配置文件仍然会被找到,并且其值会得到适当的使用。不过,我们不会尝试将您的旧配置值迁移到新位置。如果您想特别干净,可能希望在某个时候删除自动生成的 ~/.dask/config.yaml 文件。

您可以在 Dask 的配置文档中了解有关 Dask 配置的更多信息。

将常用的 get= 关键字替换为 scheduler=

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

与配置更改相关,我们现在将运行时状态包含在配置中。以前人们使用 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.array.learn 子包

此包未被宣传,使用极少。所有功能(及更多)现在都可在Dask-ML 中获得。

其他

  • 我们已从 map_blocks 中移除 token= 关键字,并将功能移至 name= 关键字。
  • 当您关闭上下文管理器时,dask.distributed.worker_client 会自动重新加入线程池。
  • Dask.distributed 协议现在将 msgpack 数组解释为元组而不是列表。

有趣的新功能

数组

广义通用函数 (Generalized Universal Functions)

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) 完成。

rechunking 的新值 “auto”

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 分解在两个方面变得更好

  1. 它们支持短胖数组(short-and-fat arrays)
  2. 高瘦数组(tall-and-skinny)变体现在在更少内存中更稳定地运行。这里有一个友好的执行 GIF

这项工作非常值得赞赏,并由Jeremy Chan 完成。

得益于Martin DurantJohn A Kirkham,对分块 N 维数组的 Zarr 格式 的原生支持已落地。Zarr 因其速度、简单的规范、支持完整的 NetCDF 风格约定以及对云存储的适应性而特别有用。

Dataframes 和 Pandas 0.23

像往常一样,Dask Dataframes 有许多小改进。值得注意的是持续兼容刚发布的 Pandas 0.23,以及一些新的数据摄取格式。

得益于Tom Augspurger,Dask.dataframe 与近期 Pandas 0.23 版本中的更改保持一致。

Orc 支持

Dask.dataframe 新增了对 Apache ORC 格式的读取器。

Orc 是一种用于表格数据存储的格式,在 Hadoop 生态系统中很常见。新的 dd.read_orc 函数围绕 PyArrow 中类似的新 ORC 功能进行并行化。感谢 Jim Crist 在 Arrow 方面的工作,以及 Martin Durant 使用 Dask 进行并行化。

Read_json 支持

Dask.dataframe 现在也新增了对 JSON 文件的读取器。

dd.read_json 函数匹配了 pandas.read_json API 的大部分功能。

这是在最近一个比较 Spark 和 Dask Dataframe 的PyCon 2018 演讲之后不久实现的,当时 Irina Truong 提到了此功能缺失。感谢 Martin DurantIrina Truong 的贡献。

有关 JSON、ORC 或 Dask.dataframe 支持的任何其他格式的更多信息,请参阅dataframe 数据摄取文档

Joblib

用于 Scikit-Learn 中并行计算的 Joblib 库已拥有一个 Dask 后端一段时间了。虽然它一直都相当易于使用,但现在即使没有太多专业知识也能更好地使用它变得更加容易。在与 Scikit-Learn 开发者一起实践使用一段时间后,我们发现并解决了许多可用性问题。这些更改只有在下一个 Scikit-Learn 版本发布后(希望很快)才能完全可用,届时我们可能会发布一篇专门讨论该主题的新博文。

相关项目

本次发布与以下软件包同时进行

  1. dask
  2. distributed
  3. dask-kubernetes

还有一个新的仓库用于在 YARN(Hadoop 环境中常见的作业调度器)上部署应用程序,名为skein。欢迎早期采用者。

致谢

自3月21日起,以下人员为以下仓库做出了贡献

用于并行算法的核心 Dask 仓库

  • Andrethrill
  • Beomi
  • Brendan Martin
  • Christopher Ren
  • Guido Imperiale
  • Diane Trout
  • fjetter
  • Frederick
  • Henry Doupe
  • James Bourbeau
  • Jeremy Chen
  • Jim Crist
  • John A Kirkham
  • Jon Mease
  • Jörg Dietrich
  • Kevin Mader
  • Ksenia Bobrova
  • Larsr
  • Marc Pfister
  • Markus Gonser
  • Martin Durant
  • Matt Lee
  • Matthew Rocklin
  • Pierre-Bartet
  • Scott Sievert
  • Simon Perkins
  • Stefan van der Walt
  • Stephan Hoyer
  • Tom Augspurger
  • Uwe L. Korn
  • 于枫

用于分布式计算的 dask/distributed 仓库

  • Bmaisonn
  • Grant Jenks
  • Henry Doupe
  • Irene Rodriguez
  • Irina Truong
  • John A Kirkham
  • Joseph Atkins-Turkish
  • Kenneth Koski
  • Loïc Estève
  • Marius van Niekerk
  • Martin Durant
  • Matthew Rocklin
  • Olivier Grisel
  • Russ Bubley
  • Tom Augspurger
  • Tony Lorenzo

用于在 Kubernetes 上部署 Dask 的 dask-kubernetes 仓库

  • Brendan Martin
  • J Gerard
  • Matthew Rocklin
  • Olivier Grisel
  • Yuvi Panda

用于在 HPC 作业调度器上部署 Dask 的 dask-jobqueue 仓库

  • Guillaume Eynard-Bontemps
  • jgerardsimcock
  • Joseph Hamman
  • Loïc Estève
  • Matthew Rocklin
  • Ray Bell
  • Rich Signell
  • Shawn Taylor
  • Spencer Clark

用于可扩展机器学习的 dask-ml 仓库

  • Christopher Ren
  • Jeremy Chen
  • Matthew Rocklin
  • Scott Sievert
  • Tom Augspurger

致谢

感谢 Scott Sievert 和 James Bourbeau 帮助编辑本文。