CherryPick是在刚过去的NSDI2017上发表的一篇文章。很欣喜地看到顶会论文作者上出现了阿里的身影。虽然不知道阿里在里面是什么角色……不过相对于只能看到微软或者谷歌的好多了
这两年,不管是NSDI,还是OSDI,都有关于资源推荐预测的论文,可以看出这块现在关注度还挺高的。上次去参加的技术沙龙,和一家国内云厂商经理聊天,他们的下一步也是要做资源预测来辅助调度。
那我们来一起看看这篇论文是怎么做的。首先描述一下CherryPick解决的问题的场景:
你需要在公有云上运行一个大数据相关批处理任务。这时候你来到阿里云界面上,准备买几台虚拟机。但是玲琅满目的可选虚拟机的配置,让你不知道应该选哪种配置好。如果买最高的配置吧,费用又太高了(毕竟阿里云也不便宜)。如果买低配吧,可能程序运行的时间又会太慢了。这时候,就可以用CherryPick了。你输入你的预算花费、能够接受的程序运行时间,CherryPick就能给你推荐一个花费少、时间短的机器配置。waoooo,amazing~
从上面的场景描述可以看出,CherryPick用于最佳公有云机器配置推荐,也可以理解为对任务的运行时间估计,也可以理解为对任务所需资源的估计。下面我们详细看看CherryPick的设计。
在如今呢,是越来越多的大数据分析在云端运行,比如说有Map-Reduce、深度学习等等。这些应用在提交时,需要选择所需的机器配置。但是一般数据科学家们并不知道如果选择机器配置。据统计,在同样的运行时间下,不同的机器配置所需的花费,最多相差了12倍。因此一个自动的预测推荐功能是有存在的价值的。
敲黑板啊:CherryPick的面向的场景是对于周期性的重复性作业进行推荐。因为CherryPick会进行多次运行迭代逼近较优方案,因此需要任务本身会周期运行。同时据统计40%的作业都是周期性重复作业,所以只做重复性作业也是有价值的。
预测并不是一件简单的事情,其中存在很多难点。
1.性能模型毕竟复杂
任务的运行时间并不是和资源配置呈线性相关的。同时,在公有云环境下,多租户之间的竞争,也导致了运行时间不是固定的。
2.费用模型
费用和性能一般来说是相互冲突的,性能越高,运行时间越短,费用花费可能就越高,当然不是绝对的。因此需要在花费和性能之间做一个平衡。
3.任务类型的多样
Job种类比较多,有计算密集型的、IO密集型等等,不同的配置,对任务产生的效果是不一样的。
任务的运行时间其实还和计算模型本身的设置有关,比如说Map-Reduce任务可以自己设置要多少个map和reduce数量。已经有其他研究做了,因此本文不考虑这个因素,只考虑机器配置
现在的解决方案主要分为两种类型。
1.通过构建任务模型来预测
通过对Job本身结构的分析,来对其结构上建模。现在还挺多工作是按照这个方法来的,比如说Ernest(NSDI’16),就将所有类型的任务分成了几种模型(一对多,多对多等等),然后求出一个整体模型来进行预测。本文的作者也说了,这种方法存在弊端,并不是通用的模型(如SQL like情况下Ernest效果比较差)。同时呢,也需要对任务本身的结构进行深入分析,如果分析的不好的话,建模也建不好,不太稳定。
2.静态查找最佳的配置
这种方法就是直接试不同的配置会有什么样的效果。这样的方法就是需要试很多种不同的配置,对系统的负载会很大,花的时间会比较长。但是这种的好处就是把Job当黑盒来处理,不用深入研究Job本身的特性。
CherryPick就是基于第二种方法,但是有一定的改进。
CherryPick的基本思想并不是直接选到最优的配置,是从一堆候选的配置中,每次选择比较优的配置,不断逼近最佳配置或接近最佳位置。
相对于上面提到的“现有工作“中的第二种,CherryPick并不是傻瓜式地依次去测试哪种配置好, 而是有选择性地选择新的配置,更加快速地逼近最优解。
整体运行流程如上图所示。
1.先运行一种配置看看效果
2.让性能模型观察这次的运行,来修正性能模型
3.根据性能模型,选出一个新配置
4.重复第一步,直到满意为止
那CherryPick依据什么来每次选择每轮中的最优配置呢?核心就是CherryPick的性能模型[performance model]。整片论文的核心就是如何建立这个性能模型,以及如何通过性能模型来选择下一轮需要测试的配置。
那我们现在来讲讲这个核心是如何设计的。重点来啦(敲黑板,后排的李二狗不要睡了)
A.问题形式化
我们规定,X为一种配置(如2G内存,2核),C(X)为在X配置下所需要花费的总费用;P(X)为单位时间下X配置的价格;T(X)为在X配置下,该Job的运行总时间。因此很原始的费用模型就出来了:总价=单价*数量,对应到这里,目标是最小化总花费,即
> minimize C(x) = T(x)* P(x) ----- 公式 1
subject to T(x)
因此我们的目标就是最小化C(x)。那问题来了,怎么去降低C(x)呢。
这里,就用到了机器学习的方法了。既然C(x)由于各种因素,比较随机,那就直接按照随机过程来处理,这里用的是高斯过程模型。至于为什么选高斯过程,后面作者有详细说明。
从上面的流程图可以看出,中间的性能模型,整体是用的Bayesian Optimization(贝叶斯优化,BO)。在每次计算中,首先选择一个配置,比如说配置A。贝叶斯优化可以通过配置A的运行情况,计算出总花费的一个置信区间,如有90%的可能性价格是落在在20元-30元的区间。然后再根据这次的结果,在下一轮计算中,选择一个新的配置B,通过在配置B的运行下,BO又算出一个置信区间,这次结果是90%可能性落在20-25之间。就这样不断不断降低时间,选择配置,最后得到一个最优或接近最优的配置。
在文章的最后回答这几个问题
电脑没电了…… Updating