做为 Python 语言的一个扩展程序库,Numpy 支持大量的维度数组与矩阵运算,为 Python 社区带来了不少帮助。借助于 Numpy,数据科学家、机器学习实践者和统计学家可以以一种简单高效的方式处理大量的矩阵数据。那么 Numpy 速度还能提高吗?本文介绍了如何利用 CuPy 库来加速 Numpy 运算速度。
选自towardsdatascience,做者:George Seif,机器之心编译,参与:杜伟、张倩。
数组
就其自身来讲,Numpy 的速度已经较 Python 有了很大的提高。当你发现 Python 代码运行较慢,尤为出现大量的 for-loops 循环时,一般能够将数据处理移入 Numpy 并实现其向量化最高速度处理。bash
但有一点,上述 Numpy 加速只是在 CPU 上实现的。因为消费级 CPU 一般只有 8 个核心或更少,因此并行处理数量以及能够实现的加速是有限的。app
何为 CuPy?机器学习
CuPy 接口是 Numpy 的一个镜像,而且在大多状况下,它能够直接替换 Numpy 使用。只要用兼容的 CuPy 代码替换 Numpy 代码,用户就能够实现 GPU 加速。工具
若是遇到一些不支持的特殊状况,用户也能够编写自定义 Python 代码,这些代码会利用到 CUDA 和 GPU 加速。整个过程只须要 C++格式的一小段代码,而后 CuPy 就能够自动进行 GPU 转换,这与使用 Cython 很是类似。oop
pip install cupy复制代码
使用 CuPy 在 GPU 上运行
学习
为符合相应基准测试,PC 配置以下:测试
i7–8700k CPUui
1080 Ti GPU编码
32 GB of DDR4 3000MHz RAM
CUDA 9.0
import numpy as npimport cupy as cpimport 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 倍的加速。
好比在数组中作一些数学运算。此次将整个数组乘以 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)复制代码
如今尝试使用更多数组并执行如下三种运算:
数组乘以 5
数组自己相乘
数组添加到其自身
### 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)复制代码
数组大小(数据点)达到 1000 万,运算速度大幅度提高