RAPIDS cuDF是一个类似于pandas的API,可以使数据科学家和工程师能够快速利用GPU上的并行计算潜力,只需修改进行几行代码即可。
如果你正在使用python处理大型数据集,可能有几千兆字节的大小,那么你可能会感到挫败,因为你的基于CPU的pandas DataFrame在执行操作时往往需要几个小时才能完成。这种情况正是pandas用户应该考虑利用RAPIDS cuDF的GPU处理数据的情况。
通过cuDF DataFrame利用GPU
RAPIDS cuDF是RAPIDS GPU加速库套件中的一个数据科学构建模块。它是一个EDA工具,可以用来构建数据流处理管道并处理数据和导出新特征。作为RAPIDS套件中的一个基本组件,cuDF支持其它库,巩固其作为一个共同构建块的角色。和RAPIDS套件中的所有组件一样,cuDF使用CUDA后端来执行GPU计算。
但是,cuDF用户不需要直接与该层进行交互,因为它提供了一个易于使用而熟悉的Python接口。
如何使cuDF加速你的数据科学工作?
你是否厌倦了运行脚本时盯着时钟?无论你是处理字符串数据还是处理时间序列数据,都有很多方法可以使用cuDF推动数据工作的进展。
1.时间序列分析:无论你是重新采样数据、提取特征还是进行复杂的计算,cuDF可以实现大幅加速,对于时间序列分析,速度可能比pandas快880倍。
2.实时探索数据分析(EDA):使用传统工具浏览大型数据集可能很麻烦,但是cuDF的GPU加速处理能力使即使是最大的数据集也可以进行实时探索。
3.机器学习(ML)数据准备:通过cuDF的加速功能加快数据转换任务,为回归、分类和聚类等常用的机器学习算法准备数据,高效处理意味着更快的模型开发,并且使你能够更快地进行部署。
4.大规模数据可视化:无论你是为地理数据创建热力图还是将复杂的金融趋势可视化,开发人员可以使用cuDF和cuxfilter部署具有高性能和高FPS数据可视化的数据可视化库。这种集成使实时交互成为分析周期中的重要组成部分。
5.大规模数据过滤和转换:对于超过几千兆字节的大型数据集,你可以使用cuDF执行过滤和转换任务,而速度只是pandas所需时间的一小部分。
6.字符串数据处理:传统上,由于文本数据的复杂性,字符串数据处理一直是一个具有挑战性和耗时的任务。使用GPU加速可以轻松完成这些操作。
7.GroupBy操作:GroupBy操作是数据分析中的一个重要工具,但是可能会占用大量资源。cuDF显著加速了这些任务,使你在拆分和汇总数据时更快地获得洞察。
熟悉的GPU处理界面
RAPIDS的核心前提是为受欢迎的数据科学工具提供熟悉的用户体验,以便所有从业者都能轻松访问NVIDIA GPU的强大功能。无论你是进行ETL、构建ML模型还是处理图数据,如果你了解pandas、NumPy、scikit-learn或NetworkX,那么在使用RAPIDS时,你会感到如鱼得水。
从CPU到GPU数据科学堆栈的转换非常简单:只需将pandas导入为cuDF,就可以利用NVIDIA GPU的巨大计算能力,将工作负载的处理速度加速10-100倍(最低)并提高工作效率—使用你最喜爱的工具。
检查下面的示例代码,它展示了使用cuDF API对任何使用pandas的人来说是多么熟悉。
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:///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文件系统中读取文件。
轻松创建和保存DataFrame
读取文件并不是创建cuDF DataFrames的唯一方式。实际上,至少有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'])
你还可以将cuDF DataFrame与其他内存表示形式进行转换:
- 从表示为DeviceNDArray的内部GPU矩阵开始
- 通过用于在深度学习框架和Apache Arrow格式之间共享张量的DLPack内存对象,该格式提供了一种从各种编程语言操纵内存对象的更方便的方法
- 与pandas数据框架和系列之间的相互转换
此外,cuDF支持将DataFrame中存储的数据保存为多种格式和文件系统。事实上,cuDF可以以所有它能够读取的格式存储数据。
所有这些功能使你可以迅速启动并运行,无论你的任务是什么或数据位于何处。
提取、转换和汇总数据
清理、特征化和熟悉数据集是数据科学的基本任务,也是所有数据科学家抱怨的任务。我们80%的时间在做这些事情。为什么要花费这么长的时间?
其中一个原因是我们向数据集提出的问题需要太长时间来回答。任何尝试在CPU上读取和处理2GB数据集的人都知道我们在说什么。
使用GPU加速的RAPIDS缓解了所有这些问题。ETL阶段通常快8-20倍,因此加载那个2GB数据集只需几秒钟,而不是在CPU上需要几分钟,数据清理和转换也快了几个量级!所有这些都是通过熟悉的界面和最小的代码更改完成的。
在GPU上处理字符串和日期
不到5年前,在GPU上处理字符串和日期被认为几乎是不可能的,也超出了CUDA这种低级编程语言的范围。毕竟,GPU的设计是用于处理图形,即处理大量的整数和浮点数的数组和矩阵,而不是处理字符串或日期。
RAPIDS允许你不仅将字符串读入GPU内存,而且还可以提取特征、处理和操作它们。如果你熟悉正则表达式,那么由于cuDF的存在,在GPU上从一个文档中提取有用的信息现在是一个简单的任务。例如,如果你想要在文档中找到并提取所有与[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真正地改变了数据处理的格局,使得数据科学家能够在几分钟内完成曾经需要几小时甚至几天才能完成的任务,从而提高了生产力并降低了整体成本。
来源:https://www.kdnuggets.com/2023/07/mastering-gpus-beginners-guide-gpu-accelerated-dataframes-python.html