AI学习者 · 2 天前

使用机器学习与深度学习技术的编译器优化调研

❝ 优化编译器是一项困难且耗时的任务,尤其是手工完成时。据了解,编译器负责翻译和优化,一个高效的编译器系统可以变得更加自动化和简单,正如最近使用深度学习和机器学习方法的研究所证明的那样。大多数机器学习和深度学习方法处理模型训练、预测、优化和特征选择。在这种情况下,选择最佳特征对于使用深度学习和机器学习技术提高优化质量是必要的

本研究审查了各种方法,这些方法可能被用来改进和提炼选定的启发式方法的质量以及机器学习和深度学习模型的整体质量,以提高编译器的效率。这些方法涵盖了阶段排序问题、迭代程序评估的数量以及获得最佳预测所需的时间等多个主题。

-标题:ASurveyofOptimizedCompilerUsingAdvancedMachinelearningandDeepLearningTechniques -组织:Dept.ofCSE(AI&ML)CMREngineeringCollege、Dept.ofETCBhilaiInstituteofTechnology -关键词:Phase-ordering、machinelearning-ML、optimizedcompiler、deeplearning

1.引言

❝ 如今,深度学习和机器学习方法被应用于编译器系统的优化,因为在这种情况下模型不需要进行任何手工操作。在过去的十年中,优化编译器引起了很大的兴趣。一个高效的编译器,利用深度学习和机器学习进行软件开发和性能优化是一个重大进步

编译器历来将高级代码翻译成机器代码,以最大化内存利用率和执行速度。然而,由于现代硬件设计和应用的复杂性,为了达到最佳性能,需要更先进的方法。性能调优和代码优化是编译的两个常见挑战。机器学习在编译器优化中的功能包括代码生成、预会议预测和自动调优,而深度学习模型的功能包括模式识别、基于分析的优化和特定硬件的优化。相同的繁琐和复杂的过程必须重复,还需要考虑体系结构。因此,使用选定的机器学习和深度学习进行自动编译器优化是最佳和替代方法。

我将在这里介绍几种机器学习和深度学习优化技术。通过产生更有效的机器代码,编译器系统优化可以提高软件应用的性能

这种效率可以改善硬件资源消耗,降低内存使用,并简化计算时间。一个优化的编译器系统支持高级语言特性,使程序员能够编写更有效的代码而不影响速度。

2.文献综述

Compileroptimizationpredictionwithnewself-improvedoptimizationmodel

-https://thesai.org/Downloads/...

Shewale 等人指出,由于工作量过于繁重,使用传统的手工分析方法,对于一个不可预测的程序在任意架构上,几乎不可能找到最优的、甚至是好的优化组合。这促使了专门应用了机器学习和深度学习方法的优化模型的开发。

Identifyingcompilerandoptimizationoptionsfrombinarycodeusingdeeplearningapproaches

-https://sel.ist.osaka-u.ac.jp...

Pizzolotto 等人描述了两种深度学习网络,一种基于 CNN(卷积神经网络)模型,另一种基于 LSTM(长短期记忆网络)模型。

我们评估了 Shem 和其他方法,发现它们在编译器识别和优化方面都能达到 98%以上的准确率,当数据进一步增加时,准确率甚至可以超过 99%。此外,我们还表明,即使输入序列只有 125 字节(大约 30 条指令),系统的准确率仍然大约为 95%。因此,我们得出结论,这两种网络在处理由原始字节组成的输入方面具有相同的效率。

Himalia:Recoveringcompileroptimizationlevelsfrombinariesbydeeplearning

ChenY 等人指出,编译器优化级别对于二进制分析至关重要,但商业现成(COTS)二进制文件中并不包含这些信息。

本文介绍了一个名为 HIMALIA 的端到端系统,它能够从反汇编的二进制代码中恢复编译器优化级别,而无需了解目标指令集的语义

为此,我们将问题表述为一个两层循环神经网络的训练任务,使用深度学习技术。HIMALIA 进一步通过两种额外的技术进行了增强:指令嵌入和一种新的函数表示方法。该数据集由 GCC 编译器生成,包含来自 5828 个二进制文件的 378,695 个不同的函数。因此,系统的准确率大约为 89%。

Lostintranslation:Exposinghiddencompileroptimizationopportunities

Georgiou 等人认为,一种方法应具备四个特性,以便优化器能够作为编译器日常开发周期的一部分进行调整。这四个特性分别是:移动性、快速性、适应性和感知性

传统的自动调优方法(如迭代编译和 MLB 方法)主要是为了在特定应用中提供比标准优化级别更好的优化,而不是帮助编译器工程师调整标准优化级别。这些方法通常需要运行数千次迭代,或者在每次编译器发布时都需要一个新的、成本高昂的训练阶段。

此外,它们无法揭示优化趋势及其潜在原因,除了少数例外情况,如耦合消除策略。因此,它们无法展示所有四个必要的特性,因此编译器工程师只能有限地使用它们。

Machinelearningincompileroptimization

WangZ 等人介绍了基于机器学习的编译,并讨论了其在识别编译器优化的证据基础策略方面的有效性。这是在编译器自动化五十年后的新阶段。

在过去的十年左右,基于机器学习的编译一直是编译器研究的热门话题,吸引了大量的学术关注和出版物。尽管可以提供所有研究领域的一个全面目录和一个易于获取的主要研究领域及其未来前景的概述,但机器学习并不是万能的。它只能学习我们提供给它的信息。与一些人的担忧相反,它允许更多的创新,并开辟了新的研究领域,而不是降低编译器编写者的功能。

Anempiricalstudyoftheeffectofsource-levellooptransformationsoncompilerstability

Gong 和同事们进行了第一次对编译器稳定性的定量分析,这解释了由语义相似但结构不同的源代码生成的目标代码性能变化的很大一部分。

本文研究了使用 GCC、ICC 和 Clang 编译循环嵌套的 C 语言编译过程的稳定性。我们还计算了这些过程的性能提升空间。通过分析从库和基准测试中提取的大量循环嵌套及其语义等价的变异(通过执行一系列语义保持修改生成),我们能够确定编译器的稳定性和性能提升空间。

PerformancepotentialofoptimizationphaseselectionduringdynamicJITcompilation

MichaelR.Jantz 等人定义了阶段选择,即为特定的函数或程序调整相关的编译器优化阶段集合,以提高代码生成器的性能。

最近,研究人员设计了基于特征向量的启发式方法,在在线 JIT 编译期间进行阶段选择。尽管这些算法加快了程序启动时间,但稳态性能并没有比默认使用的固定单序列基线有所改善。遗憾的是,目前尚不清楚是当前的在线阶段选择启发式方法导致了稳态性能没有提高,还是阶段选择在在线 JIT 环境中实际上提供的加速很少或没有。

本研究旨在回答这些问题,同时分析与阶段选择相关的优化行为,并评估和改进当前启发式解决方案的有效性。

C-GOOD:C-codegenerationframeworkforoptimizedon-devicedeeplearning

DuseokKang 等人开发了一个独特的 DNN(深度神经网络)框架 C-GOOD,生成可以在任何嵌入式平台上执行的 C 代码

由于该框架具有优化意识,用户可以选择对特定网络应用哪些优化策略。然后,用户可以借助自动生成的优化 C 代码来探索网络选择和软件优化的设计空间。除了系统化应用优化技术外,还提供了一种软件优化方法。该过程包括流水线操作、逐层 Tucker 分解、逐层量化、将批量归一化合并到权重中以及减小输入大小。

这些技术已在三个不同的硬件平台上进行了评估:三星可重构处理器、OdroidXU4 和 JetsonTX2。实验结果表明,C-GOOD 生成的基线 C 代码在每秒帧数性能方面优于 Darknet 框架。此外,与基线未优化代码相比,优化过程在特定硬件平台上将速度提高了 2.2 到 25.83 倍。

Mitigatingthecompileroptimizationphase-orderingproblemusingmachinelearning

SameerKulkarni 等人证明,使用 JikesRVMJIT 编译器时,特定于方法的优化顺序可以带来显著的速度提升。

此外,研究表明,可以使用神经进化技术自动生成一个神经网络,该网络在性能上比精心设计的优化方案有显著提升。

我们展示了总执行时间最多可提高 20%。这表明机器学习模型可以成功应用于确定编译器中的方法优化顺序。

当前的研究令人鼓舞,因为它为多年来研究的阶段顺序问题提供了新的视角。这种方法的改进潜力尚未完全实现;需要进一步的工作来改进机器学习算法,并带来更大的好处。

Towardsintelligentcompileroptimization

KovacM 等人指出,大规模并行和异构编译是未来的方向,边缘和集群计算中都有专门的加速器设备和指令集。

然而,软件开发最终将成为瓶颈。为了充分利用硬件的奇迹,软件需要找到解决各种问题的方法,包括异构设备映射、能力发现、并行化、适应新的指令集架构等。人类开发人员手动控制这种系统复杂性将变得困难。有必要将这些问题分配给知识渊博的编译器。我们强调了使用各种技术(如强化学习、多面体优化和深度学习)的最新发现。

Compileroptimizationpredictionwithnewself-improvedoptimizationmodel

ShewaleC 等人指出,执行优化技术的顺序可以极大地影响实现的性能水平

因此,我们设计了一个新的编译器优化预测框架我们的模型包括三个关键操作步骤:特征提取、模型利用和模型训练

模型训练阶段包括候选样本集的生成及其初始化。随后,输入被导向特征提取阶段,在此阶段获得增强的熵、动态和静态特征。在特征利用阶段,使用改进的饥饿游戏搜索算法来识别最有效的特征,然后对其进行优化。

利用这些选定的特征,我们在本研究中应用了卷积神经网络来预测编译器优化。结果表明,我们的新编译器优化模型优于以前的技术

Baco:AfastandportableBayesiancompileroptimizationframework

Erik 和其他同事介绍了贝叶斯编译器优化框架(BaCO),这是一个用于现代调度语言的即插即用自动调度解决方案,旨在与各种硬件后端一起使用

现代自动调优器需要比 BaCO 多 2.7 到 10 倍的时间才能达到专家级性能。编译器用户可以通过将 BaCO 分配给调度的困难和耗时的工作来节省时间,因为策略和机制是相互分离的。即使我们证明 BaCO 可以在不到一分钟的时间内提供高性能解决方案,软件开发仍然认为这个时间过长。

能够在开发过程中使用自动调优器是自动调度的圣杯;理想情况下,这允许用户在每次编译代码时执行自动调优。这样,用户可以在程序生命周期的各个阶段定期监控功能和非功能属性。提高自动调优器的效率实际上可以实现一种新的开发循环中的自动调优范式,这是当前自动调优技术所无法实现的。

Compileroptimizationparameterselectionmethodbasedonensemblelearning

HuiLiu 和同事们介绍了 ELOPS,这是一种编译器优化参数选择技术,可以为各种应用独立提供优化设置。该模型以程序特征作为输入,并输出接近理想的编译器优化参数。

在 ELOPS 模型的训练数据生成阶段,提出了一种增强的粒子群优化(PSO)方法,用于检查编译器优化参数空间,以便更有效地解决有限的多目标优化问题。在两个不同的平台上,与 GCC 的标准优化级别 O3 相比,我们分别看到了 1.39 倍和 1.36 倍的速度提升。

改进的 PSO 在模型构建阶段系统地检查编译器优化空间,以获取更准确的样本数据。我们提出了 FCR,一种结合静态和动态元素来描述程序特征的新方法。通过这种新的程序特征表示技术,我们可以为构建编译器优化预测模型提供更多的样本参数,并识别编译器的理想参数。我们使用堆叠集成学习基于这些数据创建了一个统计模型,并将其集成到编译器框架中。然后,我们使用该功能来选择编译过程和优化设置。ELOPS 模型现在可以自动从新的目标程序中提取特征,并利用其积累的信息来确定最佳的编译优化参数。

与编译器的默认标准优化级别-O3 相比,ELOPS 方法在两个不同的平台上分别以程序执行时间速度提升了 1.29 倍和 1.26 倍。

AHybridApproachforHigh-PerformanceDeepLearningCompilation

Yang,Y 和其他同事在本研究中,对来自 21 个出版物(包括会议论文集、研讨会和期刊)的 142 项关于深度学习用于软件工程的主要工作进行了系统文献综述(SLR)。

我们开发了四个研究主题,以彻底检查深度学习模型适用于软件工程活动的不同方面。我们的 SLR 显示出对深度学习用于软件工程的研究兴趣显著增加。

经过深入研究和分析,主要研究中使用了三种深度学习架构,共 30 种不同的深度神经网络(DNN);与其他 DNN 相比,RNN、CNN 和 FNN 是最常用的三种神经网络。

此外,我们还检查了三种不同的模型选择程序的流行度,并对其进行了概括。在 RQ3 中,我们对数据收集、数据处理、模型优化和模型评估的基本方法进行了全面概述,以便读者能够充分理解 DNN 的训练和测试过程。在 RQ4 中,我们根据特定的软件工程任务对主要研究进行了分类,检查了不同软件工程活动中应用的深度学习方法的分布,并对每项研究进行了简洁的概述。

我们发现,深度学习方法被用于涵盖 23 个软件工程主题中的六个软件工程活动。最后,我们确定了一些当前问题,这些问题需要在深度学习在软件工程中的应用研究中进一步关注。

Computationalgeneticepidemiology:LeveragingHPCforlargescaleAImodelsbasedonCyberSecurity

LiJ 等人提供了一种DNN 图编译器,这是一种通过结合专家调整内核和编译器优化的方法生成高性能代码的张量编译器。

OneDNN 图编译器解决了深度学习特定的优化问题,如激进的图操作融合、低精度计算、内存布局和静态张量形状优化、常量权重优化以及内存缓冲区重用。根据实验结果,对于英特尔 ® 至强 ® 可扩展处理器上的性能关键的 DNN 计算图和端到端模型,与当前的张量编译器和原始库相比,OneDNN 图编译器显示出显著的性能提升

3.讨论

❝ 正如上述调查中提到的,使用机器学习技术进行编译器优化时遇到的一个最常见问题是阶段顺序问题(phaseorderingproblem)。为了获得最佳的模型性能和泛化能力,必须仔细且经验性地考虑数据预处理和转换过程的顺序,这在机器学习阶段顺序问题中得到了体现。有效地导航复杂的转换顺序环境需要结合自动化搜索技术、专业知识和经验判断。许多研究这一问题的研究人员的目标是减少阶段顺序问题对编译器效率和性能的负面影响。

使用人工神经网络的解决问题方法表明,程序配置文件可以用于代码优化。使用强化学习(一种通过奖励和惩罚机制来训练模型的方法)的算法比它表现更好,性能提升了 16%。

一种称为循环展开(loopunrolling)的编译器优化方法旨在减少循环开销并提高程序性能。

-传统上,这是通过手动增加循环体的大小(展开)来实现的,以暴露更多的指令级并行性并减少执行的循环控制指令的数量。 -将深度学习(DL)和机器学习(ML)与循环展开优化相结合,为潜在地进一步提高编译器速度提供了一种新途径。

循环流水线(looppipelining)通常与这个问题结合在一起。在我们的调查过程中,我们注意到许多学者在与当前的循环展开技术相比的情况下进行了评估。他们使用了包括决策树算法和提升在内的多种机器学习方法。尽管机器学习算法速度很快,但它还不足以快速找到编译器优化的最佳启发式方法

解决这个问题的两种流行方法是使用主动学习和缩小迭代搜索的目标。

-虽然缩小搜索似乎是一个理想的行动方案,但重要的是要记住, -主动学习通过减少计算时间和所需的训练样本数量,使启发式方法更容易使用。

自动调优系统通过使用贝叶斯网络(一种基于概率的图形模型,用于表示变量之间的条件依赖关系)来提供特定于应用的优化,这比随机迭代编译技术的缺点要少,并且保证结果比随机迭代编译快三倍。这项技术的一个可能的未来应用是解决阶段顺序问题

4.结论

❝ 基于优化编译器技术的研究分析表明,机器学习和深度学习现在可以快速有效地解决这一领域的问题。我们的调查结果使我们得出结论,由于在编译器优化中应用了深度学习和机器学习方法,编译器性能显著提高。为了实现编译器优化,已经使用了许多尖端方法,包括传统和新开发的方法,如人工神经网络(ANN)、监督学习和无监督学习以及其他先进技术。

解决编译器问题首先需要确定它所面临的问题大多数时候,研究人员结合了多种方法以获得最佳结果。本调查研究旨在收集使用机器学习和深度学习技术进行编译器优化的研究结果。进一步研究这些复杂和尖端技术,以及它们的组合,可能是未来工作的一个方向,以实现超越当前最佳性能的编译器优化。我们的目的是帮助研究人员将他们提出的方法与我们在研究中已经审查过的方法进行比较。

END

作者:ETC
来源:卡巴拉花园

推荐阅读

欢迎大家点赞留言,更多 Arm 技术文章动态请关注极术社区嵌入式AI专栏欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。

推荐阅读
关注数
18942
内容数
1447
嵌入式端AI,包括AI算法在推理框架Tengine,MNN,NCNN,PaddlePaddle及相关芯片上的实现。欢迎加入微信交流群,微信号:aijishu20(备注:嵌入式)
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息