主要

人类的直觉和技术改进算法是至关重要的。然而,许多算法已达到一个阶段,人类专家没能进一步优化它们,导致日益增长的计算瓶颈。工作程序合成古典文学,跨越几十年,旨在生成正确的程序和/或优化程序使用代理延迟。这些包括点数的搜索技术4,5,6,7和随机搜索5,6,8,9,10以及最近的趋势在程序中使用深度学习的合成生成正确的程序11,12,13,14,15,16。使用深度强化学习(DRL),我们可以进一步通过生成正确和高性能算法通过优化实际测量延迟在CPU指令级别,通过更有效地搜索和考虑正确和快速的空间项目相比,以前的工作。

计算机科学的基本问题之一,是如何排序序列17,18,19,20.。这是在小学教全世界计算机科学课程21,22和无所不在地使用广泛的应用程序23,24,25。几十年的计算机科学研究都集中在发现和优化排序算法26,27,28。切实可行的解决方案的一个关键组件是一个小短序列的元素排序;这个算法被称为大数组排序时反复使用“分而治之”的方法29日。在这项工作中,我们专注于两种类型的小排序算法:(1)固定排序和(2)变量排序。一个固定长度的固定排序算法排序序列(例如,类3只能3)排序序列的长度,而变量排序算法可以排序的序列不同大小(例如,变量排序5可以排序序列从一到五元素)。

我们制定的问题,发现新的、高效的排序算法作为一种我们称之为AssemblyGame单人游戏。在这个游戏中,玩家选择一系列的低级CPU指令,我们称为汇编指令30.结合,产生一个新的、高效的排序算法。这是具有挑战性的玩家需要考虑汇编指令的组合空间产生一种算法既正确又快。的硬度AssemblyGame不仅来自搜索空间的大小,这是类似于极具挑战性游戏,比如国际象棋(10120年游戏)31日去(10700年游戏)32,但也从奖励函数的性质。一条不正确的指令在AssemblyGame可能使整个算法,使勘探在这个空间的游戏非常具有挑战性。

玩游戏时,我们引入AlphaDev,学习代理搜索训练是正确的和有效的算法。这个代理是由两个核心组件,即(1)学习算法和函数(2)表示。AlphaDev学习算法可以将DRL以及随机搜索优化算法AssemblyGame玩。主要学习算法在AlphaDev AlphaZero的延伸33著名DRL算法,神经网络的训练指导解决AssemblyGame搜索。表示函数是可互换的,捕获的底层结构组装程序。基于变压器主AlphaDev表示34

使用AlphaDev,我们发现了固定和可变从头算法,都是新的和更有效的比人类先进的基准。固定排序解决方案排序3,4,5发现AlphaDev已经集成到标准排序函数在LLVM标准c++库3。使用这个库几百万用户包括大学和众多国际公司35。此外,我们分析新算法发现,比较AlphaDev随机搜索优化方法,并应用AlphaDev进一步域展示该方法的通用性。

将算法表示为低级的CPU指令

当编译算法机器代码从高级语言(如c++(例如,排序函数在无花果。1),该算法首先编译成汇编(图。1 b)。汇编程序然后将汇编程序转换成可执行的机器代码。在这项工作中,我们在汇编级优化算法30.。在一个典型的汇编程序,从内存的值复制到寄存器,寄存器之间操纵,然后写回内存。汇编指令的支持取决于处理器体系结构。这项工作的目的,我们关注的一个子集x86处理器体系结构支持的汇编指令使用AT&T语法36。每条指令的操作码的格式操作数一个,操作数B。一个指令是mov的例子 ,它被定义为将一个值从源(a) (B)目的地。进一步指令定义等比较(cmp ),有条件的(cmovX移动 )和(jX跳扩展数据表中可以找到) 1。在图中的例子。1 b,% eax, % ecx、% edx % edi对应于四种不同的注册地点和(%肢体重复性劳损症),4 (% rsi)对应于两个不同的内存位置。符号常量值2美元是一个占位符,它对应于向量的长度。我们使用术语汇编程序和组装算法互换工作。这是因为AlphaDev从头构建一个汇编程序,最初从一个无序的指令集,每次它AssemblyGame,定义一个新的、高效的算法。

图1:c++和组装项目之间的关系。
图1

一个,一个变量的c++实现2函数排序任何输入序列的两个元素。bc++实现一个编译这个相当于低级大会表示。

DRL发现更快的算法

在本节中,我们制定优化算法在CPU指令级的强化学习(RL)的问题37,环境建模作为一个单机游戏,我们称之为AssemblyGame。每个州在这个游戏中被定义为一个向量年代t=Pt,Zt在哪里Pt表示该算法生成的游戏,到目前为止Zt代表内存和寄存器的状态执行当前算法后一组预定义的输入。见图。2在步伐t,玩家获得的当前状态年代t并执行一个动作一个t。这包括附加法律汇编指令(例如,mov < a、B >)当前算法生成的迄今为止。一个奖励rt收到,包括衡量算法的正确性和延迟。算法的正确性(图。2 b)需要输入一组N测试序列到当前的算法Pt生成N输出。这些输出与预期输出和正确性的奖励rt计算。延迟奖励可以通过(1)惩罚生成代理提高算法的长度(长度和延时是高度相关时),我们称之为算法长度奖励,或(2)测量的实际延时算法。游戏为有限数量的执行步骤,之后游戏终止。赢得比赛对应生成一个正确的,低延迟算法使用汇编指令。失去了游戏对应生成一个不正确的算法或正确但低效的算法。

图2:AssemblyGame计算和算法的正确性。
图2

一个,AssemblyGame是由AlphaDev接收作为输入当前装配算法生成的迄今为止年代t和戏剧游戏通过选择执行一个动作。在这个例子中,行动是mov <注册0、内存1>汇编指令,附加到当前的算法。代理收到奖励,是一个函数的算法的正确性,讨论了b,以及算法的延迟。游戏以玩家发现低延迟,正确的算法。b,程序正确性和延迟计算用于计算奖励rt。在这个例子中,测试序列算法的输入;例如,在分类三个元素的情况下,测试输入包含所有未排序的序列长度为3的元素。对于每一个序列,该算法输出比预期的输出(在排序的情况下,预期的输出排序的元素)。在这个例子中,输出\ ({\ bf {D}} {\ boldsymbol {{\ '}}} \)预期的输出不匹配\ ({\ bf {B}} {\ boldsymbol {{\ '}}} \)因此该算法不正确的。

我们将饰演AlphaDev这个单人游戏的代理。代理的主要学习算法是AlphaZero代理的延伸32和导游蒙特卡洛树搜索(mct)使用深层神经网络规划过程33,38。神经网络的输入年代t和输出是一个政策和价值的预测。政策的预测是一个分布在行动和价值函数是一个预测的累积回报R代理人应将从当前状态年代t。在比赛中,代理接收作为输入的当前状态年代t。代理然后执行一个特定程序和使用此选择下一个行动。然后使用生成的游戏更新网络的参数,启用代理去学习。

关键是AlphaDev表示39,40能够代表复杂的算法结构有效地探索太空的指令。为了达到这个目标,我们引入AlphaDev表示网络(扩展数据图。1)。这个网络包括两个组成部分,即(1)变压器编码器的网络,为代理商提供了一种表示算法结构,和(2)的CPU状态编码器网络,帮助代理预测算法如何影响的动态内存和寄存器。CPU状态编码器网络由一个多层感知器接收作为输入每个寄存器和内存位置的状态对于一个给定的输入。这些网络的每个输出映射进行组合收益率AlphaDev状态表示。

变压器编码器

变形金刚是自然文本编码器和最近与语言模型有很大的成功14,34,41。因此,这让我们适应汇编指令的标准变压器模型。我们开发和整合变压器编码器,适应MultiQuery变压器的编码器42,进入AlphaDev表示网络代表汇编指令。对应每个汇编指令的操作码和操作数转换为一个炎热的编码和连接到表单的原始输入序列。这是美联储通过多层变压器编码器,它映射到相应的嵌入向量(见扩展数据图。1 b插图)。

延迟价值函数

延迟是一个重要的奖赏信号,用于指导代理发现高性能算法。为了更好地估计延迟,我们实现了一个双重价值函数设置,即AlphaDev有两个值函数头:一个预测算法正确性和第二个预测算法延迟。延迟的头直接用于预测给定的延迟程序通过使用程序的实际计算延迟期间作为AlphaDev蒙特卡罗目标训练。这种双头方法取得更好成果比香草、单头值函数设置优化时真正的延迟。

结果

发现快速排序算法

我们从头开始训练AlphaDev代理生成一系列固定的排序和变量排序算法是正确的,比人类先进的基准实现更低的延迟。

固定的排序算法

我们考虑三个基本算法:3、4和5。人类最先进的标准对这些算法是排序网络43生成效率,条件无枝的汇编代码。这意味着所有指令执行顺序,没有分支。提高这些算法是具有挑战性的,因为他们已经高度优化。见表1,AlphaDev能够找到比人类的标准排序算法与更少的指令3和5和匹配的最先进的性能4。这些短的算法确实导致更低的延迟的长度和延时算法相关条件无枝的情况;请参阅附录B在补充信息为更多的细节。我们还探讨了扩展AlphaDev略大类型使用一个变体。我们设法拯救三个指令6,两条指令在7和一条指令在8,它提供了一个有前途的未来工作的基础。请参阅附录C补充信息概述的方法。

表1 AlphaDev长度和延时性能优化算法

变量排序算法

我们考虑三个变量排序算法:VarSort3 VarSort4 VarSort5。人类的基准在每种情况下的定义是一个算法,对于一个给定的输入长度,调用相应的排序网络。在这种情况下,分支是必需的,这大大增加了问题的复杂性,代理需要(1)确定需要多少subalgorithms构造和(2)构建的主体主要并行算法。代理可能还需要从其他subalgorithms subalgorithms打电话。在这种情况下,优化导致长度显著缩短算法相比,人类的标准见表1。然而,由于引入了复杂性分支,延迟和长度并不总是相关的;看到补充信息为更多的细节。因此,我们实现了一个程序措施的实际延时程序通过第五百分位的延迟测量在100个不同的机器上,计算置信区间44和优化这个指标。看到方法为基准设置。当优化延迟,代理大幅提高,人类的基准在每种情况下见表1 b

新算法的发现

解决方案由AlphaDev包括新的和令人兴奋的发现算法的发现导致更有效的性能。在固定设置,我们发现AlphaDev发现了两个有趣的指令序列,当网络应用于排序算法,该算法减少每次一个汇编指令。我们将每一个指令序列(1)AlphaDev互换移动和(2)AlphaDev分别复制移动。

AlphaDev交换移动

3提出了一种最优排序网络为三个元素方法分类的概述网络)。我们将解释如何AlphaDev提高了圈网段。有许多变体中发现这种结构的排序不同大小的网络,和相同的论点适用于在每种情况下。圈出的部分网络(最后两个比较器)可以被视为一个需要输入序列的指令序列A, B, C和转换每个输入如表所示2(左)。然而,电线上比较器B和C之前这个操作符,因此输入序列B≤C的保证。这意味着它足以计算最小(A, B)作为第一个输出而不是分钟(A, B, C)如表所示2(右)。伪代码图之间的区别。3 b, c演示了如何AlphaDev互换保存一个指令每次移动应用。

图3:排序由AlphaDev发现网络和算法改进。
图3

一个,一个最优的经典排序网络三个输入框。比较器已经提高了AlphaDev盘旋。看到AlphaDev移动换成更多的细节。b,c,大会伪代码在应用AlphaDev之前交换移动(b)和应用AlphaDev互换后移动(c),导致的一个指令。d,一个最优的经典排序网络比较器配置,AlphaDev已得到改进。看到AlphaDev复制移动更多细节。e,f,大会伪代码在应用AlphaDev之前复制移动(e移动应用AlphaDev副本(后),f),导致的一个指令。

表2分析AlphaDev交换和复制

AlphaDev复制移动

3 d提供了一个排序网络配置,组成的三个比较器,应用在四线。这个配置在一个8排序网络和对应于经营者采取四个输入A, B, C, D,并将它们转换为四个输出见表2 b(左边)。可以表明,作为8,流入的输入操作符满足下列不等式:rm \ ({\ D{}} \通用电气\ min ({\ rm{一}},{\ rm {C}}) \)。这意味着,操作员可以通过应用改进AlphaDev此举被定义在表副本2 b(右边),导致一条指令不到原来的运营商。代码区别原始运营商和移动应用AlphaDev副本后代码可视化在无花果。3 e, f,分别。

新变量的排序算法

VarSort4算法发现AlphaDev尤其有趣。人类的流程图基准算法和AlphaDev图中可以看到。4 a、b,分别。人类的基准算法决定了输入向量的长度,然后调用相应的排序网络对元素进行排序。AlphaDev解决方案有一个完全不同的方法见图。4 b。如果输入向量的长度是严格大于2,然后3立即被称为,导致前三个元素排序。如果矢量大于三个元素,然后一个简化的那种类型4算法称为剩余的未分类的输入向量中的元素。正是这种简化程序的一部分,收益率显著提升算法的长度和延迟。

图4:从根本上不同的算法由AlphaDev发现的。
图4

一个一种变量的流程图4 (VarSort4)人类基准算法。在该算法中,一个未排序的序列号码输入到算法。如果序列长度是四个,三个或两个数字,那么相应的4排序,排序3或排序2的网络称为排序结果序列。然后返回结果和输出的功能。b,VarSort4算法由AlphaDev发现的。这个算法也接收序列的长度四个,三个或两个数字作为输入。在这种情况下,如果长度是两个,那么它调用2排序网络并返回。如果长度为3,那么它调用排序3排序前三个数字并返回。然而,如果长度大于3,然后它调用3,紧随其后的是一种简化的4例程,剩余的未分类的数量。这部分的程序,节省大量的延迟。

随机搜索优化方法

重要的是要理解RL相比其他方法的优势和局限性对程序优化。因此,我们实现了一个先进的随机superoptimization方法8,它适应了设置和使用它作为AlphaDev的学习算法。我们称这种变体为AlphaDev-S(见方法更多的细节)。我们运行这个算法至少有相同数量的资源和所AlphaDev。AlphaDev-S需要高昂的时间为延时优化直接延迟后需要计算每一个突变。因此,AlphaDev-S优化延迟代理,即长度和算法,然后,在培训结束时,我们搜索所有正确的程序由AlphaDev-S和基准每一个找到最低的延迟解决方案。一般来说,我们发现AlphaDev始终优于AlphaDev-S当从头学习没有以前的知识。此外,随着项目的大小增加,AlphaDev探索数量级减少项目(1200万项目在最坏的情况下)相比AlphaDev-S(31万亿项目在最坏的情况下)。这可能是因为AlphaDev能够更好地探索空间广度优先算法相比的随机搜索过程更容易卡到当地最适条件;看到方法概述的探索假说。此外,AlphaDev从来没有评估延迟在搜索,因为它使用的延迟值函数的预测,因此,只需要计算实际测量延迟生成程序的不到0.002%。当将以前的知识纳入AlphaDev-S,如温暖的开始学习算法的算法解决方案,AlphaDev-S是计算效率为3,4,5(无枝的组装算法),也会产生竞争的低延迟算法AlphaDev在每种情况下。然而,对于需要分支(if - else语句)的算法,算法的长度和延迟是不相关的,比AlphaDev-S AlphaDev发现更低的延迟的解决方案,即使温暖从这个算法,算法的解决方案。看到方法这些算法的深入分析。

泛化到额外的域

测试AlphaDev的普遍性,我们训练代理一组额外的域。这些包括协议缓冲区反序列化子程序称为VarInt,下面,和竞争的编码问题(请参阅附录D补充信息更多的细节)。竞争编码域表报告延迟性能1 b

是谷歌的开源协议缓冲区数据格式用于序列化结构化数据45。这种格式是常用的性能或网络负载的情况下的主要问题。VarInt算法46是一个关键的组件在序列化和反序列化过程。我们训练AlphaDev代理变量排序优化VarInt反序列化功能正确性和测量延迟。正确性,我们奖励反序列化每个输入正确的代理。我们使用一组80输入和相应的输出,覆盖常见protobuf用例。AlphaDev学习一个优化VarInt反序列化功能和管理人类的表现明显优于基准单值输入。我们的代理发现一个模式解决方案,既缩短(表1)和三倍的速度比人类的基准(表1 b)。在这一过程中,代理也发现了一种新的VarInt分配移动AlphaDev学会两个操作组合到一个单指令导致延迟储蓄。请参阅附录D.1在补充信息整整这一举动的概述。这是一个强烈的迹象表明AlphaDev能够推广优化非平凡的,现实世界的算法。

Libc + +补丁

3,4,5排序算法在LLVM libc + +标准分类库被称为大很多次排序算法,因此图书馆的基本组件。我们逆向工程低级组装排序算法由AlphaDev发现3,4和5 C + +和发现,我们的类实现了改进的序列长度的5 70%,大约1.7%超过250000元素的序列。这些改进是uint32, uint64 ARMv8浮点数据类型,Skylake英特尔和AMD禅宗2 CPU架构;请参阅附录E中补充信息完整的性能表。性能上的改进,都是由于无枝的条件生成的装配AlphaDev以及新AlphaDev交换行动。长度为5,我们使用43算法AlphaDev发现的,因为它导致更有效的c++实现。在发送这些算法进行评审和正式被纳入libc + +标准分类库3。它是第一个在十多年来改变这些子例程。这也是第一次在图书馆这种任何组件已经取代了一个算法,自动发现使用强化学习。我们估计这些例程被称为每天数以万亿计的时间1,35,47

讨论

从头AlphaDev发现新的、先进的排序算法,已被纳入LLVM c++库,使用的数以百万计的世界各地的开发人员和应用程序23,24,25。AlphaDev和随机搜索都是强大的算法。一个有趣的未来的研究方向是研究这些算法结合在一起实现这两种方法的优势互补。

重要的是要注意,AlphaDev可以,理论上,概括函数不需要详尽的验证的测试用例。例如,哈希函数48以及加密散列函数49定义功能正确性的哈希碰撞。因此,在这种情况下,AlphaDev可以优化减少碰撞以及延迟。AlphaDev还可以,理论上,优化复杂逻辑组件内的身体大,令人印象深刻的功能。我们希望AlphaDev可以提供有趣的见解和激发新方法在人工智能和项目综合社区。

方法

背景

AlphaZero

AlphaZero33是一个RL算法,利用其特定政策改进算子。它包括(1)一个表示网络f代表输出一个潜在的表示ht国家的年代t;和(2)一个预测网络fpred预测预期回报(值)\({\帽子{v}} _ {t} \)和政策(即在行为空间分布){\ \({\帽子π}}_ {t} \)从一个给定的潜伏状态。该算法使用真正的力学和奖励计划。MuZero38是一种基于模型的变体的AlphaZero相同的表征和预测网络,但也学习的动力学模型和预测回报,它用途规划。具体地说,它学会了一个动态网络f直流发电机预测未来潜在的状态\ ({{\ bf{\文本{h}}}} _ {t} ^ {k + 1} \)和奖励\({\帽子{r}} _ {t} ^ {k + 1} \)造成的过渡。注意,下标t表示在现实环境和步伐上标k在模型中代表了步伐。

$ $ {{\ bf{\文本{h}}}} _ {t} = {f} ^{代表}({{\ bf{\文本{年代}}}}_ {t}) $ $
(1)
$ $ {{\ bf{\文本{h}}}} _ {t} ^ {k + 1} \,{\帽子{r}} _ {t} ^ {k + 1} = {f} ^{达因}({{\ bf{\文本{h}}}} _ {t} ^ {k}, {{\ bf{\文本{一}}}}_ {t} ^ {k}) $ $
(2)
$ ${\帽子{v}} _ {t} \,{\帽子{\π}}_ {t} = {f} ^ {pred} ({{\ bf{\文本{h}}}} _ {t}) $ $
(3)

到达一个新的国家,AlphaZero收益首先编码表示的国家变成一个潜在的表示网络。然后,真正的动力或动态网络(MuZero)以及预测网络fpred(ht)是用来模拟一些填写搜索树的轨迹,通过抽样状态转换。在每个节点,选择操作使用一个乐观策略称为预测树绑定上的信心32,为了平衡勘探(尝试新行为)和开发(发展进一步的子树的当前估计最好的行动)。这种策略开始按照预测的政策{\ \({\帽子π}}_ {t} \)紧密,逐步转向最大化预报值函数。最终,一个行动建议由根节点的概率抽样与特定期间访问数成正比。然后训练预测政策来匹配特定的访问统计政策,试图提炼搜索过程的政策,以便后续的迭代mct无视节点不会有前途。

排序网络

排序网络是非常高效的结构可以在现代CPU并行体系结构。因此他们往往为了实现更快的运行时性能,尤其是在小类,而流行和有效的基本情况插入排序等算法17,43,50。一个排序网络43包括两种类型的项目称为比较器(竖线)和电线(横线)(扩展数据图。2)。每个线从左到右值。当两线相交于一个比较器,两个电线上的值进行了比较。如果线底部的值小于面网的价值,然后导线之间的价值交换见扩展数据图。2 b。编程实现的排序网络由执行这些掉期特殊的双从输入序列的元素在一个特定的顺序。

行动修剪规则

我们裁剪操作空间通过删除一些程序不变性(例如,寄存器分配的顺序)和非法指令(例如,比较两个内存位置)。这有助于减少行动空间的大小,提高收敛速度。在我们的实验中,我们使用以下规则:

  1. (1)

    内存位置总是以递增的顺序读取。

  2. (2)

    寄存器分配增量秩序。

  3. (3)

    我们不能比较或有条件地搬到一个内存位置(非法)。

  4. (4)

    我们可以读和写每一个内存位置只有一次。

  5. (5)

    我们不能使用non-initialized寄存器(非法)。

  6. (6)

    不要连续执行指令进行比较。

训练

我们火车AlphaDev张量处理单元(TPU) v。3,总批处理大小为1024 / TPU的核心。我们使用最多16 TPU核100万次迭代和培训。在演员方面,游戏是在独立的TPU v。4,我们使用512的演员。在实践中,所有任务,培训需要,在最坏的情况下,2天收敛。

AlphaDev-S

重要的是要理解的优点和局限性RL相比其他可能的方法程序优化。因此,我们实现了一个先进的随机superoptimization方法8和把它融进AlphaDev学习算法来优化排序功能。我们称这个改编版本为AlphaDev-S。我们已经重新专门为排序优化领域。这包括实现算法运行与我们的装配环境,定义一个正确性和性能损失函数特定排序和运行广泛hyperparameter扫描识别最好的变体。函数用于AlphaDev-S成本c=正确性+α×性能,正确性对应计算不正确的输入序列元素的数量仍未排序的,长度奖励和性能对应算法α是一个体重交易两个成本函数。我们不能直接优化延迟,这大大减缓了学习算法学习不可行。应该注意的是,这个函数已经适应支持AlphaDev所使用的相同的汇编指令集以及删除相同的错误或违法行为。它还使用相同的程序正确性计算模块(图。2 b)计算的正确性。

AlphaDev-S然后执行的第一个提议一个转换程序存储在缓冲区(可能是空的或与一个已经初始化排序程序)。的正确性和性能术语然后使用程序正确性模块和算法计算长度,分别。如果成本是低于当前最好的成本,高概率的新计划被接受,否则将被拒绝。现在我们将讨论正确性成本函数和变换详细重量。

正确的成本

正确性成本函数,我们实现了三种类型的成本函数。第一个定义是正确放置物品的百分比:\ \(压裂{P P {C} _ {t}} {P} \)在哪里P是物品的总数和电脑吗t正确的放置物品在步伐t。第二个变体是方程的根。最终的成本函数根的区别\ \√{-{电脑}_ {t}} \)这就是产生最佳性能。

程序的转换

我们启用了几个程序转换如添加一个指令增加程序的大小(添加变换),交换两个指令(交换变换),随机改变一条指令的操作码(操作码变换),随机抽样选择指令的操作数(操作数转换)和随机样本一个操作码和相应的操作数(指令变换)。有可能影响这些转换的采样鼓励一些经常被抽样或多或少。我们为抽样权重优化变换通过运行一个广泛hyperparameter扫描。

调查研究AlphaDev变体

我们现在一组调查研究,有助于更好地理解DRL的优点和局限性和随机搜索学习算法用于AlphaDev。我们比较AlphaDev AlphaDev-S。我们实现了两种变体的AlphaDev-S:(1)冷启动(AlphaDev-S-CS)和(2)热启动(AlphaDev-S-WS)。AlphaDev-S-CS使用没有以前的信息,来生成一个项目从一个空的项目缓冲区。AlphaDev-S-WS缓冲温暖开始的正确排序程序(例如,最优排序网络汇编程序),编辑程序进一步优化它。我们比较AlphaDev的变异个体和变量排序算法设置。

因为AlphaDev总是从头学习没有以前的知识,直接比较是冷启动随机搜索版本:AlphaDev-S-CS。然而,随着初始算法程序有时可能是可用的,我们也比较AlphaDev温暖开始随机搜索版本:AlphaDev-S-WS。

应该注意的是,随机搜索变量不能直接优化延迟,这将使学习不可行,因为计算效率。因此,我们AlphaDev-S长度变量优化算法。培训结束时,我们将遍历生成的程序集AlphaDev-S跨不同长度和确定最低的项目延迟。

在每种情况下,随机搜索算法(AlphaDev-S)运行使用至少相同的计算资源和所AlphaDev。

固定的种类

我们首先检查固定的各种方法的性能排序算法。在这种情况下,所有算法的变体长度作为算法优化算法和延迟条件无枝的高度相关的设置(请参阅补充信息更多的细节)。

在冷启动设置,AlphaDev-S-CS无法找到最优项目在每种情况下的扩展数据表2。此外,AlphaDev-S-CS探索数量级比AlphaDev项目,扩展数据表所示2 b。在温暖的开始设置,AlphaDev-S温暖开始排序算法程序,并能够匹配的性能AlphaDev在每种情况下,扩展数据表所示2。它比AlphaDev计算效率更高,扩展数据表所示2摄氏度但探索数量级更多项目3和5,扩展数据表所示2 b。可以说,AlphaDev-S-WS具有实质性的优势在这个场景中,因为它提供一个初始的算法程序。我们将展示变量类型节,当算法变得更加复杂和分支介绍,温暖开始学习算法的算法程序是不够的,可以使它陷入非最优解决方案。

蛮力的方法

我们也使用了强力的方法证明不存在程序短于17日指令为3。我们必须列举大约1032项目,即使修剪启发式,花了超过3天来证明这一假设。4及以上这个方法是不可行的。

延迟基准测试套件

一个程序的长度是只代表一种算法的性能。当我们介绍分支结构,程序的长度和延迟是不相关的。因此,我们在实际机器上运行的程序和测量他们的延迟。微基准测试是非常具有挑战性的,鉴于许多噪声源,可能影响测量。尤其如此,当运行在机器那里可能会干扰其他进程共享。我们的方法是有一个单独的基准测试服务,复制在分开的机器上,这样我们就能很快在受控的环境中执行许多测量在不同条件下。系统的工作原理如下:

  1. (1)

    RL代理流程1000测量机使用复制服务。

  2. (2)

    为每一个测量,服务运行超过10000随机输入给定的排序算法(例如,对于那种3这是3×10000 = 30000随机整数)。

  3. (3)

    我们测量的时间使用CPU性能计数器(CPU_CLK_UNHALTED.CORE)。

然后我们以第五百分位为我们最后的测量,因为我们假设大多数噪声源是片面的(例如,缓存错过,优先购买权等等)。我们在训练过程测量跨十台机器的计算效率。培训之后,我们的基准AlphaDev对基线的解决方案的解决方案,和过程测量在100台机器更多的准确性和降噪。对于每个基准测试,我们使用传播变为免费计算置信区间双侧置信区间对分位数表格的方法44

变量类型

当优化直接延迟,AlphaDev优于AlphaDev-S-WS VarSort3, VarSort4和VarSort5扩展数据表中3。在每种情况下AlphaDev-S-CS未能找到一个解决方案。例VarSort4和VarSort5、程序长度和延迟(见不相关补充信息更多的细节)。这表明当程序长度不能用作性能,代理AlphaDev能够比AlphaDev-S找到更低的延迟的解决方案。这是即使在情况随机搜索温暖开始的算法程序。此外,AlphaDev收敛于最优解后探索最多12 m程序扩展数据表中看到3 b。这是数量级低于AlphaDev-S-CS AlphaDev-S-WS,分别在最坏的情况下(31万亿项目)。

探索假说

我们建议AlphaDev-S努力发现程序从头学习,被困在当地最佳状态当温暖的开始,因为它有限的勘探能力的随机搜索过程。扩展的数据图。3显示二维t随机邻居嵌入(t新力)预测51AlphaDev和AlphaDev-S组装算法发现VarSort5在各自的训练程序。用于投影的特性包括正确性、延迟、算法长度和直方图统计每算法使用的指令。扩展的数据图。3表明地区算法空间探索AlphaDev, AlphaDev-S-CS AlphaDev-S-WS,分别,而扩展数据图。3 b添加算法正确性上每个点的t新力投影的色彩显示每个发现算法的正确性,从错误的算法(紫色)纠正算法(黄色)。AlphaDev-S变异都涵盖了密集的圆形区域在他们最初的种子,这凸显了广度优先性质的随机搜索过程。这说明AlphaDev-S-CS无法浏览空间的不正确的算法正确合理的时间和发现算法当从头开始学习。类似的论点适用于AlphaDev-S-WS即,当从一个已经优化正确但是理想专家演示中,该算法偏向探索其附近和努力逃离这个局部极大值。相比之下,AlphaDev更加多样化的空间覆盖算法,为长期价值函数是一个指导信号发现新的和有趣的部分算法的空间。见扩展数据图。3 b,它能够逃避错误的算法的空间发现一个新的空间正确的算法,突出AlphaDev提供的勘探的优势。

相关工作

组合优化

有很多方法来优化装配程序,我们分为三组:列举的搜索、随机搜索和象征性5

首先,列举的搜索技术包括强力程序枚举4,5,6使用象征性的定理证明以及隐式枚举52,53。这些方法搜索程序的空间找到一个解决方案基于一组预定义的程序,启发式和/或成本函数。这些方法难以跨大区域的程序空间,尤其是在这个项目的规模和复杂性增加。

第二,随机搜索技术规避全面枚举依靠抽样马尔可夫链蒙特卡罗抽样等机制5,6,8,9。拉杰夫Alur et al。5定义一个正确规范,提供了一个逻辑公式,使用符号的理论背景。我们的目标是找到一个实现表达式,逻辑公式定义规范是有效的。这个想法是为了迭代添加测试用例,然后搜索,扩大程序解决给定的测试用例。他们优化的正确性问题书黑客的喜悦54。Phitchaya Mangpo Phothilimthana et al。6介绍镜头算法基于计数的运行,随机和象征性的并行搜索,而依靠手工修剪规则。这个设置可以优化到21日指示,并不能优化延迟和分支的支持。另一个算法8基于马尔可夫链蒙特卡罗拒绝组装使用的采样和转换适用于项目损失函数是一个函数的正确性和性能。许多这些方法容易陷入局部最小值,也会挣扎,程序的大小和/或复杂性增加。此外,结合实际测量延迟到这些方法不可行或极其昂贵。

第三,象征性的搜索方法也可以实现优化组装程序。这些包括坐在解决者55解决,SMT5,6和混合整数规划(MIPs)56,57。然而,这些方法扩展问题。例如,经典的解决需要一个问题转化为一定的规范形式。它通常需要一个专家表示,解决者和大量的时间找到一个高效的配方。此外,对于任何新修改的问题,这是重复。经典动力学也很难并行化,因此,它是具有挑战性的利用更多的硬件加速求解过程。另一个象征性的搜索算法是Cholorphyll10实现一个多阶段的方法。它首先需要作为输入的源程序分区注释指定代码和数据驻留的地方。然后,布局合成器地图程序片段到物理核心计算成本降到最低。然后分成每个核程序代码片段和程序编译成机器代码片段。在这一点上,一个superoptimizer优化每一个碎片。

SIMD优化

各种方法58,59,60也被应用于排序函数,单指令,多数据(SIMD)61年设置。这个设置可以并行指令执行,但不支持目前在LLVM等流行的库libc + + std::类库。一个例子是,从Gilles Barthe等。7优化程序,提出了一种方法通过自动vectorizing循环和SIMD指令。他们这样做通过引入一个框架,用于验证转换程序的正确性和执行基于搜索过程使用转换说。他们的框架可以发现SIMD循环结构的九个指令在0.12年代,也对应于一个最低2×加速。

RL合成方法程序

也有一些研究使用RL程序优化。凯文·埃利斯et al。62年学习策略和价值函数编写和评估代码,以及执行蒙特Carlo-style在推理搜索策略。这项工作需要pretraining步骤,旨在生成正确的程序,满足一个预定义的规范。该方法成功地应用于计算机辅助设计和字符串编辑程序。超音速63年使用一个RL meta-optimizer选择不同RL架构,使用Multi-Armed强盗策略搜索找到状态表示,奖励功能和RL算法,对当前任务是最优的。这需要许多RL的跟踪算法和架构,应用状态空间的一部分。相比之下,我们的方法只注重培训一个RL结构,利用其特定的搜索和强大的国家表示。Shypula et al。64年创建一个监督装配数据集和用它来训练一个Transformer模型映射实现优化代码,其次是RL阶段为提高解决方案的质量。我们的方法不需要监督数据集或两个独立的培训和整合阶段,并优化端到端使用RL和搜索而不是一切。陈等人。65年定义自己的领域特定语言和执行输入输出程序更好地使用合成中间程序表示指导合成的例行公事。他们表明,这与RL可以合并,使用的设置鲁迪Bunel et al。66年和提高生成函数的正确性。他们不这样做,然而,优化程序长度或延迟。

输入-输出示例程序合成

大量的工作地址从投入产出对学习项目的问题。一种方法学习的神经网络直接输入输出匹配11,13,67年,68年。这种方法很难融入现有的库和可以努力推广前所未有的投入,虽然已经有一些令人鼓舞的进展用图表示69年。另一种方法是在程序执行一个搜索空间,指导下学习模型12,70年,71年,72年。例如,陈等人。70年使用模型,预测下一个程序令牌部分程序和输入-输出的基础上对。这有一些相似处搜索是如何引导我们的方法:学习政策之前在AlphaZero模型预测下一个记号,学习的基础上,结合部分程序,程序对输入的影响。然而,我们感兴趣的是找到正确的和有效的程序,这是我们实现通过进一步学习值函数逼近的预期延迟部分程序,并使用AlphaZero将这个值函数在搜索过程。

深度学习的代码生成

还有几个深度学习方法使用大型语言模型来生成代码。这些方法都有不同的使用从transpilation,代码重构和解释代码15使用自然语言生成人类竞争代码描述14。特定的工作旨在生成正确的代码,但不关注生成低延迟的解决方案。

事程序优化

有几个项目合成研究解决排序算法。例如,白色等。26使用RL学习排序功能。他们的工作使用几个启发式和领域特定语言产生一种排序算法称为强化编程。斯利瓦斯塔瓦等。27编码程序合成作为验证问题。具体地说,它们代表了一个合成的任务作为一个元组组成的函数表达式,域和卫队出现在合成程序和资源约束。这个想法是,给定一个预定的资源约束,他们的合成器产生程序符合预定义的规范,以确保正确性。他们把这个应用到发现归并排序和快速排序。杰森·安塞尔等。28需要作为输入预定义算法(例如,插入排序,归并排序和快速排序),然后决定什么时候使用它的自动调谐功能选择这些算法的执行。它是通过定义一个包含规则和转换语言决定算法选择和执行。