选自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 配置如下:

  • i7–8700k CPU
  • 1080 Ti GPU
  • 32 GB of DDR4 3000MHz RAM
  • CUDA 9.0

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

import numpy as npimport cupy as cpimport time

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

### Numpy and CPUs = time.time()*x_cpu = np.ones((1000,1000,1000))*e = time.time()print(e - s)### CuPy and GPUs = 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 CPUs = time.time()*x_cpu *= 5*e = time.time()print(e - s)### CuPy and GPUs = time.time()*x_gpu *= 5*e = time.time()print(e - s)

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

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

  1. 数组乘以 5
  2. 数组本身相乘
  3. 数组添加到其自身
### Numpy and CPUs = time.time()*x_cpu *= 5x_cpu *= x_cpux_cpu += x_cpu*e = time.time()print(e - s)### CuPy and GPUs = time.time()*x_gpu *= 5x_gpu *= x_gpux_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 所需要处理的数据。

原文链接:https://towardsdatascience.com/heres-how-to-use-cupy-to-make-numpy-700x-faster-4b920dda1f56

pip 加速_如何将Numpy加速700倍?用 CuPy 呀相关推荐

  1. float gpu 加速_根本没有GPU加速

    图形特征的状态 帆布:硬件加速 闪光:硬件加速 Stage3D硬件加速的闪光: Stage3D硬件加速的基线资料:闪光 合成:硬件加速和螺纹 光栅化:软件,硬件加速不可用 螺纹栅格化:禁用 视频解码: ...

  2. pytorch 加速_微软通过DeepSpeed加速PyTorch

    pytorch 加速 微软已经发布DeepSpeed ,一个新的深度学习优化库PyTorch,被设计来减少内存使用和火车模型对现有硬件更好的并行性. 根据Microsoft Research发布新框架 ...

  3. 惊呆了!这样可以将Numpy加速700倍!

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 选自 | towardsdatascience  作者 | Geo ...

  4. 这一招将 Numpy 加速 700 倍!!!

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 选自towardsdatascience 机器之心编译 就其自身来说,Numpy 的速 ...

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

    转自:机器之心 作为 Python 语言的一个扩展程序库,Numpy 支持大量的维度数组与矩阵运算,为 Python 社区带来了很多帮助.借助于 Numpy,数据科学家.机器学习实践者和统计学家能够以 ...

  6. 将Numpy加速700倍——CuPy

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

  7. Docker下载加速:Docker镜像下载加速、pip 下载加速、apt 下载加速

    一.参考资料 docker国内镜像源 二.重要说明 Docker 默认的下载源均在国外,没有VPN的情况下,下载速度都很慢,为此需要设置国内的下载镜像源: Docker 下载加速可从三个方面加速:Do ...

  8. WPA渗透-pyrit:batch-table加速attack_db模块加速_“attack_db”模块加速

    WPA渗透-pyrit:batch-table加速attack_db模块加速_"attack_db"模块加速 1.渗透WIFI 1.导入密码字典 pyrit -i 字典文件 imp ...

  9. ffmpeg 硬件解码rtsp流_树莓派使用硬件加速视频转码

    现在随着智能设备普及以及宽带的升级,越来越的的视频素材在不断的产生.无论是我们自己拍摄的视频,还是从网上收集来的电影.电视剧,并不是全部都值得我们保存最高清的版本.打个比方,比如你下载了一个 1080 ...

  10. 硬件nat关闭还是开启_潜在的NAT加速问题和冲突以及开关建议

    NAT加速华硕已经写在了路由器上的硬件之中.这就是路由在常常说的的路由器硬件加速功能!一般分为CTF(直通转发)和FA(流速加速器),当然本文的内容仅供一般用户配置使用,我们这里不会详细介绍NAT加速 ...

最新文章

  1. Java IO 流 学习 总结
  2. 澳大利亚多地热浪来袭 最高温度超40摄氏度
  3. Anchor的泛化:统一物体检测、实例分割、姿态估计的Point-set Anchor
  4. JavaScript两个变量交换值(不使用临时变量)
  5. 一个很好的性能监测工具dstat
  6. 第二阶段个人冲刺第一天总结
  7. boost::hana::monadic_fold_left用法的测试程序
  8. 2021年香河一中高考成绩查询,2021年廊坊高考状元名单公布,廊坊文理科状元是谁多少分...
  9. pca主成分分析结果解释_主成分分析(PCA)原理精讲 | 统计学专题
  10. JAVA日期处理(Timestamp)
  11. 编写java程序手动挡car_阅读下列说明、图和Java代码,填补空缺。[说明] 已知对某载客车辆(Car)进行类建模,如图13-2所示,其 - 赏学吧...
  12. 智能小车寻迹c语言程序,智能小车循迹记时测速程序
  13. C语言学习-翁凯(第四章笔记)
  14. 国际区号json(含国家中英文名称、简称、区号、首拼)
  15. JavaScript中的onmouseover事件和onmouseout事件实例
  16. 基于 Layui form 组件的省市区级联的实现 - 组件化
  17. dds:publish
  18. 怎么训练神经网络模型,神经网络模型训练过程
  19. Howland电流源
  20. Base64编码解析以及加密、解密实现

热门文章

  1. iphone中input标签会多出一块的解决办法
  2. .NET应用程序调试—原理、工具、方法
  3. 教程 | 如何使用Docker、TensorFlow目标检测API和OpenCV实现实时目标检测和视频处理
  4. paddleocr识别VIN码
  5. Unity HoloLens 开发初识
  6. 扇贝有道180628每日一句
  7. Atitit SpringCache缓存使用 艾提拉 attilax总结 1. Spring的抽象已经做得够好了,适合于大多数场景,非常复杂的就需要自己AOP实现了。 1 1.1. 设置配置文件支持
  8. Atitit 高性能架构之道 attilax著 艾龙 著 1. 应用服务与数据隔离 2 2. 负载均衡你问题 2 2.1. 用户的请求由谁来转发到到具体的应用服务器 2 2.2. 有什么转发的算法
  9. atitit uke产品线 attilax总结.docx 1. 知识聚合 知识检索 产品线 1 2. 爬虫产品线 1 3. 发帖机产品线 1 4. 发动机产品线 1 5. O2o产品线(旅游
  10. Atitit 游戏的通常流程 attilax 总结 基于cocos2d api