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

选自towardsdatascience

机器之心编译

就其自身来说,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 np
import cupy as cp
import time

在接下来的编码中,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.000710 秒,速度整整提升了 714.1 倍。

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

  1. 数组乘以 5

  2. 数组本身相乘

  3. 数组添加到其自身

### 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 所需要处理的数据。

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


公众号近期荐读:

GAN整整6年了!是时候要来捋捋了! 

新手指南综述 | GAN模型太多,不知道选哪儿个?

数百篇GAN论文已下载好!搭配一份生成对抗网络最新综述!

CVPR2020之MSG-GAN:简单有效的SOTA

CVPR2020之姿势变换GAN:图像里谁都会劈叉?

CVPR2020之多码先验GAN:预训练模型如何使用?

有点夸张、有点扭曲!速览这些GAN如何夸张漫画化人脸!

见微知细之超分辨率GAN!附70多篇论文下载!

天降斯雨,于我却无!GAN用于去雨如何?

脸部转正!GAN能否让侧颜杀手、小猪佩奇真容无处遁形?

容颜渐失!GAN来预测?

强数据所难!SSL(半监督学习)结合GAN如何?

弱水三千,只取你标!AL(主动学习)结合GAN如何?

异常检测,GAN如何gan ?

虚拟换衣!速览这几篇最新论文咋做的!

脸部妆容迁移!速览几篇用GAN来做的论文

【1】GAN在医学图像上的生成,今如何?

01-GAN公式简明原理之铁甲小宝篇


GAN&CV交流群,无论小白还是大佬,诚挚邀您加入!

一起讨论交流!长按备注【进群】加入:

更多分享、长按关注本公众号:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值