提交新活动

谢谢!您的提交已收到!
糟糕!提交表单时出错了。

提交新闻报道

谢谢!您的提交已收到!
糟糕!提交表单时出错了。

订阅新闻邮件

谢谢!您的提交已收到!
糟糕!提交表单时出错了。
2018年8月2日

Dask 开发日志

作者

本项工作由 Anaconda Inc 支持

为了增加透明度,我尝试更频繁地撰写博客,介绍 Dask 及相关项目的当前工作进展。这里没有任何东西已准备好投入生产。这篇博客文章是仓促写成的,所以请不要期待精细的润色。

在过去的两周里,我们在以下领域开展了活动

  1. 一种用于状态处理的实验性 Actor 解决方案
  2. 包含超参数选择和参数服务器的机器学习实验。
  3. 开发更多预处理转换器
  4. 分布式调度器内部事件循环线程的统计性能分析及内部优化
  5. dask-yarn 的新版本发布
  6. dask-stories 上关于移动网络建模的新叙述
  7. dask-jobqueue 中对 LSF 集群的支持
  8. 测试套件清理,解决间歇性故障

使用 Actors 进行状态处理

一些高级工作负载希望直接管理和修改 worker 上的状态。像 Dask 这样的基于任务的框架可以通过使用长时间运行的任务来强行处理这类工作负载,但这是一种不舒服的体验。为了解决这个问题,我们一直在 Dask 的标准任务调度系统旁边添加一个实验性的 Actors 框架。这提供了更低的延迟,消除了调度开销,并提供了直接修改 worker 上状态的能力,但牺牲了弹性和诊断等便利性。

采用 Actors 的想法是厚颜无耻地从 Ray 项目 借鉴来的 :)

Actors 的工作正在 dask/distributed #2133 中进行。

class Counter
def __init__(self)
self.n = 0

def increment(self)
self.n += 1
return self.n

counter = client.submit(Counter, actor=True).result()

>>> future = counter.increment()
>>> future.result()
1

机器学习实验

对增量训练模型进行超参数优化

许多 Scikit-Learn 风格的估计器具有 partial_fit 方法,可以在数据批次上进行增量训练。这特别适合于像 Dask 数组或 Dask 数据框这样的系统,它们是由许多批次的 Numpy 数组或 Pandas 数据框构建的。这是一个很好的契合点,因为所有的计算算法工作已经在 Scikit-Learn 中完成,Dask 只需在数据之间行政性地移动模型并调用 scikit-learn(或其他遵循 fit/transform/predict/score API 的机器学习模型)。这种方法为并行计算和机器学习开发者之间提供了一个很好的社区接口。

然而,这种训练本质上是顺序的,因为模型每次只在一个数据批次上训练。我们浪费了大量的处理能力。

为了解决这个问题,我们可以将增量训练与超参数选择结合起来,同时在同一数据上训练多个模型。这无论如何都是经常需要的,并且能让我们更有效地利用计算资源。

然而,使用超参数选择进行增量训练的方法有很多种,而正确的算法很可能取决于具体问题。这是一个活跃的研究领域,因此像 Dask 这样的通用项目很难选择并实现一个对所有人都适用的单一方法。可能需要几种方法,并且每种方法都有各种选项。

为了帮助这里的实验,我们一直在尝试一些底层工具,我们认为这些工具在各种情况下都会有所帮助。这接受用户提供的策略作为 Python 函数,该函数从最近的评估中获取分数,并询问在再次检查之前,每组超参数需要进一步进行多少进展。这使我们能够轻松地模拟一些常见情况,例如带有早期停止条件的随机搜索、逐次减半以及它们的变体,而无需编写任何 Dask 代码。

这项工作由 Scott Sievert 和我完成

Successive halving and random search

参数服务器

为了提高大型模型的训练速度,Scott Sievert 一直在使用 Actors(如上所述)来开发参数服务器的简单示例。这些示例有助于发现并推动 Dask 本身内部的性能和诊断改进。

这些参数服务器管理不同 worker 生成的模型之间的通信,并将计算留给底层深度学习库。这项工作正在进行中。

数据框预处理转换器

我们已经开始围绕案例研究来调整一些 Dask-ML 的工作。我们的第一个案例由 Scott Sievert 撰写,使用了用于广告的 Criteo 数据集。这是一个很好的结合了密集/稀疏数据的例子,数据集可能相当大(约 1TB)。我们遇到的第一个挑战是预处理。这些挑战带来了一些预处理方面的改进

其中一些改进也基于 Scikit-Learn 即将发布的 0.20 版本中改进的数据框处理功能。

这项工作由Roman Yurchak,James Bourbeau,Daniel Severo, 和Tom Augspurger 完成。

主线程性能分析

对并发代码进行性能分析很困难。像 CProfile 这样的传统分析器在控制权在所有不同协程之间传递时会变得混乱。这意味着我们还没有对分布式调度器和 worker 进行非常全面的性能分析和调优。另一方面,统计分析器往往做得更好一些。我们已经将通常用于 Dask worker 线程的统计分析器(在仪表盘的“Profile”选项卡中可用)应用于运行 Tornado 事件循环的中央管理线程。这突出了一些我们以前未能发现的问题,并有望在未来的版本中减少开销。

Profile of event loop thread

Dask-Yarn 新版本发布

Dask-Yarn 及其用于管理 Yarn 作业的底层库 Skein 有新版本发布。这些版本包含了一些 bug 修复以及对 YARN 应用改进的并发原语。新功能 此处 有文档说明,并在 jcrist/skein #40 中实现。

这项工作由 Jim Crist 完成

Dask-Jobqueue 中对 LSF 集群的支持

Dask-jobqueue 支持在传统的 HPC 集群管理器(如 SGE, SLURM, PBS 等)上使用 Dask。我们最近添加了对 LSF 集群的支持

工作由 Ray Belldask/dask-jobqueue #78 中完成。

Dask Stories 关于移动网络的新文章

Dask Stories 仓库收集了关于人们如何使用 Dask 的叙述。Sameer Lalwani 最近添加了一篇关于使用 Dask 建模移动通信网络 的文章。值得一读。

测试套件清理

dask.distributed 的测试套件最近遭受间歇性故障困扰。这些测试失败频率很低,所以在编写时很难发现,但在未来的不相关 PR 在持续集成上运行测试套件时就会出现失败。它们给开发过程增加了阻力,但跟踪起来成本很高(测试分布式系统很困难)。

本周我们将花一些时间来追踪这些问题。进展在此