大家好,当正在使用python处理大型数据集,那么很可能会感受到,当基于CPU的pandas DataFrame
难以执行操作时,等待数小时才能完成查询的挫败感。正是在这种情况下,pandas
用户应该考虑使用RAPIDS cuDF利用GPU的强大功能进行数据处理。
RAPIDS cuDF具有类似于pandas
的API,使数据科学家和工程师只需修改几行代码,就能迅速挖掘GPU上并行计算的巨大潜力。很多用户不熟悉GPU加速,本文将简单介绍RAPIDS生态系统,并展示cuDF(基于GPU加速的pandas DataFrame
对应程序)的最常用功能。
cuDF如何让数据科学工作变得更快
cuDF是RAPIDS GPU加速库套件的数据科学构建模块,它是一种EDA工具,可以用它来搭建允许的数据管道,以处理数据并获得新的特征。作为RAPIDS套件中的基本组件,cuDF是其他库的基础,巩固了其作为通用构建模块的作用。与RAPIDS套件中的所有组件一样,cuDF采用CUDA后端来支持GPU计算。不过,cuDF采用简单而熟悉的Python界面,用户无需直接与该层交互。
无论是处理字符串数据还是处理时间序列数据,都可以通过多种方式使用cuDF 来推动数据工作向前发展。
-
时间序列分析:无论是重新采样数据、提取特征还是进行复杂计算,cuDF都能大幅提高速度,在时间序列分析方面可能比
pandas
快880倍。 -
实时探索性数据分析(EDA):使用传统工具浏览大型数据集可能会很繁琐,但cuDF的GPU加速处理能力使实时探索最大的数据集成为可能。
-
机器学习(ML)数据准备:利用cuDF的加速功能,加快数据转换任务,并为常用的ML算法(如回归、分类和聚类)准备数据。高效的处理意味着更快的模型开发,使开发者能够更快地实现部署。
-
大规模数据可视化:无论是为地理数据创建热图,还是可视化复杂的金融趋势,开发人员都可以通过使用cuDF和
cuxfilter
,部署具有高性能和高FPS数据可视化功能的数据可视化库。这种集成使实时交互性成为分析周期的重要组成部分。 -
大规模数据过滤和转换:对于超过几千兆字节的大型数据集,使用cuDF执行过滤和转换任务所需的时间仅为使用
pandas
时间的一小部分。 -
字符串数据处理:传统上,由于文本数据的复杂性,字符串数据处理一直是一项具有挑战性的缓慢任务。使用GPU加速后,这些操作变得轻松自如
-
GroupBy操作:GroupBy操作是数据分析中的常见操作,但可能会消耗大量资源。cuDF可显著加快这些任务的速度,使得在大型数据集上执行GroupBy操作变得更加高效。
熟悉的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网络服务器、Dropbox或Google Drive或Jupyter文件系统读取文件。
轻松创建和保存DataFrame
读取文件并不是创建cuDF DataFrame的唯一方式,至少有4种方法可以做到这一点。
通过值列表,可以创建只有一列的DataFrame:
cudf.DataFrame([1,2,3,4], columns=['foo'])
如果要创建包含多列的DataFrame,可传递一个字典:
cudf.DataFrame({
'foo': [1,2,3,4]
, 'bar': ['a','b','c',None]
})
创建空DataFrame并为列赋值:
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)。
-
通过用于在深度学习框架和Apache Arrow格式之间共享张量的DLPack内存对象,这种格式可以更方便地操作各种编程语言的内存对象。
-
与pandas DataFrames和Series之间的转换。
此外,cuDF还支持将存储在DataFrame中的数据保存为多种格式和文件系统。事实上,cuDF可以将数据存储在它可以读取的所有格式中。
所有这些功能都使得无论任务是什么或数据位于何处,都可以轻松创建和保存DataFrame,并将它们加载到GPU中以快速进行数据处理和分析。
提取、转换和汇总数据
数据科学的基本任务就是清理、特征化和熟悉数据集,几乎所有数据科学家花了80%的时间来做这项工作。花费这么多时间的原因之一是向数据集提出的问题需要很长时间才能回答,任何尝试过在CPU上读取和处理2GB数据集的人都知道这一点。
此外,由于我们是人而不是机器,也会犯错,因此重新运行流程可能很快就会变成一整天的工作,这导致生产率下降,如下图所示。
使用GPU与CPU工作流程的开发人员的典型工作日对比
RAPIDS采用GPU驱动的工作流程,可减轻所有这些障碍。ETL阶段的速度通常要快8-20倍,因此加载2GB数据集的时间只需几秒钟,而在CPU上需要几分钟,数据清理和转换的速度也快了很多,所有这一切只需一个熟悉的界面和最少的代码改动。
在GPU上处理字符串和日期
不到5年前,在GPU上处理字符串和日期还被认为是几乎不可能的,也是CUDA等低级编程语言所无法实现的。毕竟,GPU 是为处理图形而设计的,也就是说,是为了处理ints
和floats
的大型数组和矩阵,而不是字符串或日期。
RAPIDS不仅可以将字符串读入GPU内存,还可以提取字符串的特征,并对其进行处理和操作。如果熟悉Regex,那么借助cuDF,在GPU上从文档中提取有用信息就变得易如反掌了。例如,如果想找到并提取文档中所有符合[a-z]*flow
模式(如ataflow、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')
利用用GPU加速赋能Pandas用户
使用RAPIDS可以直接从CPU过渡到GPU数据科学堆栈,导入cuDF而不是pandas只是一个小小的改变,却能带来巨大的好处。无论是在本地GPU盒子上工作,还是扩展到成熟的数据中心,RAPIDS的GPU加速能力都能将速度提高10-100倍(低端)。这不仅能提高工作效率,还能有效利用最喜爱的工具,即使在要求最苛刻的大规模场景中也是如此。
RAPIDS真正彻底改变了数据处理的格局,使数据科学家能够在几分钟内完成以往需要数小时甚至数天才能完成的任务,从而提高了生产率,降低了总体成本。