由于租户对ECS实例(虚拟机,VM)请求的行为具有一定规律,可以通过对历史ECS实例请求的分析,预测到未来一段时间的ECS实例请求,然后对预测的请求分配资源,这样可以找到一个接近最优的分配策略,实现资源最大化利用,同时也能参考预测的结果制定云数据中心的建设计划。
赛题分为预测与分配两个部分。我们队伍初赛拿到杭夏赛区第十,复赛尽力了没能进决赛。
- 具体赛题:http://codecraft.devcloud.huaweicloud.com/home/detail
- 代码开源请戳: https://github.com/Skyexu/Huawei-CodeCraft-2018
预测
赛题给的练习数据虚拟机的申请量其实没什么规律可循,以下是1号虚拟机两个月的折线图
预测的难点:
- 数据无明显规律
- 噪点
- 特征信息少
数据去噪方面我们尝试了箱线图和Grubbs,效果还不错。
预测主要尝试了以下几个方法
常数回归
这是天池口碑流量预测冠军的一个方法。简单思路是以常数去做回归,找到一个值在训练样本中的损失函数最小,将这个值作为接下来的待测天的预测值,这里的损失函数直接使用赛题给的损失函数即可。由于赛题给的数据量小,捕捉不到特别的特征,这个方法效果在比赛中虽然单模型最好,但没有思考出更多权重系数和优化的方法,比较遗憾。
指数平滑
效果较差,一、二、三次指数平滑中二次平滑的效果相对较好,数据不稳定使用指数平滑效果并不好,模型也不够健壮,主要在于调整平滑参数。尝试对训练数据进行切分,使用 RMSE 去选取最好的平滑参数,有些许提升,但模型的适用性有限,效果不好。
参考:https://www.cnblogs.com/TTyb/p/5716125.html
ARIMA
自回归积分滑动平均模型(Autoregressive Integrated Moving Average Model),这是时序预测中比较常见的方法。在模型的使用过程中需要根据时间序列的自相关函数、偏自相关函数等对序列的平稳性进行判别;而对于非平稳序列一般都需要通过差分处理将其转换成平稳序列(ARIMA);对得到的平稳序列进行建模以确定最佳模型(AR、MA、ARMA或者ARIMA)。
ARIMA 模型在预测中效果波动大,不同的差分值也对模型影响较大,对差分,p,q 系数进行一系列调整后,模型提升有限,最后没用采用。
其它尝试做法还有周期因子规则、线性回归、取平均值、平移前预测周期等等。时间跨度太小,样本量也就过小了,也就没有去尝试更复杂一点地机器学习模型,我们最后的预测采用的是不同模型的加权结果。
分配
一开始使用了背包模型,后来使用了粒子群算法,提升明显。对于还资源利用率不满的物理机又进行了进一步填补操作,使得物理机资源利用率基本能达到比较高的分数,在预测不那么准的情况下,提升明显。
总结
这个比赛还是比较花时间的,题目给的练习数据和真正的线上评测数据相差较大,难度进一步提升,只能通过线上每天100次地不断提交反馈来进行修正。预测方面尝试了一些模型,但是对原始数据的处理不够细,应该更多地去思考原始数据层面的分析处理。分配方面由于使用了三维数组,导致空间比较大,线上运行会出现用例出错况。后来使用 Byte 去存储,也还是会出现问题,这对比赛结果也有一定影响。比赛后期,大部分队伍都开始针对虚拟机甚至用例进行参数调整,模型不够健壮的缺点就体现出来了,这样调整提升也变得些许无聊。预测部分能提升的还是很多的,没能进决赛还是有点遗憾,修炼还不够。
复赛现场华为招待的挺不错的,大巴接送,赛区36强拿到了面试绿卡。比赛能学到一些东西,但是比赛过程花了比较长的时间。