使用Rust和LLVM将numpy,scikit和pandas加速100倍:采访开发人员Weld

哈Ha!我向您介绍了文章“采访Weld的主要贡献者:使用Rust和LLVM将numpy,scikit和pandas加速到100倍”的翻译

在使用Python和R的数据科学工具工作了几周之后,我开始怀疑是否有任何中间表示(IR),例如CUDA,可以用于不同的语言。在每种语言中,必须有比重新实现和优化相同方法更好的东西。除此之外,最好有一个公共运行时来优化整个程序,而不是每个功能都单独运行。

经过几天研究和测试各种项目,我发现了Weld(您可以阅读学术文章)。

令我惊讶的是,Weld 的作者之一是Spark的创作者Matei Zaharia(Matei Zaharia)。

因此,我联系了Weld的主要撰稿人Shoumik Palkar,并对他进行了采访。Showmick是斯坦福大学计算机科学系的研究生,他是在Matey Zakharia的建议下进入的。

焊缝尚未准备好用于工业用途,但前景很好。如果您对数据科学的未来特别是Rust感兴趣,那么您将很喜欢这次采访。

原始文章作者的广告
image
«Not a Monad Tutorial», Weld . !

, mail@fcarrone.com @unbalancedparen.

焊接的目的是什么,它可以解决什么问题?


Weld的目标是提高使用高级API(例如NumPy和Pandas)的应用程序的生产率。他解决的主要问题是当今其他图书馆所没有的跨功能和跨库优化。特别是,许多广泛使用的库具有针对单个功能的算法的现代实现(例如,在C中在Pandas中实现的快速联接算法,或者在NumPy中实现快速矩阵乘法),但是它们没有提供优化这些功能的组合的可能性。例如,在执行矩阵乘法后再进行聚合时,防止不必要的内存扫描。

Weld提供了一个通用的运行时环境,该环境允许库以通用的中间表示(IR)表示计算。然后可以使用编译器优化器对该IR进行优化,然后通过诸如循环合并,矢量化等优化将运行中(JIT)即时编译为并行机器代码。Weld的IR最初是并行的,因此其中表示的程序始终可以并行进行。

我们还有一个名为“拆分注释”的新项目,该项目将与Weld集成,旨在减少在现有库中包含此类优化的障碍。

优化numpy,pandas和scikit会更容易吗?它快多少?


Weld对这些库中的功能组合进行了优化,而对库的优化仅可以加速单个函数的调用。实际上,这些库中的许多库已经针对每个单独的功能进行了很好的优化,但是由于它们不使用并行性或未有效使用内存层次结构,因此其性能低于现代设备的极限。

例如,许多用于多维数组(ndarray)的NumPy函数都是用低级C语言实现的,但是调用每个函数都需要对输入数据进行全面扫描。如果这些数组不适合CPU缓存,则可以将大部分执行时间都花在从主内存加载数据上,而不是执行计算。 Weld可以查看各个函数调用并执行优化,例如组合将数据存储在缓存或CPU寄存器中的循环。这样的优化可以在多核系统中将性能提高一个数量级以上,因为它们提供了更好的可伸缩性。

图片

Weld原型与Spark(左上方),NumPy(右上方)和TensorFlow(左下方)的集成比其自身的基础结构实现提高了30倍,而无需更改用户应用程序代码。Pandas和NumPy的跨库优化(右下)可以将性能提高两个数量级。

什么是Baloo?


Baloo是一个使用Weld实现Pandas API子集的库。它是由CWI(阿姆斯特丹Centrum Wiskunde&Informatica)的硕士Radu Jica开发的。Baloo的目标是将上述优化类型应用于Pandas,以提高单线程性能,减少内存使用并确保并发性。

Weld / Baloo是否支持外部操作(例如Dask)来处理内存中不适合的数据?


尽管我们很乐意接受这一方向的开源开发,但Weld和Baloo目前不支持外部操作(核外,外部存储器)!

为什么选择Rust和LLVM实施Weld?您马上来了Rust吗?


我们选择Rust是因为:

  • 它具有最少的运行时间(实际上,它只是检查数组的边界)并且易于嵌入到其他语言中,例如Java和Python
  • 它包含功能性编程范例,例如模式匹配,这些模式使编写代码更加容易,例如,优化了模式匹配编译器
  • ( Rust crates), .

我们选择LLVM是因为它是一个广泛使用和支持的开源编译框架。我们直接生成LLVM而不是C / C ++,因此不需要C编译器,而且由于不解析C / C ++代码,因此还减少了编译时间。

Rust不是实施Weld的第一种语言。第一个实现是在Scala上实现的,之所以选择它,是因为其代数数据类型以及模式匹配等强大功能的存在。这简化了优化器的编写,这是编译器的主要部分。我们最初的优化器的制作类似于Catalyst,它是Spark SQL中的可扩展优化器。

我们离开Scala是因为将基于JVM的语言嵌入其他运行时和语言太困难了。

Weld CPU GPU, RAPIDS, data science Python GPU?


Weld和RAPIDS之类的系统之间的主要区别在于,它旨在通过即时编译来优化包含不同内核(CUDA术语中的功能)的应用程序,而不是优化单个功能的实现。例如,Weld GPU后端将编译为最终应用优化的单个CUDA内核,而不是调用单独的内核。

此外,Weld IR与硬件无关,因此可用于GPU和CPU以及矢量处理器等非标准设备。
当然,Weld实际上与包括RAPIDS在内的同一领域的其他项目相交,并且是在其影响下创建的。

Bohrium(在NumPy中实现懒惰计算)和Numba(Python库,JIT代码编译器)等运行时环境具有Weld的高级目标。并且优化工具系统(例如Spark SQL)直接影响Weld设计。

除了数据科学库优化外,Weld是否还有其他用途?


Weld IR最令人兴奋的方面之一是它本身支持数据并发。这意味着Weld IR中的回路并行化始终是安全的。这使Weld IR对新型设备具有吸引力。

例如,NEC员工使用Weld在自定义的高带宽矢量处理器上运行Python工作负载,只需向现有的Weld IR添加新的后端即可。

IR还可以用于在数据库中实现物理操作层。我们计划添加功能,这些功能还将使我们能够将Python的一个子集编译为Weld代码。

准备好在实际项目中使用库了吗?如果没有,您什么时候可以期待完成的结果?


我们测试这些库的许多示例和基准均来自实际工作负载。因此,我们真的希望用户在其应用程序中尝试当前版本,并留下他们的反馈。而且,最重要的是,他们提出了自己的补丁。

总的来说,目前还不能说在实际应用中一切都会开箱即用。

在接下来的几个月中,我们的下一个发行版将专门关注Python库的可用性和可靠性。我们的目标是使图书馆足够好,可以包含在实际项目中。还可以在尚未添加支持的地方使用非Weld库版本。

正如我在第一个问题中指出的那样,Split批注项目(源代码学术文章)应简化此过渡。

拆分注释是一个系统,允许您将注释添加到现有代码中,以确定如何拆分,转换和并行化注释。它提供了我们认为在Weld中最有效的优化(在函数调用之间存储CPU缓存中的数据块,而不是扫描整个数据集)。但是Split注释比Weld易于集成,因为它们使用现有的库代码而不依赖于IR编译器。它还有利于维护和调试,从而提高了可靠性。

还没有完全的Weld支持的库可以使用Split注释。这将使我们能够根据用户反馈逐步添加Weld支持,同时采用新的优化方法。

All Articles