缩放熊猫:比较Dask、Ray、Modin、Vaex和Rapids

2020-07-06 03:03:17

Python及其最受欢迎的数据争议库Pandas人气飙升。与Java等竞争对手相比,Python和Pandas使数据探索和转换变得简单。

Python立刻失去了一些效率,因为它是一种解释性的、动态类型的语言。但更重要的是,Python一直注重简单性和可读性,而不是原始功能。同样,Pandas专注于提供简单、高级的API,在很大程度上忽略了性能。事实上,熊猫的创造者写了“我讨厌熊猫的10件事”,总结了这些问题:

因此,许多开发人员试图以各种方式向Python和Pandas添加更多功能也就不足为奇了。一些最值得注意的项目是:

dask:一个低级调度器和一个高级部分Pandas替代程序,用于在计算集群上运行代码。

VAEX:部分Pandas的替代品,它使用惰性计算和内存映射,允许开发人员在标准机器上处理大型数据集。

Rapids:在GPU上运行的数据科学库的集合,包括部分替代熊猫的cuDF。

因此,如果您正在处理大量数据,并且需要更快的结果,那么您应该使用哪一个呢?

在您决定使用哪种工具之前,最好对他们的每种方法有更多的了解。我们将仔细比较它们,但您可能希望按以下顺序进行尝试:

Modin,以Ray作为后端。通过安装这些工具,只需更改一行(将‘import padas pd`改为`import modin.padas as pd`),您可能会看到显著的好处。与其他工具不同,Modin的目标是与熊猫完全兼容。

Dask,这是一个更大的项目,因此也更复杂。但是Dask还提供了Dask.dataframe,这是一个更高级的类似熊猫的库,可以帮助您处理内核外的数据集。

VAEX,旨在帮助您在标准笔记本电脑上处理大量数据。它取代了Pandas,涵盖了一些Pandas API,但它更专注于探索和可视化。

我们检查的每个库都有不同的优点、缺点和扩展策略。下表提供了这些方面的广泛概述。当然,就像很多事情一样,下面的大部分分数在很大程度上取决于你的实际情况。

这些都是主观分数,根据你的具体情况,它们可能会有很大的不同。在分配这些职系时,我们考虑到:

易采性:用户预期的知识量、假定的硬件资源和安装的简易性。

扩展能力:每个工具的广泛数据集大小限制,取决于它是主要依赖于RAM、单个机器上的硬盘空间,还是可以向上扩展到机器群集。

用例:无论这些库是为提高Python软件的总体速度而设计的(“通用”),还是专注于数据科学和机器学习(“数据科学”),还是仅限于替换熊猫的“DataFrame”功能(“DataFrame”)。

如果数据集太大,无法在单台计算机上高效使用,则主要选择是跨…运行代码。

多线程或处理器:现代CPU有几个独立的内核,每个内核可以运行多个线程.。通过跨内核并行来确保您的程序使用所有潜在的处理能力通常是最容易的起点。

GPU内核:显卡最初的设计目的是高效地并行执行数百万像素的基本运算.。然而,开发人员很快就看到了这种能力的其他用途,“GP-GPU”(图形处理单元上的通用处理)现在是一种流行的加速严重依赖矩阵操作的代码的方法。

计算集群:一旦您达到了单台机器的极限,您就需要一个联网的机器集群,协同工作。

除了增加更多的硬件资源外,聪明的算法还可以提高效率。像VAEX这样的工具严重依赖于惰性计算(在确定需要结果之前不进行任何计算)和内存映射(将硬盘上的文件视为加载到RAM中)。

这些策略在本质上都不比其他策略好,您应该选择适合您特定问题的策略。

并行编程(无论您使用的是线程、CPU核心、GPU还是集群)提供了许多好处,但它也相当复杂,并且使调试等任务变得更加困难。

现代图书馆可以隐藏部分(但不是全部)这种增加的复杂性。无论您使用哪种工具,您都会冒着期望一切都能顺利解决的风险(左下),但结果却是混乱(右下)。

虽然不是所有这些库都是彼此的直接替代品,但在决定项目使用哪个库时,逐个比较它们是很有用的。

急流是一个图书馆的集合。为了进行此比较,我们只考虑了cuDF组件,它相当于Pandas的Rapids。

Dask更好地被认为是两个项目:一个低级Python调度器(在某些方面类似于Ray)和一个高级Dataframe模块(在许多方面类似于Pandas)。

Dask(作为一个较低级别的调度器)和Ray在使跨机器集群并行执行Python代码变得更容易的目标上有很多重叠之处。Dask更专注于数据科学领域,除了一个低级调度和集群管理框架之外,它还提供了更高级别的API,这些API反过来又为Pandas、NumPy和SCRICKIT-LEARN提供了部分替代。

Dask和Ray的创建者讨论了这两个库在这个GitHub线程中的比较情况,他们得出结论,调度策略是关键的区别之一。Dask使用集中式调度器在多个内核之间共享工作,而Ray使用分布式自下而上调度。

Dask(更高级别的Dataframe)承认Pandas API的局限性,虽然它为了熟悉而部分模拟了这一点,但它的目标并不是完全兼容Pandas。如果您有复杂的现有Pandas代码,您不太可能简单地将Pandas替换为Dask.Dataframe并让一切按预期工作。相比之下,这正是莫丁努力实现的目标:100%的熊猫覆盖率。Modin可以在Dask之上运行,但最初是为与Ray一起工作而构建的,而且这种集成仍然比较成熟。

Dask(Dataframe)与Pandas不完全兼容,但非常接近。这些密切的关系意味着达斯克也背负着熊猫固有的一些包袱。VAEX与Pandas的差异更大(尽管对于读取数据和计算汇总统计等基本操作而言,VAEX非常相似),因此也较少受到它的限制。

归根结底,Dask更专注于让您扩展代码以计算集群,而Vaex使在一台机器上处理大型数据集变得更容易。VAEX还提供了一些功能来帮助您轻松地可视化和绘制大型数据集,而Dask则更关注数据处理和争论。

达斯克和拉皮兹通过拉皮兹提供的整合在一起玩得很好。如果您有计算集群,则应该使用Dask。如果您有NVIDIA显卡,则应使用Rapids。如果您有NVIDIA GPU计算群集,则应同时使用两者。

将雷与莫丁、Vaex或Rapids相提并论并不那么有意义。与其他库不同,Ray没有提供高级API或Pandas等效项。取而代之的是,Ray为Modin提供动力,并以类似于Dask的方式与Rapids集成。

与Dask和Vaex的比较一样,Modin的目标是提供完整的熊猫替代品,而Vaex与熊猫的差异更大。如果您正在寻找一种快速方法来加速现有的Pandas代码,那么Modin应该是您的第一站,而Vaex更可能对新项目或特定用例感兴趣(特别是在一台机器上可视化大型数据集)。

Modin通过使用多个CPU内核(通过Ray或Dask)扩展熊猫代码。Rapids通过在GPU上运行熊猫代码来扩展它。如果你有可用的图形处理器,试试“急流”吧。但最容易的胜利可能来自莫丁,你可能只有在第一次尝试过莫丁之后才应该转向急流。

VAEX和Rapids的相似之处在于,它们都可以在一台机器上提供性能提升:VAex通过更好地利用计算机的硬盘和处理器内核,而Rapids通过使用计算机的GPU(如果它可用且兼容)。Rapids项目作为一个整体的目标是比Vaex广泛得多,让你在不离开GPU的情况下进行端到端的机器学习。VAEX更适合于原型和数据探索,让您可以在消费级机器上探索大型数据集。

玩新的、专门的工具很有趣。也就是说,许多项目都存在过度工程和过早优化的问题。如果您还没有遇到可伸缩性或效率问题,单独使用Python和Pandas没有什么错。它们被广泛使用,并且提供了成熟度和稳定性,以及简单性。

只有在达到Python和Pandas本身的限制之后,才应该开始研究这里讨论的库。否则,您可能会花费太多时间来选择和配置库,而不是在项目上取得进展。

在DataRevenue,我们已经使用这些库构建了许多项目,并且知道何时以及如何使用它们。如果您需要其他意见,请与我们联系。我们很乐意帮忙。