查看原文
其他

Forerunner:首个面向“多未来”的推测执行技术

可信系统研究组 微软研究院AI头条 2022-07-21

(本文阅读时间:13分钟)

编者按:10月26-29日,系统领域的全球顶会 SOSP 2021 在线上举办。在本届大会上,微软亚洲研究院研究员陈洋、郭众鑫、李润怀(实习生,浙江大学)、陈硕、周礼栋、张宪以及浙江大学周亚金教授共同提出了一种新颖的基于约束的推测执行技术——Forerunner,这是第一个面向“多未来”的推测执行技术。本篇论文获得了 Artifact Evaluation 全部三个最高级别徽章(即代码可评估、代码可获取和实验结果可复制)。今天将为大家从这项研究的底层思路和逻辑进行梳理总结。想要了解更多技术细节和更深入的实验数据,欢迎参阅论文原文。有意参与研究实习的同学,请联系论文一作。


在近日举行的系统领域全球顶会 SOSP 2021 上,微软亚洲研究院的研究员们在论文“Forerunner: Constraint-Based Speculative Execution for Ethereum”中,提出了一种全新的、基于约束(constraints)的推测执行(speculative execution)技术——Forerunner。这是首个面向“多未来”的推测执行技术,其技术特点是把利用预执行(pre-execution)来加速实际执行(actual execution)的手段进行了巧妙且基于通用约束的泛化。



论文链接:https://www.microsoft.com/en-us/research/publication/forerunner-constraint-based-speculative-transaction-execution-for-ethereum/


微软亚洲研究院的研究员们将 Forerunner 方法应用在了支持智能合约(smart contract)的以太坊(Ethereum)区块链中,以尝试对位于其系统核心的交易(transaction)执行环节进行加速。为了在最真实的场景下对技术效果进行评估,其中所有实验都是基于以太坊公链上实时产生的真实交易和区块(block)进行的。评估结果表明:经过泛化的推测执行技术能在真实系统中取得了可观的性能收益。这种对交易执行的加速能力可以用来提高以太坊核心层交易吞吐量。其主要的性能结果已经在 SOSP 的 Artifact Evaluation 中得到了独立的复现。


下面让我们来一起了解一下推测执行技术以及 Forerunner 的原理。


基础:“推测执行” 


推测执行技术已经成功的应用于许多系统之中,每当有一段需要稍后才会执行的代码出现时,都可以使用这种技术。由于决定其执行结果的代码输入只有在执行发生时才会完全知道,所以通过对输入进行预测,可以在备用或空闲资源上预先执行代码。如果后来发现预测正确,则可以跳过实际执行,返回预执行结果,从而实现对实际执行的加速。但是,当预测结果错误时,预执行将不会起作用,并且会因为核对预测结果而引入额外的开销。推测执行过去多被应用于“单未来”环境中,在这种情况下,简单地押注最可能出现的那种未来,就是一种有效的策略。 


图1:推测执行示意图


问题:“多未来”推测执行


“多未来”的推测执行问题源于以太坊区块链交易处理中的机遇和挑战。作为可编程的区块链,以太坊交易能够触发任意智能合约代码的执行。因此,其执行环节是系统中的一个瓶颈。抽象的来说,以太坊是以“传播-共识-执行”模型来运作的。在这个模型中,交易首先通过 P2P 网络进行“传播”,然后通过去中心化的“共识”算法被接受到一个个区块中,然后由所有以太坊节点按区块链中的顺序“执行”。虽然“传播到执行”窗口为推测执行创造了自然的机会,但由于去中心化的“传播”和“共识”过程,使交易的进块时机和顺序存在很多不同的可能性,从而导致了“多未来”现象的产生。而且,通常没有任何一种可能的“未来”占有压倒性的概率优势。这就意味着,如果对每笔交易只做一种预测,无论每次押注在哪种可能的“未来”上,预测的总体准确度都不会很高。这种“多未来”的情况,是传统“单未来”推测执行技术无法有效应对的挑战。 


图2:以太坊交易执行的“多未来”特性示意图


思路:“跨未来”加速


直观上来说,为了应对“多未来”挑战必须找到一种方法,使其能够利用一个或很少的预执行来覆盖大部分的可能性空间。这在本质上需要实现“跨未来”的加速。换言之,就是要利用在预测的某个”未来“中实施的预执行结果,来加速在其他可能发生的”未来“中的执行。从这种意义上来看,传统的推测执行技术实施的是”同未来“加速。虽然通过“跨未来”方式得到的加速并不一定能与“同未来”方式获得的加速结果相匹敌。但可以通过进行合理地预测,让预执行所基于的“ 未来”与实际会发生的“未来” 更加相似,进而获得更高的加速度。 


一旦我们有机会基于预测出的多种“未来”而进行多次预执行,那么就可以引入另一种“跨未来”的加速方式。从某种意义上说,这是对刚刚描述的”一对多“想法的对偶。它是指尽可能利用已有的多个预执行来更好地加速实际发生的真实”未来“。这种”多对一“想法大致上是将各个预执行拆分开来,并将拆分后的部件重新组装在一起,以尽可能接近真实的未来。目标是使用更高的相似性来实现更高的加速比。理想情况下,它应该允许基于几个实际发生的预执行,组合拼接出大量的预执行,以增加完全命中实际的”未来“,或是非常接近它的可能性。 


图3:“一对多”加速及“多对一(多)”加速示意图


“未来“间的连结:控制/数据-等价性


为了实现“跨未来“加速,研究员们需要找出可能发生的诸多“未来”的内在相似性,使得在一个“未来”中完成的计算可用于加速在另一个“未来”的执行。这其中的关键是把在每个可能在“未来”中的执行视为指令跟踪(instruction trace)序列,并利用其结构上的等价性来实现“跨未来”加速。 


微软亚洲研究院的研究员们提出的这种指令序列在结构上的等价性被称为 CD-Equivalence,其中 C 和 D 分别是控制流(control flow)和数据流(data flow)的首字母。当且仅当它们的指令序列具有相同的控制流和数据流时,两个指令跟踪序列是控制/数据-等价的(CD-Equivalent)。这意味着,两者执行的所有指令以及它们的顺序是完全相同的,并且对应指令间的数据依赖也是完全一致的。CD-Equivalence 能将所有可能发生的“未来”划分到各个等价类中。在每个类的任一“未来”中的执行都会产生等价(CD-Equivalent)的指令跟踪序列。这就说明如果能以某种方式,将任一指令跟踪序列转化为一个可执行程序,它就可以在同属一个等价类的所有“未来”中产生与原始交易的代码相同的执行结果。这种基于跟踪序列的程序有一个非常重要的特性:它本质上是针对给定等价类完全展开(unroll)和内联 (inline)后的一条直线型指令序列,而且指令间的数据依赖关系也是单一且完全确定的。这使得它具有高度的可优化性。因此,可以通过基于某个预测出的“未来”,进行一次预执行并跟踪记录其指令序列,再通过激进的优化将其特化为一条更短、更有效的快速路径(fast path)程序。这条快速路径能够加速同属一个等价类的所有”未来”。为了刻画一个快速路径的适用范围,研究员们会生成一组针对给定等价类的约束条件(constraints),来判定一个给定的“未来”是否属于这个等价类。 


选择 CD-Equivalence 的另一个非常重要的原因是基于对以太坊上真实交易(transactions)的关键观察:这些交易在多种不同“未来”中的执行之间,往往具有基于 CD-Equivalence 的等价性。研究员在论文中用一个具体的例子对此进行了进一步阐释。换言之,CD-Equivalence 能够把以太坊真实场景的“未来”空间划分为较少的几个等价类,使得少数几个预执行就能覆盖住全部或是大部分的可能性空间。 


图4:CD-Equivalence 示意图


关键技术:多指令序列的程序特化和记忆化


Forerunner 的关键技术是将两种新颖的方法进行有机结合。它们是一种新的多指令序列的程序特化和一种新的记忆化。Forerunner 首先会对预执行进行跟踪(tracing),进而得到指令序列,然后利用程序特化技术(Specialization)生成由约束检查代码和快速路径代码组合而成的“加速程序”,最后再利用记忆化技术(Memoization)在“加速程序”的各个代码段上添加“近道“(shortcut)” 。“近道“会根据预执行中记住的信息生成。而“加速程序“在其执行过程中,则可以利用”近道“跳过部分代码段,从而进一步提高加速效果。


Forerunner的关键技术有以下几个亮点:


(1)特化生成的”加速程序“其代码长度比原始跟踪序列短得多,平均而言,仅为其十分之一;


(2)特化过程中的一个关键创新是将特化后的代码转换到一种简化后的中间语言上。这种新的中间语言能在一个极大简化后的虚拟机上执行,其效率远超支持原始代码的复杂虚拟机。这使得本来就更短的”加速程序“代码还能被更高效的执行


(3)”加速程序“ 的执行是无需回滚的。在确信给定的”未来“可以通过其快速路径加速之前,”加速程序“ 不会进行任何外部可见的更改。这意味着,在发现无法加速的情况,可以立即用原始代码执行,而无需任何回滚的操作;


(4)研究员们提出的创新的方法能够对多个快速路径所对应的多组约束检查进行合并式检查。这确保了约束检查的成本不会随着所需要涵盖的等价类的数量而增加


(5)抄”近道“机制非常灵活和强大。它可以利用在预执行中记住的信息跳过“加速程序”的不同部分。它是实现前面提到的“多对一”加速的关键。在评估中,研究员们观察到抄“近道“机制可以跳过 80% 以上的”加速程序“代码。在做出完美预测的最佳情况下,抄“近道“机制可以跳过几乎所有计算指令,这非常接近传统方法的行为和执行的效率,使得论文中提出的方法可被视为对传统推测执行技术的一种泛化。


(6)论文中提出的特化和记忆化过程本身也非常高效,可以确保在实际执行发生之前,就及时生成好相应的“加速程序”。 


图5:Forerunner 关键技术示意图


基于以太坊的实现和评测


为了验证本文的方法,研究员们将 Forerunner 具体实现为以太坊节点的交易执行加速器,并测量实现的加速比。这个加速器能在真实的以太坊节点中稳定运行,并且可以正确处理所有真实世界中的以太坊交易和智能合约代码。本次实验评估工作的亮点在于:它是在真实运行的以太坊公网节点中,在实时发生的区块链交易上进行效果测量的。这种评估方式将技术暴露于真实的代码和数据、真实中的“未来”不确定性,以及真实情况中能用于预执行和其他预处理的时间约束下,这对于评估一项推测执行技术的真实有效性至关重要。在这样的评测中,如果本文的技术不能在实时系统中正确且快速地完成从预测到特化和记忆化等所有工作,那它们就不会得到任何的加速效果。


研究员们的主要评估持续了10天,包括其间真实发生在以太坊公网中的所有1300万笔交易。评估结果表明,Forerunner 技术在所有这些交易实现的平均加速为6.1。值得一提的是,在以太坊实测中,因为各种原因,有大约5%的交易没有被用于性能评测的节点提前听到,因此研究员们完全没有机会对它们进行任何预执行以及后继的加速。如果将这些未提前听到的交易排除在计算之外,Forerunner 实现的有效平均加速比应为8.4。相比之下,传统方法只能实现2.1的有效平均加速比。这是因为传统的“单未来”方法无法应对以太坊中大量的“多未来”交易,它只能加速占比大约50%的“单未来”交易。而 Forerunner 则可以加速几乎所有的“多未来”的交易,使得能被加速的交易占比提升到98.41%。这在本质上打破了“多未来”场景中加速比提升的“天花板”,为进一步的性能优化打开了空间。 



总结与展望


Forerunner 提出了一种解决了“多未来”难题的有效方法,研究员们希望它能够让推测执行成为高通量区块链系统设计中的一个必备组成部分。其未来的工作将主要分为三个方面:


(1)进一步优化 Forerunner,使其能以更低的开销获得更高的加速比;


(2)推动 Forerunner 在具有影响力的公链、联盟链系统中落地,并发现和解决这个过程中进一步暴露出来的技术问题;


(3)将 Forerunner 的核心思想和带来的启发,推广到推测执行以外的更多的技术场景中,进而可以应用到区块链以外的更多系统中。 










你也许还想看




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存