写在开头:一方面研究在车联网中如何高效调度基于DAG的计算密集型(数据密集型)业务是我phd阶段的major,另一方面之前看完paper无论是做成ppt还是word文档在后续整理归纳的时候还是难以查阅,相反upload到网上以专题方式呈现就清晰明了许多,并且作为一个1年级的phd菜鸟,这样子的记录方式在帮我重新梳理逻辑的同时也可以记录自己不断成长的样子,也是一件很开心的事情,当然!如果茫茫人海中的你恰好也在research这个方向,恰好看到了我这篇文章,又恰好得到了一些帮助,那就更好了~————OK,废话不多说,开始今天的主题:
这篇文章在ieee上已经高达1909次引用,只要你是做DAG方向的文章,那你必然躲不掉这篇经典中的经典,在下面的梳理中我就按照文章的逻辑进行自认为重点的强调,具体细节你可以自行去ieee上download查阅(自我感觉这篇文章应该是要100%吃透的,于玩DAG的人来说)。
摘要中:核心提出要在异质(i.e.,计算能力不同)的服务器中调度DAG,现存的算法要么只考虑在同质服务器上调度缺少泛化性,要么就是虽然考虑了异质服务器但算法复杂度相当高,作者提出了2个调度算法分别名为HEFT和CPOP,对应着不同的DAG任务优先级排序方式和服务器选择方式(在算法那块再具体展开),仿真中分别考虑随机生成的DAG拓扑图和真实世界问题产生的DAG拓扑图,不得不说该篇文章的仿真阶段非常牛逼,可所谓叹为观止,15页的篇幅用了7页跑仿真,我真的是会谢,仿真也在后续细说。
引言中:略,没啥好强调的
相关工作:由于调度DAG任务是NP-complete问题(跟NP-hard应该差不多?,i.e.,无法在多项式时间polynomial time里获得optimal solution),作者将调度算法分为2个种类,基于启发式的调度算法;引导的基于随机的搜索算法,对于启发式算法又可以细分为3个类型:①列表调度启发式(LSH);②成簇启发式(CH);③任务重复启发式(TDH):
LSH:核心包括2个步骤,1是任务优先级排序:在每一个步骤选择优先级最高的任务来进行调度;2是服务器选择:面对选择出来的任务分配给一个“最好”(取决于你自己文章定义的效用函数)的服务器,作者提到这类算法普遍能提供不错的表现和较低的算法复杂度(所以其实作者的HEFT和CPOP也是属于LSH);
CH:核心在于将DAG图中的不同任务映射到不同的簇中,如果不同的任务被映射到一个簇中那么他们就会在一个服务器上执行,其中有一个点要关注,作者提到此类算法可以映射所有的任务到一个簇中,不用关注映射的任务的父类任务是否已经调度完成,所以这或许会产生与DAG拓扑结构不符合的解(i guess),细节包括3个小步骤,1.簇融合步骤,为了让簇的数量小于等于服务器的数量;2.簇映射步骤,为不同的簇选择不同的服务器;3.在每个簇中对任务进行排序(maybe 2 late);
TDH:核心在于redundantly schedule,即通过在同一个服务器上调度不同的任务减少服务期间的通信代价(这个思路运用在数据密集型业务上或许会有显著的效果,相反计算密集型业务可能更多是computing-resource-hungry),此类算法的区别在于如何选择重复计算的任务,however,这类算法的应用场景大多是无限个相同的服务器且拥有很高的计算复杂度;
那么相较于基于启发式的调度算法,另一个算法就是我们耳熟能详的引导的基于随机的搜索算法(有多少人第一篇paper的benchmark是random,233),这类算法区别于完全瞎jb找的随机搜索算法,而是在每步利用之前步骤的先验知识来优化随机空间,譬如很多大名鼎鼎的遗传式算法(genetic algorithm),这类算法能跑出不错的解,但因为需要不断地迭代因此在找解的过程中需要花费大量的时间,同时需要很多附加的控制参数。
在异质环境中启发式调度任务,这一块是和作者相似的场景,因此作者在这一块的关键是突出了这些算法相较于他没有考虑到的点:
DLS:同样也涉及给任务进行优先级定义,但不同在于优先级定义的式子不同,该算法对于计算代价取的是每个服务器上计算代价的中位数,并且没有考虑通信代价,复杂度高;
MH:这个算法和作者最大的差别在于没有考虑利用两个已经被调度的任务间的空闲时隙(这个地方需要着重强调下,作者提出的insertion-based就是这个意思,已经被调度的任务不是指已经完成计算的任务而是指在算法中已经被调度的2个任务);
LMT:核心第是运用并行属性将可以并行运算的任务归到一个类别。
系统模型:这一块我不展开描述了,因为都是细节,就上一个DAG计算模型的核心吧~也就是recursively~
提出算法:作者分别提出了HEFT和CPOP算法,这一块具体细节我也略掉了,一定要抓住玩DAG的本质其实就是去解决2个子问题:1. 如何定义不同任务的优先级;2. 如何选择服务器,这块重点说一下比较难理解的算法内容,也就是作者的novelty:
HEFT: 直接上原文内容,如下图所示:
怎么来理解呢?作者想表达的就是之前大多数算法在调度任务时,去算服务器p可以调度任务的最早完成时间是当p完成算法给它分配的最后一个任务的时间,但这就会有一个bug就是倘若有i,j两个任务被分配在服务器P上来计算并且他们之间隔着一段idle slot(大概率是因为任务j的完成要依赖于任务k,但任务k正在其他服务器P‘上计算),那么这段idel slot就会被浪费掉,作者却提出在满足DAG优先级约束的基础上,这个idel slot是可以利用起来调度的(这个idel slot大概率可以给任务j并行的任务且没有与任务j有连接关系),我自己画了一个示意图,供大家参考:
那么就我自己理解insertion-based想要利用的就是(t1-t2)的这段时间,可以用来调度任务4或者6(反正就是不能调度与任务5有连接的任务),那么相较于之前的算法,任务7就可能可以在t3开始调度了~那么makespan也就进一步降低了。文章是这样讲述如何使用这个技巧的(在算法就提了一嘴using the insertion-based scheduling policy,鬼知道怎么用):
结合2张图来理解,简单来说就是:总体上按照EFT的原则来分配,当产生2个任务i,j调度在同1个服务器的时候,那么就可能会产生idel time slot,在后续调度任务k的时(这个任务k和任务j必定没有连接关系),就可以算一下任务k在这个服务器上的执行时间是否idel time slot(同时还要确定任务k的ready_time是
t1的),如果满足那就丢进去。文章举例如下图所示:
我严重怀疑n3与n6是基于insertion插入的P3和P2的两个任务,我也发现n3,n6的确是和n5,n9是没有连接关系的~
CPOP:一个差别是给任务定义优先级的方式不一样(这个不细说,很简单,自己去看),另一个差别是服务器的选择不一样(展开说一下),这里着重提一下在这个算法里很关键的一个定义critical path(关键路径),文章给了很多解释我觉得最好理解的是:which is the path with the maximum number of tasks,你可以简单理解为这条路上的任务调度很复杂对整个makespan的影响是最大的,然后CPOP将CP上的task认为是critical task把他们全部扔到一个算力最强的服务器上去计算,这里可能有一个小confuse就是任务的执行顺序还是按照原来该有的拓扑结构来执行,但调度顺序上有可能存在优先级很低的critical task提前安排好了(需要强调任务的实际执行顺序和调度顺序并不严格相等!)。
仿真: 文章很多笔墨都用在这里,但都比较容易理解,这里也不再啰嗦了,有几个点可以强调下就是文章自己定义了好几个评判指标(average schedule length ratio, speedup, frequency of best results, and average running time),DAG的图呢来自于随机产生(有严格的参数配置)或是真实世界,最后文章还强行给HEFT和CPOP2个算法小小改进了下,不过也没啥不好理解的,也不再多说~
Fineeee,这篇文章学习笔记到此结束,如果有说的不对的地方欢迎指正交流~
edit by 八毛
2022/3/10
20:50