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

做为 Python 语言的一个扩展程序库,Numpy 支持大量的维度数组与矩阵运算,为 Python 社区带来了不少帮助。借助于 Numpy,数据科学家、机器学习实践者和统计学家可以以一种简单高效的方式处理大量的矩阵数据。那么 Numpy 速度还能提高吗?本文介绍了如何利用 CuPy 库来加速 Numpy 运算速度。

选自towardsdatascience,做者:George Seif,机器之心编译,参与:杜伟、张倩。
数组

就其自身来讲,Numpy 的速度已经较 Python 有了很大的提高。当你发现 Python 代码运行较慢,尤为出现大量的 for-loops 循环时,一般能够将数据处理移入 Numpy 并实现其向量化最高速度处理。bash

但有一点,上述 Numpy 加速只是在 CPU 上实现的。因为消费级 CPU 一般只有 8 个核心或更少,因此并行处理数量以及能够实现的加速是有限的。app

这就催生了新的加速工具——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 很是类似。oop

在开始使用 CuPy 以前,用户能够经过 pip 安装 CuPy 库:
pip install cupy复制代码

使用 CuPy 在 GPU 上运行
学习

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

  • i7–8700k CPUui

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

相关文章
相关标签/搜索