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

< 1).sum()pi = 4 * inside / N# 不需要调用 .execute() 了print('pi: %.5f' % pi.fetch())# 目前需要 fetch() 来转成 float 类型 , 后续我们会加入自动转换 Mars DataFrame:pandas 的并行和分布式加速器 看过怎么样轻松把 Numpy 代码迁移到 Mars tensor, 想必读者也知道怎么迁移 pandas 代码了 , 同样也只有两个区别 。 我们还是以 movielens 的代码为例 。
import mars.dataframe as mdratings = md.read_csv('ml-20m/ratings.csv')ratings.groupby('userId').agg({'rating': ['sum', 'mean', 'max', 'min']}).execute() Mars Learn:scikit-learn 的并行和分布式加速器 Mars Learn 也同理 , 这里就不做过多阐述了 。 但目前 Mars learn 支持的 scikit-learn 算法还不多 , 我们也在努力移植的过程中 , 这需要大量的人力和时间 , 欢迎感兴趣的同学一起参与 。
import mars.dataframe as mdfrom mars.learn.neighbors import NearestNeighborsdf = md.read_csv('data.csv')# 输入是 CSV 文件 , 包含 20万个向量 , 每个向量10个元素nn = NearestNeighbors(n_neighbors=10)nn.fit(df)# 这里 fit 的时候也会整体触发执行 , 因此机器学习的高层接口都是立即执行的neighbors = nn.kneighbors(df).fetch()# kneighbors 也已经触发执行 , 只需要 fetch 数据 这里要注意的是 , 对于机器学习的 fit、predict 等高层接口 , Mars Learn 也会立即触发执行 , 以保证语义的正确性 。
RAPIDS:GPU 上的数据科学 相信细心的观众已经发现 , GPU 好像没有被提到 。 不要着急 , 这就要说到 RAPIDS 。
在之前 , 虽然 CUDA 已经将 GPU 编程的门槛降到相当低的一个程度了 , 但对于数据科学家们来说 , 在 GPU 上处理 Numpy、pandas 等能处理的数据无异于天方夜谭 。 幸运的是 , NVIDIA 开源了 RAPIDS 数据科学平台 , 它和 Mars 的部分思想高度一致 , 即使用简单的 import 替换 , 就可以将 Numpy、pandas 和 scikit-learn 的代码移植到 GPU 上 。
[Python]战“疫”期,阿里云云效团队在家高效开发实录
本文插图

其中 , RAPIDS cuDF 用来加速 pandas , 而 RAPIDS cuML 用来加速 scikit-learn 。
对于 Numpy 来说 , CuPy 已经很好地支持用 GPU 来加速了 , 这样 RAPIDS 也得以把重心放在数据科学的其他部分 。
CuPy:用 GPU 加速 Numpy 还是蒙特卡洛求解 Pi 。
import cupy as cp N = 10 ** 7data = http://news.hoteastday.com/a/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 非常适合计算密集型的任务 。
RAPIDS cuDF:用 GPU 加速 pandas 将 import pandas as pd 替换成 import cudf , GPU 内部如何并行 , CUDA 编程这些概念 , 用户都不再需要关心 。
import cudfratings = cudf.read_csv('ml-20m/ratings.csv')ratings.groupby('userId').agg({'rating': ['sum', 'mean', 'max', 'min']}) 运行时间从 CPU 上的 18s 提升到 GPU 上的 1.66s , 提升超过 10 倍 。
RAPIDS cuML:用 GPU 加速 scikit-learn 【[Python]战“疫”期,阿里云云效团队在家高效开发实录】同样是 k-最邻近问题 。
import cudffrom cuml.neighbors import NearestNeighborsdf = cudf.read_csv('data.csv')nn = NearestNeighbors(n_neighbors=10)nn.fit(df)neighbors = nn.kneighbors(df)


推荐阅读