『阿里云云栖号』阿里云云效团队在家高效开发实录,战“疫”期( 三 )


在之前 , 虽然CUDA已经将GPU编程的门槛降到相当低的一个程度了 , 但对于数据科学家们来说 , 在GPU上处理Numpy、pandas等能处理的数据无异于天方夜谭 。 幸运的是 , NVIDIA开源了RAPIDS数据科学平台 , 它和Mars的部分思想高度一致 , 即使用简单的import替换 , 就可以将Numpy、pandas和scikit-learn的代码移植到GPU上 。
『阿里云云栖号』阿里云云效团队在家高效开发实录,战“疫”期
文章图片
其中 , RAPIDScuDF用来加速pandas , 而RAPIDScuML用来加速scikit-learn 。
对于Numpy来说 , CuPy已经很好地支持用GPU来加速了 , 这样RAPIDS也得以把重心放在数据科学的其他部分 。
CuPy:用GPU加速Numpy还是蒙特卡洛求解Pi 。
importcupyascpN=10**7data=https://pcff.toutiao.jxnews.com.cn/p/20200416/cp.random.uniform(-1,1,size=(N,2))inside=(cp.sqrt((data**2).sum(axis=1))<1).sum()pi=4*inside/Nprint('pi:%.5f'%pi)在我的测试中 , 它将CPU的757ms , 降到只有36ms , 提升超过20倍 , 可以说效果非常显著 。 这正是得益于GPU非常适合计算密集型的任务 。
RAPIDScuDF:用GPU加速pandas将importpandasaspd替换成importcudf , GPU内部如何并行 , CUDA编程这些概念 , 用户都不再需要关心 。
importcudfratings=cudf.read_csv('ml-20m/ratings.csv')ratings.groupby('userId').agg({'rating':['sum','mean','max','min']})运行时间从CPU上的18s提升到GPU上的1.66s , 提升超过10倍 。
RAPIDScuML:用GPU加速scikit-learn同样是k-最邻近问题 。
importcudffromcuml.neighborsimportNearestNeighborsdf=cudf.read_csv('data.csv')nn=NearestNeighbors(n_neighbors=10)nn.fit(df)neighbors=nn.kneighbors(df)运行时间从CPU上1min52s , 提升到GPU上17.8s 。
Mars和RAPIDS结合能带来什么?RAPIDS将Python数据科学带到了GPU , 极大地提升了数据科学的运行效率 。 它们和Numpy等一样 , 是命令式的 。 通过和Mars结合 , 中间过程将会使用更少的内存 , 这使得数据处理量更大;Mars也可以将计算分散到多机多卡 , 以提升数据规模和计算效率 。
在Mars里使用GPU也很简单 , 只需要在对应函数上指定gpu=True 。 例如创建tensor、读取CSV文件等都适用 。
importmars.tensorasmtimportmars.dataframeasmda=mt.random.uniform(-1,1,size=(1000,1000),gpu=True)df=md.read_csv('ml-20m/ratings.csv',gpu=True)下图是用Mars分别在Scaleup和Scaleout两个维度上加速蒙特卡洛计算Pi这个任务 。 一般来说 , 我们要加速一个数据科学任务 , 可以有这两种方式 , Scaleup是指可以使用更好的硬件 , 比如用更好的CPU、更大的内存、使用GPU替代CPU等;Scaleout就是指用更多的机器 , 用分布式的方式提升效率 。
『阿里云云栖号』阿里云云效团队在家高效开发实录,战“疫”期
文章图片
可以看到在一台24核的机器上 , Mars计算需要25.8s , 而通过分布式的方式 , 使用4台24核的机器的机器几乎以线性的时间提升 。 而通过使用一个NVIDIATESLAV100显卡 , 我们就能将单机的运行时间提升到3.98s , 这已经超越了4台CPU机器的性能 。 通过再将单卡拓展到多卡 , 时间进一步降低 , 但这里也可以看到 , 时间上很难再线性扩展了 , 这是因为GPU的运行速度提升巨大 , 这个时候网络、数据拷贝等的开销就变得明显 。
性能测试我们使用了https://github.com/h2oai/db-benchmark的数据集 , 测试了三个数据规模的groupby和一个数据规模的join 。 而我们主要对比了pandas和DASK 。 DASK和Mars的初衷很类似 , 也是试图并行和分布式化Python数据科学 , 但它们的设计、实现、分布式都存在较多差异 , 这个后续我们再撰文进行详细对比 。