[Python]战“疫”期,阿里云云效团队在家高效开发实录( 四 )

运行时间从 CPU 上 1min52s , 提升到 GPU 上 17.8s 。
Mars 和 RAPIDS 结合能带来什么? RAPIDS 将 Python 数据科学带到了 GPU , 极大地提升了数据科学的运行效率 。 它们和 Numpy 等一样 , 是命令式的 。 通过和 Mars 结合 , 中间过程将会使用更少的内存 , 这使得数据处理量更大;Mars 也可以将计算分散到多机多卡 , 以提升数据规模和计算效率 。
在 Mars 里使用 GPU 也很简单 , 只需要在对应函数上指定 gpu=True 。 例如创建 tensor、读取 CSV 文件等都适用 。
import mars.tensor as mtimport mars.dataframe as mda = mt.random.uniform(-1, 1, size=(1000, 1000), gpu=True)df = md.read_csv('ml-20m/ratings.csv', gpu=True) 下图是用 Mars 分别在 Scale up 和 Scale out 两个维度上加速蒙特卡洛计算 Pi 这个任务 。 一般来说 , 我们要加速一个数据科学任务 , 可以有这两种方式 , Scale up 是指可以使用更好的硬件 , 比如用更好的 CPU、更大的内存、使用 GPU 替代 CPU等;Scale out 就是指用更多的机器 , 用分布式的方式提升效率 。
[Python]战“疫”期,阿里云云效团队在家高效开发实录
本文插图

可以看到在一台 24 核的机器上 , Mars 计算需要 25.8s , 而通过分布式的方式 , 使用 4 台 24 核的机器的机器几乎以线性的时间提升 。 而通过使用一个 NVIDIA TESLA V100 显卡 , 我们就能将单机的运行时间提升到 3.98s , 这已经超越了4台 CPU 机器的性能 。 通过再将单卡拓展到多卡 , 时间进一步降低 , 但这里也可以看到 , 时间上很难再线性扩展了 , 这是因为 GPU 的运行速度提升巨大 , 这个时候网络、数据拷贝等的开销就变得明显 。
性能测试 我们使用了 https://github.com/h2oai/db-benchmark 的数据集 , 测试了三个数据规模的 groupby 和 一个数据规模的 join 。 而我们主要对比了 pandas 和 DASK 。 DASK 和 Mars 的初衷很类似 , 也是试图并行和分布式化 Python 数据科学 , 但它们的设计、实现、分布式都存在较多差异 , 这个后续我们再撰文进行详细对比 。
测试机器配置是 500G 内存、96 核、NVIDIA V100 显卡 。 Mars 和 DASK 在 GPU 上都使用 RAPIDS 执行计算 。
Groupby 数据有三个规模 , 分别是 500M、5G 和 20G 。
查询也有三组 。
查询一df = read_csv('data.csv')df.groupby('id1').agg({'v1': 'sum'}) 查询二df = read_csv('data.csv')df.groupby(['id1', 'id2']).agg({'v1': 'sum'}) 查询三df = read_csv('data.csv')df.gropuby(['id6']).agg({'v1': 'sum', 'v2': 'sum', 'v3': 'sum'}) 数据大小 500M , 性能结果
[Python]战“疫”期,阿里云云效团队在家高效开发实录
本文插图

数据大小 5G , 性能结果
[Python]战“疫”期,阿里云云效团队在家高效开发实录
本文插图

数据大小 20G , 性能结果
[Python]战“疫”期,阿里云云效团队在家高效开发实录
本文插图

数据大小到 20G 时 , pandas 在查询2会内存溢出 , 得不出结果 。
可以看到 , 随着数据增加 , Mars 的性能优势会愈发明显 。
得益于 GPU 的计算能力 , GPU 运算性能相比于 CPU 都有数倍的提升 。 如果单纯使用 RAPIDS cuDF , 由于显存大小的限制 , 数据来到 5G 都难以完成 , 而由于 Mars 的声明式的特点 , 中间过程对显存的使用大幅得到优化 , 所以整组测试来到 20G 都能轻松完成 。 这正是 Mars + RAPIDS 所能发挥的威力 。


推荐阅读