Naiad论文《Naiad: A Timely Dataflow System》

前面通过文章《论文图谱当如是:Awesome-Graphs用200篇图系统论文打个样》向大家介绍了论文图谱项目Awesome-Graphs,并分享了Google的Pregel、OSDI'12的PowerGraph、SOSP'13的X-Stream。这次向大家分享Microsoft发表在SOSP'13的另一篇关于流处理系统论文Naiad,TimelyDataflow是它的开源实现。该论文促进了后续的流图系统的设计与创新,从其调度框架设计中也可以看到TuGraph Analytics调度器的影子。

对图计算技术感兴趣的同学可以多做了解,也非常欢迎大家关注和参与论文图谱的开源项目:

提前感谢给项目点Star的小伙伴,接下来我们直接进入正文!

摘要

Naiad是一个可执行有环数据流的分布式数据并行系统,提供了高吞吐的批处理、低延迟的流处理,以及迭代和增量计算的能力。

1. 介绍

支持特性:

  • 循环结构化,支持反向边(feedback)。
  • 有状态的数据流节点,支持无需全局协调的生产消费能力。
  • 节点收齐特定轮次/迭代的输入后的通知机制。

2. 及时数据流

数据流图可以包含嵌套的循环结构,时间戳用于区分数据是由哪个轮次/迭代产生的。

2.1 图结构

及时数据流图包含输入/输出节点,输入节点从外部的生产者接受消息序列,输出节点将消息序列发送到外部消费者。

外部的生产者为每个消息打标了一个轮次(epoch),当没有消息需要输入时,会主动通知输入节点。

生产者也可以关闭输入节点,表示输入节点将不会再收到任何消息。

输出节点的消息也会打标这个轮次,同样当没有消息需要输出时,也会通知外部消费者。

及时数据流图里可以包含嵌套的循环上下文(loop contexts):

  • 入口点(ingress vertex):数据流图的边进入循环上下文必须经过入口点,如I。
  • 出口点(egress vertex):数据流图的边离开循环上下文必须经过出口点,如E。
  • 反馈点(feedback vertex):循环上下文内必须包含反馈点,如F。



针对上图所表达的计算语义解释:

关键概念:逻辑时间戳(logical timestamp):

  • e:消息的轮次。
  • k:循环嵌套的深度。
  • c:向量,每层循环的迭代次数。



逻辑时间戳变化规则:

  • 经过入口点:c增加一个维度,初始化为0,表示循环开始。
  • 经过反馈点:c的最后一个维度+1,表示循环次数累计。
  • 经过出口点:c的最后一个维度提出,恢复成与入口点一致。

逻辑时间戳大小比较,t1=(e1, <c1, ..., cm>),t2=(e2, <c1, ..., cn>):

  • 条件1:整数比较,e1 < e2。
  • 条件2:字符串比较,c1 + ... + cm < c1 + ... + cn。

2.2 节点计算

数据流的节点可以接收、发送带逻辑时间戳的消息(message),以及通知(notification)。

每个节点v实现两个回调函数:

  1. v.OnRecieve(Edge e, Message m, Timestamp t):接收消息。
  2. v.OnNotify(Timestamp t):接收通知。

并可以调用系统提供的两个函数:

  1. this.SendBy(Edge e, Message m, Timestamp t):发送消息。
  2. this.NotifyAt(Timestamp t):发送通知。

对于数据流边e=(u, v),u.SendBy将触发v.OnRecieve,u.NotifyAt将触发v.onNotify。

数据流系统保证v.OnNotify(t)一定发生在v.OnRecieve(e, m, t')之后,其中t' < t,即保证处理完所有t之前的消息后再处理通知,以让节点具备机会清理t之前的工作状态。

这种机制保证了消息处理不会发生时光回溯(backwards in time)。

如下示例代码描述了一个双出的数据流节点实现distinct、count算子的逻辑。

class DistinctCount<S,T> : Vertex<T>
{
Dictionary<T, Dictionary<S,int>> counts;
void OnRecv(Edge e, S msg, T time)
{
if (!counts.ContainsKey(time)) {
counts[time] = new Dictionary<S,int>();
this.NotifyAt(time);
}
if (!counts[time].ContainsKey(msg)) {
counts[time][msg] = 0;
this.SendBy(output1, msg, time);
}
counts[time][msg]++;
}
void OnNotify(T time)
{
foreach (var pair in counts[time])
this.SendBy(output2, pair, time);
counts.Remove(time);
}
}

2.3 实现及时数据流

数据流处理受限于未处理的事件(events:消息、通知)和数据流图的结构。

关键概念:pointstamp:

  • u.SendBy(e, m, t):生成pointstamp (t, e)。
  • u.NotifyAt(t):生成pointstamp (t, v)。

单线程调度器实现:

  • 维护一个激活pointstamp(active pointstamp) 集合,集合大小至少为1。对于每个pointstamp,有两个计数器:

    • OC(occurrence count):未完成的pointstamp数。
    • PC(precursor count):上游激活的pointstamp数。
  • 系统初始化时,为输入节点生成第一个pointstamp,其中t=e,OC=1,PC=0。当e完成后,继续生成t=e+1的pointstamp。
  • 当激活pointstamp p时,初始化PC为上游所有激活的pointstamp数,并递增下游节点所有pointstamp的PC值。
  • 当OC[p]=0时,从active集合删除p,并递减下游节点所有pointstamp的PC值。
  • 当PC[p]=0时,表示上游没有激活的pointstamp影响到p,则称p是frontier,调度器会把所有通知发送给frontier。

OC的计算规则为:

3. 分布式实现

  • Naiad集群包含多个进程,每个进程包含多个worker,worker管理数据流节点的一个分区。
  • worker之间通过本地的共享内存或者远程TCP连接交换消息。
  • 进程遵循分布式进度追踪协议(Progress Tracking Protocol),用于协调通知的分发。

3.1 数据并行

  • 逻辑数据流图:stages+connectors。
  • connectors包含一个分区函数。
  • 运行时逻辑数据流图被展开为物理数据流图,stage被替换为一组节点,connectors被替换为一组边。

3.2 Workers

  • 分发消息优先于分发通知。
  • 分发策略多样,如基于最早的pointstamp分发降低端到端延迟。
  • worker使用共享队列进行通信。
  • 如果分发的目标节点在同一个worker,那么SendBy会直接调用目标节点的OnRecieve。
  • 如果存在环则需要强制进入队列,或者控制递归深度避免系统过载。

3.3 分布式进度追踪

  • 每个worker维护各自的状态,通过广播OC进行状态共享。
  • 优化手段:
    • 使用映射的pointstamp实现进度跟踪,以降低并发冲突和更新规模。
    • 更新广播前先进行本地聚合。

3.4 错误容忍和可用性

  • Checkpoint和Restore接口。

3.5 预防抖动

  • 网络。
  • 数据结构竞争。
  • 垃圾回收。

4. 使用Naiad写程序

5. 性能评估

6. 现实应用

  • 批量迭代图计算
  • 批量迭代机器学习
  • 流式无环计算
  • 流式迭代图分析

7. 总结

Naiad通过允许程序按需协调,支持了混合的同步+异步计算。

我用Awesome-Graphs看论文:解读Naiad的更多相关文章

  1. 论文解读《The Emerging Field of Signal Processing on Graphs》

    感悟 看完图卷积一代.二代,深感图卷积的强大,刚开始接触图卷积的时候完全不懂为什么要使用拉普拉斯矩阵( $L=D-W$),主要是其背后的物理意义.通过借鉴前辈们的论文.博客.评论逐渐对图卷积有了一定的 ...

  2. 论文解读(MGAE)《MGAE: Masked Autoencoders for Self-Supervised Learning on Graphs》

    论文信息 论文标题:MGAE: Masked Autoencoders for Self-Supervised Learning on Graphs论文作者:Qiaoyu Tan, Ninghao L ...

  3. 论文解读(ValidUtil)《Rethinking the Setting of Semi-supervised Learning on Graphs》

    论文信息 论文标题:Rethinking the Setting of Semi-supervised Learning on Graphs论文作者:Ziang Li, Ming Ding, Weik ...

  4. zz扔掉anchor!真正的CenterNet——Objects as Points论文解读

    首发于深度学习那些事 已关注写文章   扔掉anchor!真正的CenterNet——Objects as Points论文解读 OLDPAN 不明觉厉的人工智障程序员 ​关注他 JustDoIT 等 ...

  5. [论文解读] 阿里DIEN整体代码结构

    [论文解读] 阿里DIEN整体代码结构 目录 [论文解读] 阿里DIEN整体代码结构 0x00 摘要 0x01 文件简介 0x02 总体架构 0x03 总体代码 0x04 模型基类 4.1 基本逻辑 ...

  6. 《Stereo R-CNN based 3D Object Detection for Autonomous Driving》论文解读

    论文链接:https://arxiv.org/pdf/1902.09738v2.pdf 这两个月忙着做实验 博客都有些荒废了,写篇用于3D检测的论文解读吧,有理解错误的地方,烦请有心人指正). 博客原 ...

  7. 注意力论文解读(1) | Non-local Neural Network | CVPR2018 | 已复现

    文章转自微信公众号:[机器学习炼丹术] 参考目录: 目录 0 概述 1 主要内容 1.1 Non local的优势 1.2 pytorch复现 1.3 代码解读 1.4 论文解读 2 总结 论文名称: ...

  8. 论文解读丨基于局部特征保留的图卷积神经网络架构(LPD-GCN)

    摘要:本文提出一种基于局部特征保留的图卷积网络架构,与最新的对比算法相比,该方法在多个数据集上的图分类性能得到大幅度提升,泛化性能也得到了改善. 本文分享自华为云社区<论文解读:基于局部特征保留 ...

  9. CVPR2020 论文解读:少点目标检测

    CVPR2020 论文解读:具有注意RPN和多关系检测器的少点目标检测 Few-Shot Object Detection with Attention-RPN and Multi-Relation ...

  10. 图像分类:CVPR2020论文解读

    图像分类:CVPR2020论文解读 Towards Robust Image Classification Using Sequential Attention Models 论文链接:https:// ...

随机推荐

  1. block专递参数导致野指针引发crash

    一.问题引入 近日开发中引入一个随机crash,Crash堆栈如下: Exception Type: SIGSEGV Exception Codes: SEGV_ACCERR at 0x0000000 ...

  2. svg动画导致持续占用CPU

    1.在一次性能优化中突然发现一个svg矢量图动画导致CPU持续占用的问题,该svg在web中使用, 即使webview释放之后,CPU依然占用达到10%,6s+上测试结果 svg如下所示: <s ...

  3. c# webApi返回Excel数据流 || 使用Excel数据流的方式下载Excel

    背景: 在前端无法生成特殊的excel表格,或操作复杂的时候会通过后台进行生成excel.但是服务器的资源也非常宝贵,所以通过数据流的方式就可以实现:不在服务器存储的情况下,使前端成功下载excel文 ...

  4. CF1184E1题解

    CF11841E1 & blog 尽然想让第一条边最大且这条边在最小生成树中,那么这条边就需要尽量晚. 但是假如加上一条边 \(i\) 可以使 \(u_1\) 和 \(v_1\) 联通并且第 ...

  5. 🌟 简单理解 React 的 createContext 和 Provider 🚀

    在 React 应用中,我们经常需要在组件之间共享状态和数据.而 React 的 createContext 和 Provider 就是为了解决这个问题而诞生的. createContext:创建自定 ...

  6. window10 java环境变量配置

    window10 此电脑 右击属性 相关设置 高级系统配置 点击右下的 环境变量 在系统变量中新增JAVA_HOME=D:\Program Files\Java\jdk1.8.0_25 在系统变量中修 ...

  7. yum update和yum upgrade的区别

    看见网上很多关于这个问题的解答,但是大部分都是错的,误人子弟! 很多都是执行这两个命令,然后查看系统的变化.看似严谨,实则愚蠢至极. 就算不懂内核,也应该懂得什么是内核呀!也应该懂得内核是怎么进入的啊 ...

  8. 异构智联Wi-Fi6+蓝牙模组,重新定义多屏互联体验!

    下班回家打开门,电灯.电视.空调.音响.电动窗帘.扫地机器人--一呼百应,有序开工,原本冰冷的房子立刻变成了温暖港湾.可以说,舒适便捷的智能设备已经完全融入了我们的生活中. 从单一场景.单一设备,到现 ...

  9. .NET Core MVC基础之页面传值方式📃

    .NET Core MVC基础之页面传值方式 前言 最近工作太忙了,浅浅更新一下.NET基础知识.大部分面试官都会问.NET页面传值的几种方式,那么接下来就来细讲与实现一下吧! 页面传值分成两类 第一 ...

  10. paraview安装

    apt 安装 sudo apt install paraview 安装包安装 参考 https://blog.csdn.net/weixin_47492286/article/details/1272 ...