如何将Numpy加速700倍?用 CuPy 呀

时间:2019-09-18 来源: 国内新闻

  原标题:如何将Numpy加速700倍?用 CuPy 呀

  选自towardsdatascience

  作者:George Seif

  参与:杜伟、张倩

  作为 Python 语言的一个扩展程序库,Numpy 支持大量的维度数组与矩阵运算,为 Python 社区带来了很多帮助。

  借助于 Numpy,数据科学家、机器学习实践者和统计学家能够以一种简单高效的方式处理大量的矩阵数据。

  那么 Numpy 速度还能提升吗?

  本文介绍了如何利用 CuPy 库来加速 Numpy 运算速度。

  就其自身来说,Numpy 的速度已经较 Python 有了很大的提升。当你发现 Python 代码运行较慢,尤其出现大量的 for-loops 循环时,通常可以将数据处理移入 Numpy 并实现其向量化最高速度处理。

  但有一点,上述 Numpy 加速只是在 CPU 上实现的。由于消费级 CPU 通常只有 8 个核心或更少,所以并行处理数量以及可以实现的加速是有限的。

  这就催生了新的加速工具——CuPy 库。

  何为 CuPy?

  

  CuPy 是一个借助 CUDA GPU 库在英伟达 GPU 上实现 Numpy 数组的库。基于 Numpy 数组的实现,GPU 自身具有的多个 CUDA 核心可以促成更好的并行加速。

  CuPy 接口是 Numpy 的一个镜像,并且在大多情况下,它可以直接替换 Numpy 使用。只要用兼容的 CuPy 代码替换 Numpy 代码,用户就可以实现 GPU 加速。

  CuPy 支持 Numpy 的大多数数组运算,包括索引、广播、数组数学以及各种矩阵变换。

  如果遇到一些不支持的特殊情况,用户也可以编写自定义 Python 代码,这些代码会利用到 CUDA 和 GPU 加速。整个过程只需要 C++格式的一小段代码,然后 CuPy 就可以自动进行 GPU 转换,这与使用 Cython 非常相似。

  在开始使用 CuPy 之前,用户可以通过 pip 安装 CuPy 库:

  pip install cupy

  使用 CuPy 在 GPU 上运行

  为符合相应基准测试,PC 配置如下:

  i7C8700k CPU

  1080 Ti GPU

  32 GB of DDR4 3000MHz RAM

  CUDA 9.0

  CuPy 安装之后,用户可以像导入 Numpy 一样导入 CuPy:

  importnumpy asnp

  importcupy ascp

  importtime

  在接下来的编码中,Numpy 和 CuPy 之间的切换就像用 CuPy 的 cp 替换 Numpy 的 np 一样简单。如下代码为 Numpy 和 CuPy 创建了一个具有 10 亿 1』s 的 3D 数组。为了测量创建数组的速度,用户可以使用 Python 的原生 time 库:

  ### Numpy and CPU

  s=time.time

  *x_cpu=np.ones(( 1000, 1000, 1000))*

  e=time.time

  print(e - s) ### CuPy and GPU

  s=time.time

  *x_gpu=cp.ones(( 1000, 1000, 1000))*

  e=time.time

  print(e - s)

  这很简单!

  令人难以置信的是,即使以上只是创建了一个数组,CuPy 的速度依然快得多。Numpy 创建一个具有 10 亿 1』s 的数组用了 1.68 秒,而 CuPy 仅用了 0.16 秒,实现了 10.5 倍的加速。

  但 CuPy 能做到的还不止于此。

  比如在数组中做一些数学运算。这次将整个数组乘以 5,并再次检查 Numpy 和 CuPy 的速度。

  ### Numpy and CPU

  s=time.time

  *x_cpu *=5*

  e=time.time

  print(e - s) ### CuPy and GPU

  s=time.time

  *x_gpu *=5*

  e=time.time

  print(e - s)

  果不其然,CuPy 再次胜过 Numpy。Numpy 用了 0.507 秒,而 CuPy 仅用了 0. 秒,速度整整提升了 714.1 倍。

  现在尝试使用更多数组并执行以下三种运算:

  数组乘以 5

  数组本身相乘

  数组添加到其自身

  ### Numpy and CPU

  s=time.time

  *x_cpu *=5

  x_cpu *=x_cpu

  x_cpu +=x_cpu*

  e=time.time

  print(e - s) ### CuPy and GPU

  s=time.time

  *x_gpu *=5

  x_gpu *=x_gpu

  x_gpu +=x_gpu*

  e=time.time

  print(e - s)

  结果显示,Numpy 在 CPU 上执行整个运算过程用了 1.49 秒,而 CuPy 在 GPU 上仅用了 0.0922 秒,速度提升了 16.16 倍。

  数组大小(数据点)达到 1000 万,运算速度大幅度提升

  使用 CuPy 能够在 GPU 上实现 Numpy 和矩阵运算的多倍加速。值得注意的是,用户所能实现的加速高度依赖于自身正在处理的数组大小。下表显示了不同数组大小(数据点)的加速差异:

  

  数据点一旦达到 1000 万,速度将会猛然提升;超过 1 亿,速度提升极为明显。Numpy 在数据点低于 1000 万时实际运行更快。此外,GPU 内存越大,处理的数据也就更多。所以用户应当注意,GPU 内存是否足以应对 CuPy 所需要处理的数据。

  原文链接:

  本文为机器之心编译,转载请联系本公众号获得授权。返回搜狐,查看更多

  责任编辑:

  来源:机器之心Synced

  原标题:如何将Numpy加速700倍?用 CuPy 呀

  选自towardsdatascience

  作者:George Seif

  参与:杜伟、张倩

  作为 Python 语言的一个扩展程序库,Numpy 支持大量的维度数组与矩阵运算,为 Python 社区带来了很多帮助。

  借助于 Numpy,数据科学家、机器学习实践者和统计学家能够以一种简单高效的方式处理大量的矩阵数据。

  那么 Numpy 速度还能提升吗?

  本文介绍了如何利用 CuPy 库来加速 Numpy 运算速度。

  就其自身来说,Numpy 的速度已经较 Python 有了很大的提升。当你发现 Python 代码运行较慢,尤其出现大量的 for-loops 循环时,通常可以将数据处理移入 Numpy 并实现其向量化最高速度处理。

  但有一点,上述 Numpy 加速只是在 CPU 上实现的。由于消费级 CPU 通常只有 8 个核心或更少,所以并行处理数量以及可以实现的加速是有限的。

  这就催生了新的加速工具——CuPy 库。

  何为 CuPy?

  

  CuPy 是一个借助 CUDA GPU 库在英伟达 GPU 上实现 Numpy 数组的库。基于 Numpy 数组的实现,GPU 自身具有的多个 CUDA 核心可以促成更好的并行加速。

  CuPy 接口是 Numpy 的一个镜像,并且在大多情况下,它可以直接替换 Numpy 使用。只要用兼容的 CuPy 代码替换 Numpy 代码,用户就可以实现 GPU 加速。

  CuPy 支持 Numpy 的大多数数组运算,包括索引、广播、数组数学以及各种矩阵变换。

  如果遇到一些不支持的特殊情况,用户也可以编写自定义 Python 代码,这些代码会利用到 CUDA 和 GPU 加速。整个过程只需要 C++格式的一小段代码,然后 CuPy 就可以自动进行 GPU 转换,这与使用 Cython 非常相似。

  在开始使用 CuPy 之前,用户可以通过 pip 安装 CuPy 库:

  pip install cupy

  使用 CuPy 在 GPU 上运行

  为符合相应基准测试,PC 配置如下:

  i7C8700k CPU

  1080 Ti GPU

  32 GB of DDR4 3000MHz RAM

  CUDA 9.0

  CuPy 安装之后,用户可以像导入 Numpy 一样导入 CuPy:

  importnumpy asnp

  importcupy ascp

  importtime

  在接下来的编码中,Numpy 和 CuPy 之间的切换就像用 CuPy 的 cp 替换 Numpy 的 np 一样简单。如下代码为 Numpy 和 CuPy 创建了一个具有 10 亿 1』s 的 3D 数组。为了测量创建数组的速度,用户可以使用 Python 的原生 time 库:

  ### Numpy and CPU

  s=time.time

  *x_cpu=np.ones(( 1000, 1000, 1000))*

  e=time.time

  print(e - s) ### CuPy and GPU

  s=time.time

  *x_gpu=cp.ones(( 1000, 1000, 1000))*

  e=time.time

  print(e - s)

  这很简单!

  令人难以置信的是,即使以上只是创建了一个数组,CuPy 的速度依然快得多。Numpy 创建一个具有 10 亿 1』s 的数组用了 1.68 秒,而 CuPy 仅用了 0.16 秒,实现了 10.5 倍的加速。

  但 CuPy 能做到的还不止于此。

  比如在数组中做一些数学运算。这次将整个数组乘以 5,并再次检查 Numpy 和 CuPy 的速度。

  ### Numpy and CPU

  s=time.time

  *x_cpu *=5*

  e=time.time

  print(e - s) ### CuPy and GPU

  s=time.time

  *x_gpu *=5*

  e=time.time

  print(e - s)

  果不其然,CuPy 再次胜过 Numpy。Numpy 用了 0.507 秒,而 CuPy 仅用了 0. 秒,速度整整提升了 714.1 倍。

  现在尝试使用更多数组并执行以下三种运算:

  数组乘以 5

  数组本身相乘

  数组添加到其自身

  ### Numpy and CPU

  s=time.time

  *x_cpu *=5

  x_cpu *=x_cpu

  x_cpu +=x_cpu*

  e=time.time

  print(e - s) ### CuPy and GPU

  s=time.time

  *x_gpu *=5

  x_gpu *=x_gpu

  x_gpu +=x_gpu*

  e=time.time

  print(e - s)

  结果显示,Numpy 在 CPU 上执行整个运算过程用了 1.49 秒,而 CuPy 在 GPU 上仅用了 0.0922 秒,速度提升了 16.16 倍。

  数组大小(数据点)达到 1000 万,运算速度大幅度提升

  使用 CuPy 能够在 GPU 上实现 Numpy 和矩阵运算的多倍加速。值得注意的是,用户所能实现的加速高度依赖于自身正在处理的数组大小。下表显示了不同数组大小(数据点)的加速差异:

  

  数据点一旦达到 1000 万,速度将会猛然提升;超过 1 亿,速度提升极为明显。Numpy 在数据点低于 1000 万时实际运行更快。此外,GPU 内存越大,处理的数据也就更多。所以用户应当注意,GPU 内存是否足以应对 CuPy 所需要处理的数据。

  原文链接:

  本文为机器之心编译,转载请联系本公众号获得授权。返回搜狐,查看更多

  责任编辑:

  声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。

  数组

  time

  gpu

  cpu

  print

  阅读 ()

达到当天最大量

http://dreambags.com.cn

新闻排行
  1. 汽车中有许多小功能,通常隐藏在深处。如果你不仔细看,恐怕你不知道它,无论是几百万辆豪华轿车还是几十万

    汽车中有许多小功能,通常隐藏在深处。如果你不仔细看,恐怕你不知道它,无论是几百万辆豪华轿车还是几十万...

  2.   北洋大时代道德篇(三百六十八):士君子处权门要路,操履要严明,心气要和易,毋少随而近腥膻之羽,亦

      北洋大时代道德篇(三百六十八):士君子处权门要路,操履要严明,心气要和易,毋少随而近腥膻之羽,亦...

  3. 11:44:31播放彩色教室彩票奖号为0112142627+0709.前奖的大小为2:3,012为2:1:2,奇偶比为2:3.后区大小比为2:

    11:44:31播放彩色教室彩票奖号为0112142627+0709.前奖的大小为2:3,012为2:1:2,奇偶比为2:3.后区大小比为2:...

  4. 京东家电卖家关注精细化经营,全面提升门店经营水平作为京东家电卖场精细化经营战略的重要一步,京东家电卖

    京东家电卖家关注精细化经营,全面提升门店经营水平作为京东家电卖场精细化经营战略的重要一步,京东家电卖...

  5. 23:46:42庄的妹妹谈健康穿过杏雨的春天,穿过石榴花的夏天,“一代江山,风景如画,秋天”的秋天即将来临!

    23:46:42庄的妹妹谈健康穿过杏雨的春天,穿过石榴花的夏天,“一代江山,风景如画,秋天”的秋天即将来临!...

  6. 06:33:46AAE英语培训简介:今天,AAE(美国英语学院,AAE)分享了在美国学习的三个常见误解。我希望每个人?

    06:33:46AAE英语培训简介:今天,AAE(美国英语学院,AAE)分享了在美国学习的三个常见误解。我希望每个人?...

  7. Vision2天前我想分享作者|小左我不知道什么时候开始,我觉得我和周围的人都变成了假笑的男孩和傻笑的女孩。

    Vision2天前我想分享作者|小左我不知道什么时候开始,我觉得我和周围的人都变成了假笑的男孩和傻笑的女孩。...

  8. 我想在2天前分享潮汐和和平圈编号:CW-(2)黄棉)关键信息:被发现的老人是严松松,原来故乡的名字是严羽,这片土地的名字是蚂蚁。原来的家乡是玉浦,下头,永安门。70至80年前,由于父亲的去世,母亲带

    我想在2天前分享潮汐和和平圈编号:CW-(2)黄棉)关键信息:被发现的老人是严松松,原来故乡的名字是严羽,这片土地的名字是蚂蚁。原来的家乡是玉浦,下头,永安门。70至80年前,由于父亲的去世,母亲带...

  9. 周四(7月18日),在亚洲市场,白银现货交易价为15.09盎司。当前白银价格在交易日继续稳步上涨,并进一步升

    周四(7月18日),在亚洲市场,白银现货交易价为15.09盎司。当前白银价格在交易日继续稳步上涨,并进一步升...

  10. 在这段关系中,他受到另一方的伤害。当他回头看你时,你如何选择?有人说:“我可以选择原谅。毕竟,这是一

    在这段关系中,他受到另一方的伤害。当他回头看你时,你如何选择?有人说:“我可以选择原谅。毕竟,这是一...

友情链接