掌握GPU:Python中GPU加速数据框架的初学者指南

掌握GPU:Python中GPU加速数据框架初学者指南

合作伙伴文章

 

如果您正在使用Python处理大型数据集,可能有几个GB的大小,您可能会对等待查询完成而耗费数小时感到沮丧,因为基于CPU的pandas DataFrame在执行操作时遇到困难。这种情况正是pandas用户应该考虑利用RAPIDS cuDF进行数据处理的时候。

具有类似于pandas的API的RAPIDS cuDF使数据科学家和工程师能够快速利用GPU上的并行计算的巨大潜力,只需进行几行代码的更改。

如果您对GPU加速不熟悉,本文是RAPIDS生态系统的简单介绍,并展示了cuDF的最常见功能,即基于GPU的pandas DataFrame对应项。

想要这些技巧的简明总结吗?请下载cuDF备忘录。

 

利用cuDF DataFrame的GPU

cuDF是RAPIDS GPU加速库套件的数据科学构建块。它是一个EDA工具,您可以使用它来构建允许数据流程处理数据并生成新特征的数据管道。作为RAPIDS套件中的基本组件,cuDF是其他库的基础,巩固了它作为一个常见构建块的角色。像RAPIDS套件中的所有组件一样,cuDF使用CUDA后端来支持GPU计算。

然而,cuDF用户不需要直接与该层交互,因为它具有易于使用和熟悉的Python接口。

cuDF如何加速您的数据科学工作

您是否厌倦了看着时钟运行脚本?无论您处理字符串数据还是处理时间序列,您都可以使用cuDF推动数据工作的进展。以下是您可以使用cuDF推动数据工作的几种方法:

  • 时间序列分析:无论您是对数据进行重新采样、提取特征还是进行复杂计算,cuDF都可以大大加快速度,时间序列分析速度可能比pandas快880倍。
  • 实时探索性数据分析(EDA):使用传统工具浏览大型数据集可能是一项繁琐的工作,但是cuDF的GPU加速处理能力使得即使对于最大的数据集,实时探索也成为可能。
  • 机器学习(ML)数据准备:使用cuDF的加速能力,加快数据转换任务并为常用的ML算法(如回归、分类和聚类)准备数据。高效的处理意味着更快的模型开发,并使您能够更快地进行部署。
  • 大规模数据可视化:无论您是为地理数据创建热力图还是可视化复杂的金融趋势,开发人员可以使用cuDF和cuxfilter部署高性能和高FPS的数据可视化库。这种集成使得实时交互成为您分析周期的重要组成部分。
  • 大规模数据过滤和转换:对于超过几个GB的大型数据集,您可以使用cuDF在较短的时间内执行过滤和转换任务,而不是使用pandas。
  • 字符串数据处理:传统上,由于文本数据的复杂性,处理字符串数据是一项具有挑战性且耗时的任务。使用GPU加速可以轻松完成这些操作。
  • GroupBy操作:GroupBy操作是数据分析中的重要操作,但可能耗费资源。cuDF显著加快了这些任务的速度,使您在拆分和聚合数据时更快地获得洞察力。

 

熟悉的GPU处理界面

RAPIDS的核心前提是为流行的数据科学工具提供熟悉的用户体验,以便所有从业人员都可以轻松访问NVIDIA GPU的强大功能。无论您是执行ETL、构建ML模型还是处理图形,如果您熟悉pandas、NumPy、scikit-learn或NetworkX,使用RAPIDS时您会感到非常熟悉。

从CPU切换到GPU数据科学堆栈从未如此简单:只需导入cuDF而不是pandas,您就可以利用NVIDIA GPU的巨大计算能力,将工作负载加速10-100倍(最低端),并在使用您喜欢的工具时享受更高的生产力。

检查下面的示例代码,它展示了使用pandas的人对cuDF API的熟悉程度。

import pandas as pd
import cudf
df_cpu = pd.read_csv('/data/sample.csv')
df_gpu = cudf.read_csv('/data/sample.csv')

 

从您喜欢的数据源加载数据

  自2018年10月RAPIDS首次发布以来,cuDF的读写功能已经显著增强。数据可以是机器本地的,存储在本地集群中,或者存储在云中。cuDF使用fsspec库来抽象大部分与文件系统相关的任务,因此您可以将注意力集中在最重要的事情上:创建特征和构建模型。

多亏了fsspec,从本地文件系统或云文件系统读取数据只需提供后者的凭证。下面的示例从两个不同的位置读取相同的文件:

import cudf
df_local = cudf.read_csv('/data/sample.csv')
df_remote = cudf.read_csv(
    's3://<bucket>/sample.csv'
    , storage_options = {'anon': True})

 

cuDF支持多种文件格式:如CSV/TSV或JSON等基于文本的格式,如Parquet或ORC等基于列的格式,或者如Avro等基于行的格式。在文件系统支持方面,cuDF可以从本地文件系统、AWS S3、Google GS或Azure Blob/Data Lake等云提供商、本地或离线Hadoop文件系统以及直接从HTTP或(S)FTP Web服务器、Dropbox或Google Drive、或Jupyter文件系统中读取文件。

 

轻松创建和保存数据帧

  读取文件不是创建cuDF数据帧的唯一方法。事实上,至少有4种方法可以实现:

通过值列表,可以创建具有一列的数据帧:

cudf.DataFrame([1,2,3,4], columns=['foo'])

通过字典,可以创建具有多列的数据帧:

cudf.DataFrame({
      'foo': [1,2,3,4]
    , 'bar': ['a','b','c',None]
})

 

创建一个空数据帧并分配给列:

df_sample = cudf.DataFrame()
df_sample['foo'] = [1,2,3,4]
df_sample['bar'] = ['a','b','c',None]

 

通过元组列表:

cudf.DataFrame([
      (1, 'a')
    , (2, 'b')
    , (3, 'c')
    , (4, None)
], columns=['ints', 'strings'])

 

您还可以在其他内存表示之间进行转换:

  • 从内部GPU矩阵(表示为DeviceNDArray)
  • 通过DLPack内存对象,用于在深度学习框架和Apache Arrow格式之间共享张量,这样可以更方便地使用各种编程语言操作内存对象
  • 转换为pandas数据帧和系列

此外,cuDF支持将存储在数据帧中的数据保存为多种格式和文件系统。事实上,cuDF可以存储所有它可以读取的数据。

所有这些功能使您能够快速上手,无论您的任务是什么,数据存储在哪里。

 

提取、转换和汇总数据

  数据科学的基本任务,也是所有数据科学家抱怨的任务,是清理、特征化和熟悉数据集。我们花费80%的时间在这方面。为什么要花这么多时间呢?

其中一个原因是我们对数据集提出的问题需要花费太长时间来回答。任何试图在CPU上读取和处理2GB数据集的人都知道我们在说什么。

此外,由于我们是人类,我们会犯错误,重新运行一个流程可能很快变成一个整天的练习。这会导致生产力下降,并且可能会导致咖啡成瘾,如果我们看一下下面的图表。

   

通过 GPU 强力工作流程,RAPIDS 解决了所有这些障碍。ETL 阶段通常快8-20倍,因此在 CPU 上加载那个2GB的数据集只需要几秒钟,而不是几分钟,数据的清洗和转换速度也快了几个数量级!所有这些都是在熟悉的界面和最小的代码更改下完成的。

 

在 GPU 上处理字符串和日期

  不超过5年前,在 GPU 上处理字符串和日期被认为几乎是不可能的,超出了像 CUDA 这样的低级编程语言的能力范围。毕竟,GPU 的设计用途是处理图形,即操作大型的整数和浮点数的数组和矩阵,而不是字符串或日期。

RAPIDS 不仅允许您将字符串读入 GPU 内存,还可以提取特征、处理和操作它们。如果您熟悉正则表达式,那么在 GPU 上从文档中提取有用信息现在是一个简单的任务,感谢 cuDF。例如,如果您想要查找并提取文档中与 [a-z]*flow 模式(如 dataflow、workflow 或 flow)匹配的所有单词,您只需要执行以下操作:

df['string'].str.findall('([a-z]*flow)')

从日期中提取有用的特征或查询特定时间段的数据也变得更加简单和快速,这都得益于 RAPIDS。

dt_to = dt.datetime.strptime("2020-10-03", "%Y-%m-%d")
df.query('dttm <= @dt_to')

 

为 Pandas 用户提供 GPU 加速

  使用 RAPIDS,从 CPU 到 GPU 的数据科学栈的转换非常简单。只需要导入 cuDF 而不是 pandas,就可以获得巨大的好处。无论您是在本地 GPU 服务器上工作还是扩展到完整的数据中心,RAPIDS 的 GPU 加速能力可以提供10-100倍的速度提升(在低端)。这不仅提高了生产力,还允许在最苛刻的大规模场景中高效利用您最喜欢的工具。

​​RAPIDS 真正改变了数据处理的格局,使数据科学家能够在几分钟内完成以前需要数小时甚至数天完成的任务,提高了生产力并降低了总体成本。

要开始将这些技术应用于您的数据集,请阅读 NVIDIA 技术博客上的加速数据分析系列。

编辑注:本文已经获得许可,并在获得许可的情况下,原文改编自 NVIDIA 技术博客。