斯坦福开源Weld:高效实现数据分析的端到端优化
副标题[/!--empirenews.page--]
技术沙龙 | 邀您于8月25日与国美/AWS/转转三位专家共同探讨小程序电商实战
导读:Weld 是斯坦福大学 DAWN 实验室的一个开源项目,在 CIDR 2017 论文中描述了它的初始原型。Weld 用于对结合了数据科学库和函数的现有工作负载进行优化,而无需用户修改代码。我们在 VLDB 2018 论文中提出了 Weld 的自适应优化器,并得出了一些可喜的结果:通过在 Weld IR 上自动应用转换可以实现工作负载数量级的加速。消融研究表明,循环融合等优化具有非常大的影响。本文主要介绍如何使用 Weld 的自适应优化器进行数据分析的端到端优化。 分析应用程序通常会使用多种软件库和函数,比如使用 Pandas 操作表,使用 NumPy 处理数字,使用 TensorFlow 进行机器学习。开发人员通过使用这些库将来自各个领域的先进算法组合成强大的处理管道。 然而,即使每个库中的函数都经过精心优化,我们仍然发现它们缺少端到端的优化,在组合使用这些库时会严重影响整体性能。例如,多次调用经过优化的 BLAS 函数(使用了 NumPy)要比使用 C 语言实现单次跨函数优化(如管道化)慢 23 倍。 鉴于这种性能差距,我们最近提出了 Weld,一种用于分析工作负载的通用并行运行时。Weld 旨在实现跨多个库和函数的端到端优化,而无需改变库的 API。对于库开发人员来说,Weld 既可以实现库函数的自动并行化,也可以实现强大的跨函数优化,例如循环融合(loop fusion)。对于用户而言,Weld 可以在不修改现有管道代码的情况下带来数量级的速度提升,也就是说数据分析师可以继续使用 Pandas 和 NumPy 等流行库的 API。 Weld 为开发人员提供了三个主要组件,用于与其他库集成:
![]() 在大多数情况下,用户可以通过 import 语句切换到启用了 Weld 的库。 我们在 CIDR 2017 论文中描述了最初的 Weld 原型。通过在 IR 上应用手动优化,Weld 在合成工作负载上表现出了数量级的速度提升,这些工作负载包含了来自单个库和多个库的函数。 VLDB 2018:Weld 的自动优化 这个原型有一个很显著的限制,IR 的优化是手动进行的,需要预先知道数据的相关属性,例如聚合基数。简单地说就是系统缺少自动优化器。为此,我们在 VLDB 2018 上发表的最新论文介绍了优化器的设计和实现,这个优化器可自动优化 Weld 程序。 因为 Weld 试图优化来自不同独立库的函数,所以我们发现,与实现传统的数据库优化器相比,在设计新的优化器时存在一些独特的挑战:
为了应对这些挑战,我们的优化器采用了双管齐下的设计,结合了静态的基于规则的优化(旨在消除冗余,以生成高效的 Weld IR)和自适应优化(在运行时确定是启用还是禁用某些优化)。 ![]() 使用新优化器的评估结果是很喜人的:在 10 个真实的工作负载上使用常用库(如 NumPy 和 Pandas),Weld 可在单个线程上实现高达 20 倍的加速,并通过自动并行化实现进一步的加速。在评估 Weld 时,我们还分析了哪些优化对工作负载样本产生的影响最大,我们希望这对该领域的进一步研究有所帮助。 基于规则的优化:从循环融合到向量化 Weld 的自动优化器首先会应用一组静态的基于规则的优化。基于规则的优化从 Weld IR 输入中查找特定模式,并用更有效的模式替换这些模式。Weld 基于规则的优化器在其闭合的 IR 上运行,这意味着每个优化的输入和输出都是相同的 IR。这种设计可以允许组合不同的规则并以不同的方式重新运行。 优化器包含了很多用于生成高效代码的规则,从折叠常量到合并并行循环。其他一些最具影响力的基于规则的优化:
Weld 应用了其他额外的优化,在这篇论文中有描述 http://www.vldb.org/pvldb/vol11/p1002-palkar.pdf。 自适应优化:从预测到自适应哈希表 在使用基于规则的优化器转换 IR 之后,Weld 进行了一系列自适应优化。自适应优化器不是直接替换 IR 中的模式,而是将 Weld 程序变成在运行时动态选择是否应该应用优化。 其中的一个示例是决定是否要预测一个分支。预测会将分支表达式(即 if 语句)转换为无条件计算 true 和 false 表达式的代码,然后根据条件选择正确的选项。尽管预测代码会做更多的工作(因为同时计算了两个表达式),但它也可以使用 SIMD 运算符进行向量化,这与分支代码不同。请看下面的示例: ![]() (编辑:好传媒网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |