基于贝叶斯优化的编译器优化选项推荐方法
技术领域
本发明涉及编译器优化
技术领域
,特别是涉及一种编译器优化选项推荐方法。背景技术
编译器是一种将程序转化为语义等价、执行更快且使用更少资源的程序。一个典型 的编译器往往具有大量优化选项,每个选项有打开和关闭两种状态。因为优化选项数量太多,编译器的使用者无法做到理解每一个优化选项的功能,也无法判断一个优化选项 应当打开还是关闭,以使得被编译的代码具有更短的执行时间、更小的代码体积或更少 的能源消耗。因而,编译器优化选项推荐问题中存在的大量高维数据是传统的贝叶斯优 化不能承受的。这也导致在贝叶斯优化中需要预测大量的优化序列,一个优化序列指的 是一组打开的优化选项。为了解决这个问题,引入编译器的优化级别,设定每一个优化 级别会打开特定的优化选项,来达到某一个优化目标。但是,这些优化级别并不能让每 一个程序在每一个平台上都能有足够好的性能。甚至在某些平台上,优化级别所能达到 的性能与程序的最优性能之间差异巨大。因此,除了使用既定的优化级别之外,有必要 在特定平台针对特定程序进行进一步的优化选项推荐,使被编译的程序达到足够好的性 能。
现有的编译器优化选项推荐方法有两大类:基于离线学习的推荐方法和基于在线学 习的推荐方法。最新的基于在线学习的推荐方法包括随机优化选项推荐方法(在每次迭代中,随机地把每一个优化选项打开或者关闭,然后在该优化选项组合下评估程序的性能,记作RIO)、基于遗传算法的优化选项推荐方法(首先生成一个初始优化选项组合 的集合,随后,在每次迭代中,集合里的优化选项组合将被视为染色体并且做交叉和变 异,记作GA)、基于IRace的优化选项推荐方法(学习迭代过程中每个优化选项的采 样分布,用于决定每个优化选项是打开还是关闭,记作IRace)等。尽管以上在线学习 方法已被证明是有效的,而且不依赖于大量的训练数据,但它们依然存在着低效率的问 题。
贝叶斯优化是一种优化目标函数的方法,而得到这个目标函数的结果往往需要很高 的代价。贝叶斯优化的核心思想是利用搜索空间中已知区域所积累的知识来指导选择剩 余区域中的样本,以便更有效地找到最优样本。更具体地说,它是一个迭代过程,包括两个主要步骤:第一,建立一个基于已测量样本的目标函数的预测模型;第二,由预测 模型指导基于预测模型和获取函数的进一步采样。在传统的贝叶斯优化中,高斯过程被 用于建立预测模型,它提供了一个贝叶斯后验概率分布来描述候选样本的目标函数输出。 一个获取函数可以决定下一步在哪里采样,以便在当前最佳观测的基础上对采样的效果 进行改进。广泛使用的获取函数包括Expected Improvement、Maximum Variance和 MaximumMean。
发明内容
本发明旨在提出一种基于贝叶斯优化的编译器优化选项推荐方法,为待编译程序推 荐一组新的更优的编译器优化选项推荐方法(BOCA),通过在贝叶斯优化的框架中提 出了一种新的优化选项搜索策略,并且加入了衰减函数来平衡对未知优化空间的探索和 对已知优化空间的利用来实现编译器优化选项推荐方法的创新。
本发明为解决上述问题而采取的技术方案如下:
一种基于贝叶斯优化的编译器优化选项推荐方法,该方法包括以下步骤
步骤1:随机生成优化序列并测量在采用该优化序列编译后的执行时间来构 造初始训练集,在生成初始的训练集后,依照贝叶斯优化的框架实现基于此初始训练集 的迭代;每一次迭代应基于现有的训练集,在每一次迭代中,执行步骤2至步骤6;
步骤2:通过随机森林的训练算法建立一个预测模型;该预测模型所完成的处理包括:利用随机森林训练算法每个决策树对构成训练集的给定优化序列进行预测,得到每 个决策树所做的预测值;然后,在随机森林训练算法中合并多个决策树,从而在每个决 策树所做的所有这些预测值的基础上获得预测值的均值和标准差;
步骤3:通过对重要性进行排序来获得重要优化选项,而将剩余的优化选项随机设置为不重要优化选项;具体操作为:
基于一个训练好的随机森林模型来计算每个优化选项的重要性,如下式所示:
其中,u表示在节点上使用优化选项o进行拆分的决策树的总数,t表示决策树的总数,而dj表示在第j决策树中使用o进行拆分的节点;
步骤4:通过列举所有由重要优化选项组成的组合从而获得重要优化选项组合;以及通过高斯衰减函数辅助确定对应一个固定的重要优化选项组合的不重要优化选项组 成的非重复组合的具体数量,由此获得候选优化序列集合;
利用高斯衰减函数计算C(x),如下式所示:
其中,C1表示每个重要优化选项组合的不重要优化选项组合的数目,x表示迭代次数,C(x)表示在x迭代中重要优化选项组合的数目,offset、scale和decay表示控制高斯 衰减函数的衰减形状的三个参数;
步骤5:使用所构建的预测模型预测每个候选优化序列的性能,并获得每个预测的平均值和标准偏差,用于计算每个候选优化序列的EI值;
步骤6:更新训练集,具体操作包括:获得在所有候选优化序列中具有最大EI值且不在训练集中的优化序列,然后测量该优化序列所导致的程序执行时间,并将该优化序 列及其执行时间添加到训练集中以进行下一次迭代;如果未达到终止条件,则进入下一 次迭代,再次从步骤2开始执行;
步骤7:在达到终止条件时输出最终的优化序列。
与现有技术相比,本发明能够达成以下有益技术效果:
比现有的贝叶斯优化方法性能更好,能够更加有效地实现编译器优化选项推荐。
附图说明
图1为本发明的基于贝叶斯优化的编译器优化选项推荐方法整体流程图;
图2为本发明的基于贝叶斯优化的编译器优化选项推荐方法实施过程示例图;
图3为本发明所使用的衰减函数示意图;
图4为K值的影响曲线示意图;
图5为scale值的影响曲线示意图;
图6为本发明与ε-PAL和FLASH的对比结果。
具体实施方式
下面结合附图和具体实施例对本发明技术方案作进一步详细描述。
本发明的基于贝叶斯优化的编译器优化选项推荐方法(BOCA),整个方法采用Python语言实现,并调用了现有的Python语言的第三方库scikit learn和numpy。其中, 涉及机器学习模型的部分直接使用了scikit learn中提供的随机森林及其默认参数设置。将BOCA中的K,offset,decay,scale分别设置为8,20,0.5和10。除此之外,将初 始集大小设置为2,而默认迭代总数则被设置为60。本发明采取的是在线学习的方法。
在每次迭代中,BOCA技术方案归纳为三个方面:(1)建立预测模型;(2)选取 候选优化序列;(3)根据一个获取函数,在这些候选优化序列中选择最优的序列,然后 对该序列进行评估,并用于更新预测模型。其中,(1)和(2)是本发明的创新点。
如图1所示,为本发明的基于贝叶斯优化的编译器优化选项推荐方法整体流程图。
该方法具体实施过程如下:
步骤1:随机生成优化序列并测量程序在采用该优化序列编译后的执行时间来构造 初始训练集,在生成初始训练集后,依照贝叶斯优化的框架实现基于此初始训练集的迭代;每一次迭代应基于现有的训练集,在每一次迭代中,执行步骤2至步骤6;
步骤2:通过随机森林的训练算法建立一个预测模型;
该预测模型所完成的处理包括:利用随机森林训练算法每个决策树对构成训练集的 给定优化序列进行预测,得到每个决策树所做的预测值;然后,在随机森林训练算法中合并多个决策树,从而在每个决策树所做的所有这些预测值的基础上获得预测值的均值和标准差;
建立预测模型需要明确训练集和模型训练算法。训练集中的训练实例是优化序列, 且对应着在该优化序列下给定程序被编译后的执行时间。训练集中的训练实例有两个来 源,即包括:(1)随机选取优化序列并评估它们,得到相应的程序执行时间,作为初始 训练集;(2)在随后的每一次迭代中,根据获取函数从优化空间中的未知部分选择最 佳优化序列,并评估最佳优化序列下的程序执行时间,将其作为实例加入到训练集中。
本步骤在传统的贝叶斯优化中使用随机森林代替高斯过程建立预测模型。用随机森 林代替高斯过程的原因是:高斯过程不能扩展到高维数据(也就是数量庞大的优化选项)。 本发明方法(BOCA)采用Expected Improvement(EI)作为获取函数,因为它在确定要测量的下一个优化序列时同时考虑了对未知优化空间的探索(通过预测的标准差来衡量)和对已知优化空间的利用(通过预测的平均值来衡量)。在高斯过程中,预测的均值和 标准差可以直接输出,而本发明在随机森林中合并多个决策树,从而在每个决策树的预 测基础上获得预测值的均值和标准差。在给定优化序列的情况下,随机森林的每个决策 树将对其进行预测,然后根据决策树所做的所有这些预测值计算平均值和标准差。
步骤3:通过对重要性进行排序来获得一定数量的重要优化选项,而将剩余的优化选项视为不重要的优化选项;具体操作为:
利用公式(1)(2)(3)基于一个训练好的随机森林模型来计算每个优化选项的重要性,具体包括以下的计算过程:
节点d的Gini重要度的计算如下式所示:
其中,I()表示节点的Gini纯度,ωleft、ωright表示从节点d分裂到左节点的优化序列的比例、从节点d分裂到右节点的优化序列的比例,nd表示节点d中的优化序列数, N表示整个训练集中的优化序列总数。
计算节点d的Gini纯度,如下式所示:
其中,c表示集合中不同标签的总数,而pi表示如果从集合中随机选取优化序列,选取的优化序列的标签为i的可能性。虽然目标是通过随机森林构建一个回归模型,但 在训练期间,每个决策树实际上都将整个范围分到几个区间中,新区间将作为新标签, 从而能够计算Gini纯度。
在获得每个决策树中每个优化的Gini纯度之后,通过合并所有这些决策树进一步计算优化选项的重要性,如下式所示:
其中,u表示在节点上使用优化选项o进行拆分的决策树的总数,t表示决策树的总数,而dj表示在第j决策树中使用o进行拆分的节点;
通过对重要性进行排序来获得一定数量的重要优化选项,而将剩余的优化选项视为 不重要的优化选项,具体操作为:按重要性的降序排列优化选项,将排在最前面的K个优化选项标识为重要优化选项。重要优化选项可能对给定程序的执行时间有很大的影响。在这里,列举出这些重要优化选项组成的所有优化选项组合。为避免列举所有组合消耗 巨大成本,K应尽量小。
除了设置这些重要优化选项,要获得一个完成的优化序列,其余的优化选项也要设 置。本发明的做法是,对于设置重要优化选项所得到的固定组合,随机设置剩余优化选项以形成一个优化序列,原因是剩余优化选项对给定程序的执行时间影响较小。然而, 任何机器学习技术,都很难保证精确地预测出每个优化选项的重要性,特别是当训练集 不是很大时。因此,重要优化选项之外的优化选项中也可能包含真正重要的优化选项。 基于这样的原因,本发明又进一步探索了重要优化选项之外的优化选项的组合。由于不 可能探索所有的组合,因此随机选择一定数量的组合进行探索。随机探索的另一个好处 是避免局部最优。
第一次迭代中训练集的大小相对较小,更有可能对重要优化选项进行不准确识别, 因此衰减在开始时应当很慢,衰减的是对应一个重要优化的组合,为将其扩展成完整的 优化序列,需要探索的剩余优化选项组合的数量。随后,训练集变得越来越大,不准确性也随之减小,因此可以使衰减加速。基于这种设想,在每个迭代中,使用高斯衰减函 数来确定,为将重要优化选项的固定组合扩展成为一个完整的优化序列,所需要探索的 剩余优化选项组合的数量。利用高斯衰减函数计算C(x),如下式所示:
其中,C1表示每个重要优化选项组合的不重要优化选项组合的数目,x表示迭代次数,C(x)表示在x迭代中重要优化选项组合的数目,offset、scale和decay表示控制高斯 衰减函数的衰减形状的三个参数。
如图2所示,为本发明的基于贝叶斯优化的编译器优化选项推荐方法实施过程示例 图。
如图3所示,显示了BOCA的衰减过程以及offset、scale和decay的具体含义。根 据计算出的组合的数量,BOCA随机生成每个重要优化选项组合扩展成完整优化选项组 合时,所需要补全的不重要的优化选项的组合。基于以上内容得出,在每次迭代中,选 候选优化序列的总数为C(x)*2k。通过使用预测模型计算这些候选优化序列的EI值,选 择EI值最大的优化序列作为集合中的最优序列,然后测量给定程序在其下编译后的执 行时间,并将其添加到训练集以供下一次迭代时更新预测模型。
因此,本发明结合随机森林技术并提出一种新的候选优化序列的选择策略以克服高 代价的问题。本发明的选择策略旨在选择未评估优化序列的一个子集,该子集尽可能包含最优序列。本发明通过预测该子集而不是预测所有未评估的优化序列来更高效地找到最优优化序列。
由于剩余的优化空间中存在着极多的未知优化序列,利用预测模型来预测所有剩余 优化序列以寻找最优优化序列的代价是非常昂贵的。因此,为了克服该问题,本发明选择了很可能包含最优序列的未知优化序列的子集作为候选优化序列集合。如前文所述, 本发明的选择策略旨在选择未评估优化序列的一个子集,该子集尽可能包含最优序列。 本发明通过预测该子集而不是预测所有未评估的优化序列来更高效地找到最优优化序 列。因此,本发明不保证找到的自子集一定保证包含最有序列。然而,由于待搜索的优 化空间非常大,选择这样一个子集的候选优化序列也很困难。为了解决这一问题,本发 明设计了一种选择策略:对于给定的程序,只有少量的优化选项才能对给定程序的执行 时间产生很大的影响(称为重要优化选项),充分利用这些重要优化选项更有可能找到 最优解。然而,一般很难准确地确定众多优化选项中哪些是重要优化选项。在这里,通 过平衡对已知优化空间的开发和对未知优化空间的探索,基于本发明设计的选择策略, 选择了一个很可能包含最优序列的候选优化序列子集。
依赖于多个决策树和基于树的集成机器学习技术来进行特征选择,而本发明所使用 的决策树根据Gini纯度来进行叶节点的分裂。在决策树中,每个节点都有Gini重要性,它对应着使用一个特征(在编译器调优中,一个特征对应于一个优化选项)进行叶节点 的分裂时节点中Gini纯度的减少量。这里,节点中的Gini纯度对应从节点中的优化序 列集合中随机选出的优化序列被打上错误标签的可能性。在编译器优化的问题中,每个 特征实际上只有两个可选值,即0和1,因此一个特征在决策树中最多可以用于拆分一 个节点。因此,一个节点的Gini纯度等同于此节点上用于拆分的特征的Gini纯度。
步骤4:通过列举所有由重要优化选项组成的组合从而获得重要优化选项组合;以及通过高斯衰减函数辅助确定不重要优化选项组成的非重复组合的具体数量,由此获得候选优化序列集合;
本步骤的目的是充分探索这些重要优化选项。除了设置重要优化选项,要获得一个 完整的优化序列,还需设置不重要的优化选项组合。一个完整的优化选项组合由重要优化选项的组合以及不重要优化选项的组合组成。而不重要优化选项的设置通过随机生成优化选项的打开或关闭的状态来完成。对应每个重要优化选项组合生成由不重要优化选项组成的非重复组合,不重要优化选项组成的非重复组合的具体数量通过高斯衰减函数辅助确定。
步骤5:预测优化序列性能,具体为:使用所构建的预测模型预测每个候选优化序列的性能,并获得每个预测的平均值和标准偏差,用于计算每个候选优化序列的EI值;
步骤6:更新训练集,具体为获得在所有候选优化序列中具有最大EI值且不在训练集中的优化序列,然后测量该优化序列所导致的程序执行时间,并将该优化序列及其执 行时间添加到训练集中以进行下一次迭代;如果未达到终止条件,则进入下一次迭代, 再次从步骤2开始执行;
步骤7,在达到终止条件时输出最终的优化序列。
本发明还研究了BOCA中主要参数的影响,包括K(即已识别的重要优化选项的 数量)和scale(用于控制衰减速度)。实验结果如图4和图5所示,图4为K值的影 响曲线示意图,图5为scale值的影响曲线示意图。其中x轴表示参数值,y轴表示达 到默认参数值下BOCA在60次迭代中达到的加速比所花费的平均时间。从图中可以发 现本文的默认值(即8)表现最好。当将设置为16时,BOCA无法在给定的时间段内 完成实验,因为枚举16个重要优化选项的所有组合是非常耗时的。这也证明了设定适 当的K值的重要性。从图中,可以发现scale的小值(即5和10)比大值(即15和20) 表现得更好,这表明相对快速的衰减有助于提高编译器自动调整的效率。而且,本发明 当前的scale值(即10)表现最好。综上所述,BOCA中的主要参数确实对BOCA的有 效性有一定的影响,并且本发明当前的参数设置是较优的选择,可以作为BOCA后续 使用中的默认设置。
本发明考虑了三类比较方法。第一类是现有的编译器优化选项推荐方法,包括RIO、 GA 和IRace。第二类是现有的贝叶斯优化方法,包括传统的贝叶斯优化方法(ε-PAL)、最新被用于配置软件系统的贝叶斯优化方法(FLASH)和先进的通用贝叶斯优化方法(TPE)。本发明在GCC和LLVM上比较各种编译器优化选项推荐方法和BOCA时, 比较的是它们在优化级别O3上取得的加速比,并基于此加速比计算BOCA相对其他方 法所取得的提升。实验中使用了20个来自Polybench和cBench的程序。
首先将BOCA与其他编译器优化选项推荐方法,即RIO、GA和IRace,进行对比, 结果如表1、2所示。本发明还将这些方法中的初始集合大小设置得与BOCA相同以进 行公平比较,但GA除外。由于遗传算法中的交叉机制,对于GA,实验不能将初始集 大小设置为2,因此本发明将其设置为最接近的偶数值4。在已有的文献中,遗传算法 的初始集大小被设置为100,但在本发明的实验中,评测100个优化序列需要的代价非 常高,特别是当程序的编译和执行时间较长时。因此,本发明没有采用这种设置。为了 研究初始值较大的GA的有效性,本发明还尝试了初始集大小为10的GA。本发明分别 将这两个GA实现称为GA4和GA10。本发明首先统计各个对比方法达到BOCA在其第 30次、40次、50次、60次迭代所达到的加速比所花费的时间。然后,对于第30次、 40次、50次、60次迭代,如表1所示为BOCA相对其他编译器优化选项推荐方法在 GCC上的提升(%),如表2所示为BOCA相对其他编译器优化选项推荐方法在LLVM 上的提升(%)。表1、2中的每列展示BOCA在达到该迭代次数所对应的加速比时,花费时间相对于对比方法缩短的比例。
表1
表2
从表1、表2中可以看出,BOCA在所有情况下花费时间的提升效果从42.30%到78.04%不等,这证实了BOCA能够显著提高编译器优化选项推荐的效果。
再将本发明方法(BOCA)与其他贝叶斯优化方法,即TPE、ε-PAL和FLASH,进 行对比。在上面的两张表中,在所有情况中,BOCA所花费的时间相对于TPE的平均提 升比例从43.01%到71.06%不等。由于ε-PAL和FLASH在每次迭代中都需要枚举和预 测所有的优化序列,而在本发明的研究中,优化选项的数量很多,因此这两种贝叶斯优 化方法不能在可接受的时间内得出结果。因此,本发明无法在全部优化选项上直接比较 BOCA与ε-PAL和FLASH,而是尝试通过使用一组数量较少的优化选项来进行对比试 验。这里本发明随机选择了20个优化选项分别用于GCC和LLVM编译器的优化选项 推荐,并随机选择了4个程序作为代表,来进行实验。
如图6所示,为本发明方法(BOCA)与ε-PAL和FLASH的对比实验结果示意图。 其中x轴表示BOCA对应迭代次数下的取样加速比,y轴表示达到对应加速比所花费的 时间。可以发现,尽管本发明使用了一组数量较少的优化选项,BOCA仍然比ε-PAL和 FLASH花费更少的时间来达到给定加速比。这里的实验结果证实BOCA确实比现有的 贝叶斯优化方法性能更好,能够更加有效地实现编译器优化选项推荐。