MindPandas文档
数据处理及分析是AI训练流程中重要的一环,其中表格数据类型是常见的数据表示形式。当前业界常用的数据分析框架Pandas提供了易用、丰富的接口,但由于其单线程的执行方式,在处理较大数据量时性能较差,同时因为其不支持分布式,导致无法处理超出单机内存的大数据量;另外,由于业界常用的数据分析框架与昇思MindSpore等AI框架是互相独立的,数据需要经过落盘、格式转换等步骤才能被训练,极大影响了使用效率。
MindPandas是一款兼容Pandas接口,同时提供分布式处理能力的数据分析框架,致力于提供支持大数据量、高性能的表格类型数据处理能力,同时又能与训练流程无缝结合,使得昇思MindSpore支持完整AI模型训练全流程的能力。
MindPandas的架构图如下图所示:
最上层提供了与Pandas兼容的API,基于现有Pandas脚本,修改少量代码,即可切换到MindPandas进行分布式执行。
Distributed Query Compiler将API转换成为分布式的基础范式组合(map/reduce/injective_map等),保证了后端逻辑的稳定性,当有新的算子实现时,可尝试转换为已有的通用计算范式组合。
Parallel Execution层提供了两种执行模式:多线程模式和多进程模式,用户可根据自己的实际场景进行选择。
MindPandas将原始数据进行切分,形成多个内部的Partition切片,随后每个Partition在不同的线程或进程同时执行相应的算子逻辑,从而实现数据的并行处理。
最底层提供了插件化的算子执行逻辑,当前主要支持Pandas算子,后续会以插件的形式支持更多类型的算子逻辑。
设计特点
MindPandas可以使用机器上的所有CPU核
相较于原生Pandas的单线程实现,在任何给定时间只能使用一个CPU核,MindPandas可以使用机器上的所有CPU核,或者整个集群的所有CPU核,使用如下所示:
MindPandas可以拓展到整个集群,利用整个集群的内存以及CPU资源,使用如下所示:
MindPandas与现有原生Pandas的API在接口使用上保持一致,设置MindPandas的后端运行模式即可运行脚本,在使用上只需将Pandas的导入替换为:
# import pandas as pd import mindpandas as pd
使用方便快捷,to_pandas接口还与现有Pandas代码的兼容。实现改动小,性能优的效果。
MindPandas性能介绍
MindPandas通过将原始数据分片,在分片的基础上进行分布式并行计算,以此大幅度减少计算时间。
以read_csv为例,使用8核CPU读取900MB大小的csv文件,结果如下所示:
测试场景:
CPU:i7-8565u (4核8线程)
内存:16GB
数据大小:900MB csv文件
API |
pandas |
mindpandas |
---|---|---|
read_csv |
11.53s |
5.62s |
import pandas as pd
import mindpandas as mpd
# pandas
df = pd.read_csv("data.csv")
# MindPandas
mdf = mpd.read_csv("data.csv")
其他常用API如fillna,使用MindPandas均可获得数倍至数十倍不等的加速效果。
测试场景:
CPU:i7-8565u (4核8线程)
内存:16GB
数据大小:800MB (2,000,000行 * 48列)
API |
pandas |
mindpandas |
---|---|---|
fillna |
0.77s |
0.13s |
import pandas as pd
import mindpandas as mpd
mdf = mdf.fillna(1)
# 可根据实际情况设置合适分片数
mpd.set_partition_shape((4, 2))
df = df.fillna(1)
常见的统计类API如max、min、sum、all、any等,在MindPandas中也通过并行化的方式大幅度提高了性能。
测试场景:
CPU:i7-8565u (4核8线程)
内存:16GB
数据大小:2GB (10,000,000行 * 48列)
随着数据大小的增加,MindPandas的分布式并行处理所带来的优势会更明显,如下图所示在不同数据量下的性能对比:
注:MindPandas设为多进程模式,使用32核CPU
未来规划
MindPandas初始版本包含DataFrame、Series、GroupBy和Other类共100+API,后续将会增加对更多API的支持,以及数据的高效流转等功能,敬请期待。
使用MindPandas的典型场景
MindPandas 数据处理
提供与Pandas相同的接口,使用时替换引用的包即可进行分布式并行处理原生数据。