作为 Python 语言的一个扩展程序库,Numpy 支持大量的维度数组与矩阵运算,为 Python 社区带来了很多帮助。借助于 Numpy,数据科学家、机器学习实践者和统计学家能够以一种简单高效的方式处理大量的矩阵数据。那么 Numpy 速度还能提升吗?本文介绍了如何利用 CuPy 库来加速 Numpy 运算速度。
选自towardsdatascience,作者:George Seif,机器之心编译,参与:杜伟、张倩。
就其自身来说,Numpy 的速度已经较 Python 有了很大的提升。当你发现 Python 代码运行较慢,尤其出现大量的 for-loops 循环时,通常可以将数据处理移入 Numpy 并实现其向量化最高速度处理。
但有一点,上述 Numpy 加速只是在 CPU 上实现的。由于消费级 CPU 通常只有 8 个核心或更少,所以并行处理数量以及可以实现的加速是有限的。
何为 CuPy?
CuPy 接口是 Numpy 的一个镜像,并且在大多情况下,它可以直接替换 Numpy 使用。只要用兼容的 CuPy 代码替换 Numpy 代码,用户就可以实现 GPU 加速。
如果遇到一些不支持的特殊情况,用户也可以编写自定义 Python 代码,这些代码会利用到 CUDA 和 GPU 加速。整个过程只需要 C++格式的一小段代码,然后 CuPy 就可以自动进行 GPU 转换,这与使用 Cython 非常相似。
pip install cupy复制代码
使用 CuPy 在 GPU 上运行
为符合相应基准测试,PC 配置如下:
-
i7–8700k CPU
-
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)复制代码