赛题:

本次赛题基本描述

由于租户对ECS实例(虚拟机,VM)请求的行为具有一定规律,可以通过对历史ECS实例请求的分析,预测到未来一段时间的ECS实例请求,然后对预测的请求分配资源(如图1所示),这样可以找到一个接近最优的分配策略,实现资源最大化利用,同时也能参考预测的结果制定云数据中心的建设计划。

图1 智能预测与资源调度示例

本次赛题通用性描述

物理服务器:云数据中心通常由大规模的物理服务器集群所组成,通过虚拟化技术,可以对每个物理节点的资源(如CPU、内存、硬盘等)进行隔离,使得每台物理机上可以同时容纳多个虚拟机,这些虚拟机即共享该物理服务器上的所有资源。为了保证每台虚拟机的运行性能,通常物理资源不能“超分”,即每台物理服务器上所有虚拟机的虚拟资源总量不能超过其物理资源总量。这里假设物理服务器只有一种规格大小。

虚拟机规格:云平台通常预先定义了各种类型虚拟机的规格(flavor),便于租户选择购买。例如,如果租户对计算要求低,而内存要求相对高,可以选择4个vCPU、16GB内存的配置。由于不考虑物理资源的“超分”,虚拟机的资源占用可与物理资源进行一比一的映射。当然,不同规格的虚拟机有不同的性能,价格也不一。

资源维度:如上述,虚拟机正常工作需要多个维度的资源同时配合,如CPU、内存、硬盘、网络等等,每种资源都可能成为瓶颈,并且每种资源分配不合理都可能产生碎片。这里假设只需要考虑单个维度资源的使用,即尽可能最大化每台物理服务器的CPU或者内存(Mem)的利用率,但在考虑某个维度资源优化的同时,要保证其他资源不能超分。

历史请求数据:租户在云平台上每申请一台虚拟机都会在后台的数据库产生一条数据,每条数据包含了虚拟机的ID、虚拟机的规格大小以及创建时间等。如果我们可以获取到云平台在过去一段时间的所有虚拟机请求数据,通过训练这些数据特征,可以预测下一个时间段可能到来的虚拟机请求分布。

比赛程序内容:请你设计一个程序能够精确预测未来某个时间段内的虚拟机的请求情况,并寻找最佳的资源分配方案:对输入的虚拟机历史请求数据进行建模分析以及训练,确定系数给出预测模型,然后对给定预测时间段内不同规格的虚拟机数量进行预测,最后根据预测结果把虚拟机部署到物理服务器上,使得服务器的资源利用率最大化。

赛题介绍详细信息请参见华为软件挑战赛官网信息点击打开链接http://codecraft.devcloud.huaweicloud.com/home/detail

思路:

1.多变量线性回归+遗传算法

2.单层BP神经网络+遗传算法+判分公式+装箱增补

3.局部加权线性回归+格拉布斯去噪+遗传算法+装箱增补

(最终使用第三个思路,进入复赛,止步于决赛)

学习与编程过程:

刚看到赛题,其实一脸懵逼,自己没有参加过什么竞赛也没有任何经验,去年抱着师兄大腿参加了一届软挑,没有贡献什么输出,今年就自己组队来做主力,真正体验一把。大概用了两天时间深入理解了赛题:预测阶段+分配阶段,依据去年的经验,没有急于上手,找了队友和师兄一起讨论思路,而且初赛文档中也给出了最简单的思路,由于没有做过机器学习有关的,因此首先按照初赛文档给出的思路进行编程。

最初版用的多变量线性回归进行预测,模型是根据机器学习笔记02:多元线性回归、梯度下降和Normal equation这篇博客进行编程实现,核心思路就是用最小二乘的结果作为迭代的方向,不断更新权值(更新公式见参考的博客),通过对训练集进行拟合,得到一组最优的权值(注意这组权值包含有一个常数权和一堆系数权,系数权用来乘不同的特征数据x)。权值迭代过程中,有一个学习速率参数α,需要自己去试验(从网上看到很多源码都取得定值),我根据本地数据去调整,将α变成自主学习变化的,算是提高了编程效率,也防止按照一个固定的变化速率错过最优的情况(但是容易陷入局部最优解),调整的方法是惩奖制度,如果这次迭代求出的损失函数(最小二乘结果)变小了,证明数据更加接近训练集了,这个时候我把学习速率放大,但是如果损失函数相对于上一次求解变大了,证明可能错过了最优解,这时候我把学习速率乘上一个较小的负数,反向迭代。通过不断的调整,求得一组损失函数最小的权值。

划分训练集的方式,一开始按天数划分,效果并不好。后来按周(这里按周是假设要预测的时间为一周,若要预测的结果为10天就按10天去划分)去划分效果好了一些,大概原因是与天数相比,按周划分的时候0出现的次数减少了很多,更有利于求解,同时预测结果一次得出,防止按天数去预测导致最后的结果误差累积,但是按周划分的时候发现,很可能训练数据量不足以划分出一个训练集去进行训练,可能数据量会不足,这时候就想到了将数据进行拓展(经过多次调整本地训练集发现特征数量选4最合适),按照一行放4个数据(1,2,3,4),第二行放4个数据(2,3,4,5),以此类推得到一个规模足够大的训练集,但还是会有较多的0出现,本地测试时预测结果也并不理想。这个时候就和参赛群里的一个大佬聊了聊,又逛了逛知乎,发现如果使用累积的数据,每个flavor都有一定的趋势,感觉更有预测性(之前的数据用matlab仿真发现数据就是不同的离散点),通过累积将数据变的有了关联性。于是最后就按周去划分,并且将数据进行累积(例如之前的数据1,2,3,4;现在变为1,3,6,10)。

此时需要考虑分配的问题,得益于去年和师兄一同参赛的原因,了解了遗传算法,师兄也给我推荐了遗传算法,并指导我根据自己的预测模型和要求的思路,将遗传算法封装成了函数。分配思路很好理解,将问题等效为背包问题,放该型号flavor则标志为1,不放该型号标志为0(刚开始数据的存储就使用了类,把cpu和memory以及对应的型号和预测的台数封装在一起,便于之后的各种操作),这样就将问题转换成了二进制编码,遗传算法的适应度函数根据读取文件时,判分准则是cpu或是mem进行选择(假设为cpu,则适应度函数为 : 所有标志为1的flavor的cpu综合/一台物理机的cpu),当适应度函数为1时(此时就放满了),不再进行遗传求解从而节省时间(因为遗传算法确实很费时间),同时要满足所有要放置的flavor的cpu总和与memory总和不会超过物理机的cpu和memory。遗传算法通过对老一代的染色体(染色体指的就是01编码序列)进行交叉变异,生成新一代种群,然后记录下老一代和新一代中最优(适应度最高)的一条染色体位置。如果新一代中最优适应度大于老一代,就用新一代数据替换老一代数据,把新一代数据当做原始数据,继续去交叉和变异,直到达到要求的代数;如果新一代中适应度最高的染色体还不如老一代,则用老一代中适应度最高的染色体来替换新一代中适应度最低的染色体,之后操作同上,这样总能保证最后一代中一定包含有适应度最好的染色体。封装成函数后返回一组最优解(以二进制编码的形式),然后将标志为1的flavor去掉,剩下的长度重新传入遗传算法,不断求解,直到这组二进制编码的长度为0,这表示所有预测的结果已经放入了物理机。

到此为止,第一版程序就完成了,一开始还能跑20名左右,后来就不行了,在40名开外了。这时候就准备进行大改了,一直觉得自己的遗传算法相对于FFD来说应该有过之而无不及,就没有必要对装箱部分进行改造了,于是就开始改造预测方法。然后就到图书馆借了一些机器学习的书籍,看到了神经网络,于是开始手撸神经网络。中间找了很多博客,主要借鉴了这篇BP神经网络原理及C++代码实现,思路清楚且有相关代码,手撸进行了部分改进,大体框架是按照此篇实现的。这里需要注意一些问题,首先BP神经网络既可以用来做回归(即预测),也可以用来分类,而且好像用于分类的更多一些,核心思路还是一样的,求损失函数(最小二乘),但是权值就更多了,因为包含输入层到隐藏层的多组权以及隐藏层到输出层的一组权(这里一组是因为我们输出的是预测结果,不是分类结果,所以是一组权)。bp神经网络相对于多变量线性回归,可以调整的参数就更多了,除了添加了之前提到的自主学习速率外,还对输出层函数进行了改动,由于输出层函数不需要归一化到0~1之间,所以我选择了线性函数(y=x)作为输出层函数,对于隐藏层函数,我一开始使用的是S型函数(sigmoid函数),然后数据集的划分同样是选择 预测天数+累积 的模型,然后通过本地训练集的训练得到预测结果,对比发现预测的结果差的很多,而且由于使用的累积的模型,预测结果是肯定不会小于前一个数据点的,但是仍旧出现了这种情况,导致预测出现负数,同时也会出现损失函数一直不变。不能下降证明通过求导求得的值取到了极值,权值不再更新迭代,这是好的结果,但是损失函数的值还是很大,而且明显还没有进行迭代,损失函数就已经不变了,于是开始找问题。调试过程中发现损失函数不下降是由于激活函数选择的原因,S型函数有个致命缺点:该神经元的活跃度在0和1处饱和,它的梯度在这些地方接近于0,这就导致了梯度无法下降从而权值不再更新,损失函数也就不会有变化。于是我选择了 另外一个激活函数leaky Relu,算是解决了梯度无法下降的问题。

还有一些比较重要的点,BP神经网络的多组权值和偏置(偏置即相当于常数权)要进行初始化,一般初始化为0~1的随机值,在初始化上师兄给出了建议,使用遗传算法先确定一组较好的初始值,这样在BP神经网络的后续计算中,能够更快的收敛和学习。然后就改进了一下,将损失函数的倒数作为适应度函数,损失函数越小,适应度越高。而对于预测结果出现负值,原因是因为过拟合导致的。为了解决过拟合,我加入了L2正则表达式,关于正则表达式,我看了一篇博客L2正则化方法,与此同时发现隐藏层结点过多也会出现过拟合。过拟合其实就是把不需要的特征也学习了,对于预测而言,需要学习的是所有训练集的共有特征,然后去预测,而不是把每个训练集的特征都学会。完成了预测部分的改动后,装箱部分沿用了之前的遗传算法。然后本地数据进行训练对比,发现答案非常合适(不加正则表达式基本可以完美匹配训练数据,但是对于预测结果却一般,因为过拟合)。这时候就用这个方法丢了上去,发现分数并不理想,甚至波动范围很大,不如以前的多变量梯度下降稳定。

同实验室也有其他同学参赛,于是就和他们请教了一下,人多力量大,交流后发现了一个宝贵的思路,就是装完物理机后,总会有物理机装不满,这时候就根据要预测的flavor对物理机进行填补,这样就需要有一个综合判定,到底是对预测的影响更大还是对装箱部分的影响更大(因为强行进行填补会偏离预测的结果),如果对自己的预测结果足够信任,可以使用官方给出的判分公式,以自己预测的结果为标准,对其进行填补时会计算出预测乘装箱利用率的结果,如果结果变大,证明填补更好,否则不进行填补。这样一来分数有了一些提高,但是仍然没有质的飞跃。

用了接近两个星期的时间去完成了BP神经网络的实现,感觉一下被打趴了。中间有好几天都没有继续做下去,直到再一次和实验室的同学交流,发现他们成绩都很不错,稳定在30~40,这时候我们已经被挤在榜单边缘。通过交流得知,他们并没有对原始数据进行切分,而是直接用一组数据去拟合结果。花了这么多功夫去切分数据,结果聪明反被聪明误,不如简单一些的模型来的实在!他们中一个用的线性加权回归,一个用的三次指数平滑,都没有对训练集进行过多的划分,而且效果都很不错(从得分情况看)。于是我开始考虑使用局部线性加权回归。思路非常简单,和多变量线性回归很相似,只需要求出两个权值,一个常数权,一个系数权(与该系数权对应的特征为日期),而y值为每天对应该flavor的虚拟机台数。但是在损失函数的求解以及权值的更新公式里多了一个核w,这个核我们使用了高斯核,这个核的作用就是距离预测点越近的权重越大,对拟合曲线的影响也就越大。关于局部加权线性回归原理,推荐一篇博客局部加权回归。博文中没有给出权值的更新公式,但是简单的对损失函数进行求导即可发现,高斯核在求导过程中相当于一个常数,因此对于权值更新而言只是多乘上了一个高斯核。程序很快就改进完成了,然后开始跑结果,分数确实有所提高,但是距离实验室同学的分数还是有一些分差。有一组装箱用的First-fit Decreasing,我觉得自己用的遗传算法肯定是更好的,所以我可以确定自己的预测还是不准确。于是就又去交流了一下,发现他们使用局部加权的一个思想,不使用最小二乘去寻找最优的权值,而是直接用损失函数分别对w0和w1求导(w0为常数权,w1为系数权),并令他们等于0,联立解方程组。如果仔细想一下会发现,梯度下降的过程其实就是当导数为0时不再下降,此时的权值也就是导数为0时求得的值(对于一元一次方程),而且这样也避免了预测时花费过多的时间,为遗传算法节省出了更多的时间。用这样的方法,分数又有所提高。

赛题发布的时候,专家提供解题思路时就说过去噪,因为训练集中可能会有一些噪点,如果去直接训练会导致训练结果很差。对于噪点,实验室中的另一队与我分享了他们的思路:3西格玛准则。3σ准则指建立在正态分布的数据的干扰或噪声难以满足正态分布。如果一组测量数据中某个测量值的残余误差的绝对值 νi>3σ,则该测量值为坏值,应剔除。通常把等于 ±3σ的误差作为极限误差,对于正态分布的随机误差,落在 ±3σ以外的概率只有 0.27%,它在有限次测量中发生的可能性很小,故存在3σ准则。3σ准则是最常用也是最简单的粗大误差判别准则,它一般应用于测量次数充分多( n ≥30)或当 n>10做粗略判别时的情况。根据该准则,如果直接对所有天数一起做去噪,效果并不是很理想,因为如果0值偏多会将一些峰值点拉的很低。实验室的同学选择了7天作为滑动窗口大小,平滑方法是取该窗口中心值进行3西格玛计算,如果该点相对于这个7天窗口不满足该准则,则用紧邻该点两天的均值替换该点的值(原来准则为剔除,但是数据量本来就很少,因此没有选择剔除,而是替代;若果选择用整个窗口的均值去替换,很容易把一个数据点压的特别低,效果并不理想)。我们借鉴了他们的思路,但是我在使用3西格玛准则时发现了另外一个准则--格拉布斯准则,发现如果使用3西格玛,窗口选择7的话,其实是不准确的,因此3西格玛准则是相对于测量次数充分多的情况。因此我最后改用了格拉布斯判断准则,参考值按照格拉布斯表取的,没有剔除而是替换,替换方法与之前相同。这样一来去噪也完成了。使用后的分数也有所提高。

没过几天,初赛正式比赛开始了。因为新增了高级用例,而我们的程序对高级用例并不兼容,3个高级用例出现了不同的问题。首先出现数据输出非整型错误,这点问题出现在我们用的局部加权时,高斯核有一个变量τ,整个预测过程其实就是对τ的调参。仔细对比模型会发现,由于我们要求的yi对应的xi肯定是最大的,因此高斯核的取值在(0,1]之间,越接近于要预测的天数,其数据影响越大。如果τ选取的不好,输出就会出现输出一堆特殊符号,调试的时候出现过一次,当时一直认为是预测结果太大,超过了int所能存放的大小,所以出现了这种情况。比赛时候又出现了,好在调整τ后恢复了,但是出现了新的问题,三个高级用例中有两个超时了,这时候我就把种群和代数调的尽可能的小,但是仍旧无用。已经用了3次机会,变得有点沉不住气了。超时的话,要么是预测的数据过大,要么就是遗传算法有问题,跟队友一起过了一遍程序,发现遗传算法有一些问题。原来的遗传算法初始种群中的每条染色体的每个点有一定的概率置1,这个置为1的概率是按照输入如果是cpu(或是memory),那么用 物理机cpu(或memory)/整条染色体的cpu(或memory)总和 的概率设置的,然后去判断是否该结果不超过物理机cpu和memory,满足则成功生成一条染色体,根据设置的种群数去生成相应数量的染色体。一旦不满足,就会出现while循环,如果置1的概率不合适,就会一直找不到满足条件的染色体,这样就会超时。于是我们比较 物理机cpu/整条染色体的cpu 以及 物理机memory/整条染色体的memory ,哪个取值小就选取哪个概率,同时保证置为1的概率的上限为0.8,这样就避免了初始种群时的死循环。还有一处可能超时,就是进行交叉时是以一定的概率进行交叉,如果交叉的结果不满足条件,也会进入while循环,我们加入了一个条件:迭代超过一定的次数,如果找不到合适的解,不进行交叉,只进行变异。这样也避免了第二部分超时。最后程序也就跑通了,通过后几次机会调整τ值,最后也取得了不错的分数。

进入复赛后时间紧任务重,基本上预测也没有改动,遗传也没有改动,只是物理机种类增多了。这时候如何选物理机是一个问题。而且没有自适应的τ值,也是一个问题。随后我们将τ值改为自适应的(经过多次本地数据测试得到的高斯核的取值趋势,通过给高斯核设置一个门限,去计算相应的τ值)。对于选择物理机,没有想过多,直接将 要放置的cpu/物理机cpu+要放置的memory/物理机memory 作为一个对比值,哪个物理机型号对应的取值接近2(要放置的cpu等于物理机cpu,要放置的memory等于物理机memory时可以取到2),就选择哪个类型的物理机,现在想想这里其实有个弊端,假如cpu/cpu为1.5,memory/memory为0.5,也是接近2的,但是当时没有考虑到这么多。总体思路没有变,复赛的时候也丢了几次,分数也一般,最后冒了下险,结果当然是gg,不得不承认自己还是欠缺很多。第一次参加竞赛,而且第一次用c++撸这么完整的程序,收获颇丰。

华为2018软赛心得(西北36强)相关推荐

  1. 华为虚拟服务器lanip地址,2018软考网络工程师《华为基础实验》十九配置路由器为DHCPServer...

    原标题:2018软考网络工程师<华为基础实验>十九配置路由器为DHCPServer 实验要求: 在R1上使能DHCP 功能. 创建三个全局地址池,用于为三个不同部门的PC分配IP 地址. ...

  2. 福州大学计算机专业排名2018,软科2018年世界一流学科排名发布 福州大学9个学科上榜...

    新闻中心讯/7月17日,软科正式发布2018"软科世界一流学科排名"(ShanghaiRanking's Global Ranking of Academic Subjects), ...

  3. 华为2018年收入超阿里腾讯总和,任正非:华为最大问题是赚钱太多

    7月22日,2019<财富>世界500强发布.虽然已经过去好几天,但是关于榜单内容的讨论并没有停下. 有媒体发现,排名从上一年的第72位提升至第61位的华为,2018年营业收入达到1090 ...

  4. 2018《财富》世界500强出炉,比500强更多的财富在这里!

    2018<财富>世界500强出炉,比500强更多的财富在这里! 昨天,2018<财富>世界排行500强榜正式发布,第一名是连续5年夺魁的沃尔玛.值得一提的是所有的互联网服务公司 ...

  5. 人脸识别——2018华中赛数学建模总结整理

    2018华中赛数学建模总结整理 题目:人脸识别 题目简介 第一题思路 第二题思路 第三题思路 第一题结果 第二题结果 第三题结果 第一题代码 第二题代码 第三题代码 转眼已经大四了,加上也没什么课程, ...

  6. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.19日(2018省赛A组第7题)

    2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家每天看博客蓝桥杯专栏: htt ...

  7. 亚马逊中国挂了!华为 2018 研发支出超苹果;苹果设计核心元老离职 | 极客头条...

    不方便看文字的小伙伴,赶快来听音频版吧. 主播 | 程序媛小仙女 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最 ...

  8. 新闻丨智链万源荣登2018中国区块链企业百强榜

    2019年1月22日,由清华大学互联网产业研究院联合链塔智库BlockData.赛迪(青岛)区块链研究院共同主办的"第一届中国区块链产业经济发展年会"在清华大学举行,本次大会主题为 ...

  9. 华为2018届校招技术岗笔试题及个人解答

    前言 昨天(9.13)参加了华为2018届的技术岗笔试,特此总结一下笔试的题目和我个人的解答思路. 笔试题一共是三道编程题,大致是数值反向输出,比较和排序,相对较基础. PS:由于没有截图,所以题目是 ...

最新文章

  1. DeepFake疑遭审查
  2. python hook教程_python中使用pyhook实现键盘监控的例子
  3. 复杂存储过程学习_对象存储在无人驾驶高精度地图的场景实践
  4. boost::core模块实现分配const指针
  5. java项目红叉_完美解决Eclipse导入的项目上有个红叉,但不影响项目运行的问题
  6. ssh 双机互信配置记要
  7. VB.NET中图像处理的一些技巧以及其和C#图像处理的差距。
  8. AlertDialog源码解析之一
  9. Atitit.css 规范 bem 项目中 CSS 的组织和管理
  10. 微信小程序的组件传值
  11. 用python打印九九乘法表
  12. 笔记本电脑连接加密无线路由器。
  13. vss服务器状态失败_vss问题解决办法
  14. 真无线蓝牙耳机怎么选?分体式蓝牙耳机选购攻略及推荐
  15. 魅族mx1Android4.4,魅族最新系统 Flyme 1.0 for MX(双核/四核)正式版 基于Android 4.0
  16. MyHome3D在线装修设计软件测评
  17. php cms 路由规则,如何设置PhpCms系统URL规则管理 phpcms教程
  18. 附加驱动管理软件 ubuntu_linux下安装realtek8812au/8811au驱动
  19. spring-boot项目实例
  20. visual assist x太卡了_搭载11代酷睿3.3K触摸屏纵享奢华,华硕灵耀X纵横全面评测...

热门文章

  1. 哈工大计算机网络考研题,哈工大计算机考研历年复试试题(完全版).PDF
  2. 嵌入式开发(五):海思Hi3559AV100交叉编译boost
  3. Mac:当iPhone连接苹果电脑时,自动弹出照片的解决方案
  4. 山东科技大学计算机调剂难吗,山东科技大学 材料专业 调剂 求老师带走 国家线总分单科不都受限 - 考研 - 小木虫 - 学术 科研 互动社区...
  5. 国产存储芯片,emmc,性能强
  6. Win10中安装Oracle11g
  7. 程序员的呐喊--读书感悟
  8. xmanager显示linux7桌面,Xmanager 5远程连接CentOS7图形化界面
  9. adi翻译_ADI是什么意思_ADI的翻译_音标_读音_用法_例句_爱词霸在线词典
  10. nuke11安装教程 nuke11破解教程