如何利用 GPU 增强 Pandas 的能力,介绍了英伟达™(NVIDIA®)Pandas 加速框架 cuDF。
摘要
Pandas 是数据分析和机器学习工作中的重要工具,但在处理大型数据集时效率受到限制。类似于 Apache Spark,Pandas 在计算和转换时将数据加载到内存中,但与 Spark 不同的是,Pandas 不是分布式计算平台,因此一切都必须在单个系统的 CPU 和内存上完成。这种特性限制了 Pandas 在两个方面的使用:单个系统上的 Pandas 无法处理大量数据,即使是适合单个系统内存的数据,处理一个相对较小的数据集也可能需要相当长的时间。Dask 等框架可以解决第一个问题,但是虽然 Dask 可以在机器集群中并行处理大型数据集,但实际上,大多数机器学习项目的数据都可以在单个系统的内存中进行处理。因此,我们需要一种能在单机上高效并行执行 Pandas 操作的工具,以解决前面提到的第二个问题。
英伟达™(NVIDIA®)GTC 2024大会上,英伟达™(NVIDIA®)宣布RAPIDS cuDF现在可以为950万Pandas 用户提供GPU加速,而无需修改他们的代码。cuDF 是一个GPU DataFrame库,用于使用GPU并行处理数据。在安装 cuDF 之前,请确保您的系统可以使用英伟达™(NVIDIA®)图形处理器,并且您的系统上安装了 GeForce RTX 3090。如果您没有这样的硬件,也可以在谷歌 Colab 等云平台上运行 cuDF 代码,这些平台可以为您的使用情况提供足够的 GPU 资源。
观点
-
Pandas 是数据分析和机器学习工作中的重要工具,但在处理大型数据集时效率受到限制。
-
与 Apache Spark 类似,Pandas 在计算和转换时将数据加载到内存中,但与 Spark 不同的是,Pandas 不是分布式计算平台,因此一切都必须在单个系统的 CPU 和内存上完成。
-
英伟达™(NVIDIA®)Pandas 加速框架 cuDF 可以解决 Pandas 在处理大型数据集时的效率问题。
-
cuDF 是一个GPU DataFrame库,用于使用GPU并行处理数据。
-
在安装 cuDF 之前,请确保您的系统可以使用英伟达™(NVIDIA®)图形处理器。
-
如果您没有这样的硬件,也可以在谷歌 Colab 等云平台上运行 cuDF 代码,这些平台可以为您的使用情况提供足够的 GPU 资源。
-
使用 cuDF 可以提高 Pandas 在处理大型数据集时的效率。
英伟达™(NVIDIA®)Pandas 加速框架 cuDF 简要介绍
Pandas 仍是数据分析和机器学习工作中的重要工具,为数据读取、转换、清理和写入等任务提供了广泛的功能。然而,尽管 Pandas 在数据科学项目中得到了广泛应用,它在处理大型数据集时的效率却受到了一定限制,这阻碍了它在生产环境中的应用或用于构建弹性数据管道。
与 Apache Spark 类似,Pandas 将数据加载到内存中进行计算和转换。但与 Spark 不同的是,Pandas 不是分布式计算平台,因此一切都必须在单个系统的 CPU 和内存上完成(单节点处理)。这一特性从两个方面限制了 Pandas 的使用:
单个系统上的 Pandas 无法处理大量数据。
即使是适合单个系统内存的数据,处理一个相对较小的数据集也可能需要相当长的时间。
类固醇大熊猫
Dask 等框架可以解决第一个问题。Dask DataFrame 通过在分布式计算机集群上并行化 Pandas,帮助您处理大型表格数据。在很多方面,Dask 赋予 Pandas 的功能类似于 Apache Spark(不过,Spark 仍能更高效地处理大型数据集,这也是它成为数据工程师首选工具的原因)。
虽然 Dask 可以在机器集群中并行处理大型数据集,但实际上,大多数机器学习项目的数据都可以在单个系统的内存中进行处理。因此,在此类项目中使用机器集群可能有些过度。因此,我们需要一种能在单机上高效并行执行 Pandas 操作的工具,以解决前面提到的第二个问题。
每当谈到并行处理,大多数工程师脑海中浮现的第一个词就是 GPU。长期以来,人们一直希望在 GPU 上运行 Pandas 以实现高效的并行计算。cuDF(读作 "KOO-dee-eff")是一个GPU DataFrame库,用于使用GPU并行处理数据。
在英伟达™(NVIDIA®)GTC 2024大会上,英伟达™(NVIDIA®)宣布RAPIDS cuDF现在可以为950万熊猫用户提供GPU加速,而无需修改他们的代码。
安装
在继续安装之前,请确保您的系统可以使用英伟达™(NVIDIA®)图形处理器。如果本地拥有英伟达™(NVIDIA®)显卡,就可以在自己的机器上运行 cuDF。或者,如果您没有这样的硬件,也可以在谷歌 Colab 等云平台上运行 cuDF 代码,这些平台可以为您的使用情况提供足够的 GPU 资源。就我个人而言,我的系统上安装了 GeForce RTX 3090,因此我选择在本地进行这项测试。不过,初学者可能会发现在 Google Colab 实例上运行本教程中的 cuDF 代码更为方便。
此外,截至 2024 年 4 月,cuDF 只能在 Linux 操作系统和 Python 3.9 或更高版本上运行。开始安装前,请访问此页面了解系统要求。
为了便于读者理解,我将安装部分分为两节。第一部分帮助用户在本地系统中安装 cuDF,第二部分指导 Google Colab 用户完成安装。
在带图形处理器的系统上安装
正如 cuDF 名称所示,它在 CUDA 平台(由英伟达开发)上运行。因此,您需要先在系统上安装 CUDA 工具包。如果尚未安装 CUDA 12.0,我建议安装。此外,任何 CUDA 11 或更新版本都可以正常工作。
如果计划在本地系统上运行 cuDF,在安装 CUDA 工具包后,还需要安装 RAPIDS 框架。使用用户界面命令生成器安装 RAPIDS 非常简单直接。您需要浏览 https://docs.rapids.ai/install 并选择系统的 CUDA 和 Python 版本。你可以选择标准软件包(包括 cuDF、cuML、cuGraph、cuSpatial、cuProj、cuxfilter、cuCIM 和 RAFT),也可以通过 "Choose Specific Package(选择特定软件包)"只选择 cuDF。下面的截图就是我为我的系统所做的选择。
如果您打算在 Google Colab 上运行 cuDF,您可以选择一条更简单的路径。首先,Google Colab 和许多类似服务的 GPU 实例已经安装了 CUDA 工具包。
正如这份来自 Google 的文档所详细解释的,安装 RAPIDS 需要两个步骤。第一步是选择使用 GPU 加速器的 Colab 运行时。第二步是在笔记本上运行以下命令,通过 pip 在 Colab 实例上安装 RAPIDS。
!pip install cudf-cu11 --extra-index-url=https://pypi.ngc.nvidia.com !rm -rf /usr/local/lib/python3.8/dist-packages/cupy* !pip install cupy-cuda11x
详情请阅读上述文件中的 "开始使用 Colab 上的 RAPIDS "部分。
测试示例
为了比较 CuDF Pandas 和标准 Pandas 的能力,我使用一个有 1 千万条记录的假数据集进行了测试。您可以在此资源库中找到所有需要的文件:https://github.com/tamiminaser/cudf-examples/tree/master/example1
首先,我们需要创建一个大型测试数据集。如果你有一个可以加载到 Pandas 中的大型数据集,你就可以继续创建数据集了。我决定创建一个有 1000 万行的假 CSV 数据集,并将其用于此次测试。我使用以下 Python 代码(链接到 repo)创建了假数据集,并将其命名为 data_10000000.csv。
import csv
from faker import Faker
import datetime
from tqdm import tqdm
def datagenerate(records, headers):
fake = Faker('en_US')
with open("data_10000000.csv", 'wt') as csvFile:
writer = csv.DictWriter(csvFile, fieldnames=headers)
writer.writeheader()
for i in tqdm(range(records)):
full_name = fake.name()
FLname = full_name.split(" ")
Fname = FLname[0]
Lname = FLname[1]
domain_name = "@testDomain.com"
userId = Fname +"."+ Lname + domain_name
writer.writerow({
"user_id": fake.unique.random_int(min=1111111111111, max=9999999999999),
"name": fake.name(),
"date_of_birth" : fake.date(pattern="%d-%m-%Y", end_datetime=datetime.date(2000, 1,1)),
"country_of_birth": fake.country(),
"email": fake.email(),
"record_year": fake.year(),
"score": fake.random_int(min=1, max=999),
})
records = 100000000
headers = ["user_id", "name", "date_of_birth", "country_of_birth", "email", "record_year", "score"]
datagenerate(records, headers)
print("CSV generation complete!")
创建这样一个 1000 万行的 csv 文件需要很长时间,输出文件大小约为 8 GB。您可以在代码中降低记录数(例如降低到 3M 记录),以生成更小的数据集。此外,我使用的是 NVIDIA GeForce RTX 3090,它拥有 24 GB 内存,加载如此大的数据集没有任何问题,但如果您使用的是内存较小的 GPU,可能需要使用较小的数据集。
生成假 CSV 文件后,可以对该文件进行以下测试。首先,让我们从标准 Pandas 开始,观察该数据集的处理时间。下面是我们在测试初始阶段使用的 Jupyter Notebook。(注意,我在这里将代码限制为 3M 记录,以便循环测试 10 次,从而进行更精确的比较)。
现在,让我们使用 cuDF Pandas 进行同样的处理。
如你所见,两段代码都很相似,唯一的区别在于 cuDF 笔记本的第一个单元格。在 jupyter 笔记本中,只需在导入 Pandas 之前添加 %load_ext cudf.pandas,我们就可以使用 cudf.pandas 代替标准 Pandas 并享受其所有优点(再简单不过了)。
如图所示,按进程分组(单元格 #3)使用标准 Pandas 需要约 1.06 秒,而使用 cuDF Pandas 仅需 122 毫秒。这意味着在 CPU 上,cuDF Pandas 比标准 Pandas 快约 8 倍。
在单元格 #4 中,我们进行了一系列更复杂的连接和转换。在这个单元中,标准 Pandas 处理数据需要 6 秒钟,而 cuDF Pandas 处理同样的数据则需要约 109 毫秒。因此,cuDF Pandas 处理相同数据的速度要快 55 倍。
摘要
正如您所看到的,cuDF 提供的应用程序接口能让我们以最小的代价在 GPU 上转换 Pandas 数据帧。根据我们的测试,与 CPU 上的标准 Pandas 相比,cuDF 的性能要快 10-100 倍。
正如开头提到的,Dask 是另一种流行的工具,它能让我们在机器集群上运行 Pandas 转换和作业。cuDF 和 Dask 可以结合使用,进一步增强处理能力,并利用分布式计算系统和 GPU 的优势,更快地处理数据(更多信息)。