Closed PeterSH6 closed 3 years ago
分布式快照算法使用场景:在缺乏全局时钟或者全局时钟不可靠的分布式系统中,确定一个全局的可恢复的有意义的状态。最经典的分布式快照算法是 #8 Chandy-Lambert算法,Flink是基于此算法的一个改进,两个算法都是异步的。
Target: Distributed Snapshot but low impact on performance; low space costs that contains only operator states in acyclic execution topologies.
整个算法分成两个部分,一个是acyclic,另一个是cyclic。对于acycilc部分,只需要保存每个节点的状态,不需要保存节点所发出的信息。对于cyclic,首先需要识别构成环的节点,就是说有back-edge的节点。识别出这个back-edge之后,需要back-edge所在节点中收到的信息。算法细节后面分析。
对于acyclic单向图的部分 这篇文章解释的很清楚,https://zhuanlan.zhihu.com/p/43536305
当Fail的时候:当需要任意节点挂掉,我们从最近的Complete Global Snapshot-n,来重启整个系统;即,健康的节点rollback自己的状态到“接收到barrier-n时候所取的状态快照。fail掉的节点的逻辑Processor Pi被jobManager之类的东西,用自己在的Pi-LocalSnapshot-n重启设置本地状态之后,才开始接收上游的消息。
Why Consistent: 可以看到当failover的时候,全部节点的状态都回退到了barrier-n之前的数据源message所导致的全网状态,就好像数据源在barrier-n之后根本没有发过消息一样。不断发出的barrier就好像逻辑时钟一样,然而“时间”流动到不同地方的速度不同,只有当一个时间“点”全部流动到了全网,且全网把这个时间“点”的状态全部取了快照(注意当网络很大,最后一个节点取完快照,初始节点可能已经前进到n+5,n+10了,但是由于最后一个节点才刚取完快照,CompleteGlobalSnapshot-n只到n,n是全局consistent的记录点) 这里应该用到了一个Chandy-Lambert算法中提到的概念,pre-barrier message和post-barrier message。Flink的算法保证所有pre-barrier message都被take in到了当前节点的状态中。对于深度学习训练任务来说,是不是可以理解为这些message(gradient)已经update到了当前的model state。
一些可能的优化:在原来的恢复过程中,所有健康的节点似乎都要rollback。但如果一些健康的节点的路径和fail节点的路径完全独立呢?可以不进行rollback。但是似乎仍然要等待?所以不rollback可能也不一定会有什么效果。
感觉训练任务的拓扑结构主要是无环图。所以有环图的部分简略总结。
最后梳理一下本文用到的Theory Part
Further Reading:
PDF: https://arxiv.org/abs/1506.08603 不鸽了 开始把暑假读的论文都总结一遍 以后读完一篇要马上总结,不然要点都忘了