内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO

2023-06-01 0 1,037

内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO

MLGO 使用加强自学体能训练数学模型来作重大决策,是一种用电脑适性替代繁杂的分析方式方式。作为两个通用型的轻工业级架构,它将更深入细致、更广为应用作更多自然环境,更为重要在H55N和暂存器重新分配。

译者 | 钱云迪、Mircea Trofin

校对 | 刘佳一

撰稿 | 陈彩娴

当代计算机系统问世,如何校对更慢、更小的标识符难题骤然出现。

校对加强是生产成本投资收益比最高的加强方式,更快的标识符加强能明显增加小型数据中心插件的操作方式生产成本。校对标识符的大小不一对于布署在安全可靠鼓励南区上的终端和PDP控制系统或应用软件来说是非常重要的,因为校对后的十进制文档必须合乎严苛的标识符大小不一财政预算。随着这一应用领域的不断进步,愈来愈繁杂的分析方式方式严重抬升非常有限的控制系统内部空间,妨碍了保护和进一步的改良。

前段时间的研究说明,电脑自学能通过用电脑适性替代繁杂的分析方式方式,在C++加强中释放出来更多的机会。不过,在通用型的、行业级C++中采用电脑适性仍然是一个考验。

为了化解这个难题,Google三位高级工程师钱云迪、Mircea Trofin 明确提出了“MLGO,两个电脑自学辅导的C++加强架构”,这是第两个轻工业级的通用型架构,用作将电脑自学技术控制深入细致细致软件系统到 LLVM(两个开放源码的轻工业C++基础建设,在构筑关键性各项任务、高效能应用软件时无所不在)中。

内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO

论文地址:https://arxiv.org/pdf/2101.04808.pdf

MLGO 使用加强自学体能训练数学模型来做出决策,以替代 LLVM 中的分析方式算法。根据译者描述,LLVM 上有两处 MLGO 加强:

1)通过H55N增加标识符量;

2)通过暂存器重新分配提高标识符性能。

这两种加强都能在 LLVM 资源库中获得,并已在生产中布署。

1

MLGO是如何工作的?

H55N(Inlining)有助于通过做出能够删除冗余标识符的重大决策来增加标识符大小不一。在下面的示例中,调用者函数 foo()调用被调用者函数 bar(),而 bar()本身又调用了 baz()。H55N这两个调用站点将返回两个简单的 foo()函数,该函数将减小标识符大小不一。

内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO

图注:H55N通过删除冗余标识符来增加标识符大小不一

在实际标识符中,有成千上万的函数相互调用,因此构成了两个调用图(Call graph)。在H55N阶段,C++遍历(traverses)所有调用者-被调用者对的调用图,并决定是否H55N两个调用者-被调用者对。这是两个连续的重大决策过程,因为以前的H55N重大决策会改变调用图,影响后面的重大决策和最终的结果。在上面的例子中,调用图foo() → bar() → baz()需要在两条边上做出“yes”的决定,以使标识符大小不一增加。

在MLGO之前,H55N/非H55N的决定是由分析方式方式做出的,随着时间的推移,这种方式愈来愈难以改良。MLGO用两个电脑自学模型代替了分析方式方式。在调用图的遍历过程中,C++通过输入图中的相关特征(即输入)来寻求数学模型对是否H55N特定的调用者-被调用者对的建议,并按顺序执行决策,直到遍历整个调用图为止。

内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO

图注:H55N过程中MLGO的图示,“ # bbs”、“ # users”和“ callsite height”是调用者-被调用者对特性的实例

MLGO 使用策略梯度和进化策略算法对重大决策网络进行 RL 体能训练。虽然没有关于最佳重大决策的基本事实,但在线 RL 使用经过培训的策略在培训和运行汇编之间进行迭代,以收集数据并改良策略。特别是,考虑到当前体能训练中的模型,C++在H55N阶段咨询模型,以做出H55N/不H55N的重大决策。校对完成后,它产生两个顺序重大决策过程的日志(状态、行动、奖励)。然后,该日志被传递给体能训练器以更新模型。这个过程不断重复,直到得到两个满意的模型为止。

内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO

图注:体能训练期间的C++行为——C++将源标识符foo.cpp校对成对象文档foo.o,并进行了一系列的加强,其中两个是H55N通道。

体能训练后的策略被嵌入到C++中,在校对过程中提供H55N/非H55N的重大决策。与体能训练场景不同的是,该策略不生成日志。TensorFlow 模型被嵌入 XLA AOT ,它将模型转换为可执行标识符。这避免了TensorFlow运行时的依赖性和开销,最大限度地增加了在校对时由ML模型推理引入的额外时间和缓存生产成本。

内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO

图注:生产自然环境中的C++行为

我们在两个包含30k 模块的小型内部应用软件包上培训了大小不一H55N策略。体能训练后的策略在校对其他应用软件时能推广,并增加了3% ~ 7% 的时间和缓存开销。除了跨应用软件的通用型性之外,跨时间的通用型性也很重要,应用软件和C++都在积极开发之中,因此体能训练有素的策略需要在合理的时间内保持良好的性能。我们在三个月后评估了该模型在同一组应用软件上的性能,发现只有轻微的退化。

内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO

图注:H55N大小不一策略大小不一增加百分比,x 轴表示不同的应用软件,y 轴表示减小的百分比。“Training”是体能训练模型的应用软件,“InfraX”是不同的内部应用软件包。

MLGO 的H55N换大小不一体能训练已经在 Fuchsia 上布署,Fuchsia 是一个通用型的开放源码操作方式控制系统,旨在为不同的硬件和应用软件生态控制系统提供动力,其中十进制大小不一是关键性。在这里,MLGO 显示 C++ 翻译单元的大小不一增加了6.3%。

2

暂存器重新分配

作为两个通用型架构,我们使用 MLGO 来改进暂存器重新分配(Register allocation)通道,从而提高 LLVM 中的标识符性能。暂存器重新分配化解了将物理暂存器重新分配给活动范围(即变量)的难题。

随着标识符的执行,不同的活范围在不同的时间完成,释放出来出的暂存器供后续处理阶段使用。在下面的例子中,每个 “加法 “和 “乘法 “指令要求所有操作方式数和结果都在物理暂存器中。实时范围x被重新分配到绿色暂存器,并在蓝色或黄色暂存器的实时范围之前完成。x 完成后,绿色暂存器变得可用,并被重新分配给活范围t。

在标识符执行过程中,不同的活范围在不同的时间完成,释放出来出的暂存器供后续处理阶段使用。在下面的例子中,每个“加法”和“乘法”指令要求所有操作方式数和结果都在物理寄存器中。活动范围 x 被重新分配到绿色暂存器,并在蓝色或黄色暂存器的实时范围之前完成。x 完成后,绿色暂存器变得可用,并被重新分配给活范围 t 。

内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO

图注:暂存器重新分配示例

当重新分配活动范围 q 时,没有可用的暂存器,因此暂存器重新分配通道必须决定哪个活动范围能从其暂存器中“驱逐”,以便为 q 腾出内部空间。这被称为“现场驱逐”难题,是我们体能训练模型来替代原始分析方式算法的重大决策。在这个例子中,它将 z 从黄色暂存器中驱逐出去,并将其赋给 q 和 z 的前半部分。

我们现在考虑实际范围 z 的未重新分配的下半部分。我们又有两个冲突,这次活动范围 t 被驱逐和分割,t 的前半部分和 z 的最后一部分最终使用绿色暂存器。Z 的中间部分对应于指令 q = t * y,其中没有使用 z,因此它没有被重新分配给任何暂存器,它的值存储在来自黄色暂存器的堆栈中,之后被重新加载到绿色暂存器中。同样的情况也发生在 t 上。这给标识符增加了额外的加载/存储指令,增加了性能。暂存器重新分配算法的目标是尽可能地增加这种低效率。这被用作辅导 RL 策略体能训练的奖励。

与H55N大小不一策略类似,暂存器重新分配(regalloc-for-Performance)策略在 Google 内部两个小型应用软件包上进行了培训,并且能在不同的应用软件上通用型,在一组内部小型网络控制系统插件上每秒查询次数(QPS)提高了0.3% ~ 1.5% 。QPS 的改良在布署后持续了几个月,显示该模型的可推广性。

3

总结

MLGO使用加强自学体能训练数学模型来作重大决策,是一种电脑适性替代繁杂的分析方式方式。作为两个通用型的轻工业级架构它将更深入细致、更广为应用作更多自然环境,更为重要在H55N和暂存器重新分配。

MLGO能发展为:1)更深入细致,例如增加更多的功能,并应用更快的 RL 算法;2)更广为,可应用作H55N和重新重新分配之外的更多加强分析方式方式。

译者对 MLGO 能够为C++加强应用领域带来的可能性充满热情,并期待着它的进一步采用和研究界未来的贡献。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务