https://zhuanlan.zhihu.com/p/80328224
前言
Numpy是Python社区的一份礼物。它允许数据科学家、机器学习实践者和统计学家以一种简单有效的方式处理矩阵式的海量数据。
当你发现Python代码运行缓慢时,特别是看到许多 for-loop循环时,那么将数据处理迁移到Numpy并让其向量化以最快的速度完成工作总是一个好主意!
尽管如此,即使这样加速Numpy也只能在CPU上运行。由于使用者的CPU通常有8个或更少的内核,因此可以加速的速度是有限的。
如何解决这个问题,CuPy来啦!
相关文章
2、10个提高工作效率的Pandas小技巧3、高逼格使用Pandas加速代码,向for循环说拜拜!
什么是CuPy?
CuPy是一个通过利用CUDA GPU库在Nvidia GPU上实现Numpy数组的库。通过这种实现,由于拥有许多CUDA核心GPU,可以实现更好的并行加速。
官网:https://github.com/cupy/cupy
CuPy的接口是Numpy的镜像,在大多数情况下,它可以被直接替代。只要用兼容的CuPy代码替换你的Numpy代码,你就可以加快 GPU 的运行速度。CuPy将支持Numpy的大多数数组操作,包括索引、广播和各种矩阵转换。
你也可以编写自定义Python代码,利用CUDA和GPU加速,如果你有一些特定的东西还不支持的话。 只需要一小段C++格式的代码,CuPy就会自动执行GPU转换,非常类似于使用Cython。
我们可以通过pip安装这个库:
pip install cupy
运行GPU基于CuPy
对于这些基准测试,我们将使用PC机进行以下设置:
- i7–8700k CPU
- 1080 Ti GPU
- 32 GB of DDR4 3000MHz RAM
- CUDA 9.0
一旦安装了CuPy,我们可以像Numpy一样导入它:
import numpy as np
import cupy as cp
import time
对于剩下的代码,在Numpy和CuPy之间切换就像用CuPy的cp替换Numpy中的np一样简单。下面的代码为Numpy和CuPy创建了一个3D数组,其中包含10亿个1。 为了测试创建数组的速度,使用了 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在1.68秒内创建了10亿个1的数组,而CuPy只花了0.16秒,这是10.5倍的加速!
让我们尝试对数组进行一些数学运算。这次我们将整个数组乘以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倍的加速!
现在让我们尝试使用多个数组并执行一些操作:
### 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倍的加速!
总是那么快吗?
使用CuPy是在GPU上多次加速Numpy和矩阵操作的一个很好的方法。需要注意的是,你将获得的加速度在很大程度上取决于所使用数组的大小。下面的表格显示了当我们改变数组的大小时速度上的差异:
一旦:
达到约1000万个数据点,加速度就会急剧上升!
而一旦:
超过1亿个数据点,加速度就会大大加快!
在此之下:
Numpy实际上更快!
还要记住,更多的GPU内存将帮助你处理更多的数据,所以重要的是看看你的GPU是否有足够的内存来容纳足够的数据,而 CuPy是值得的!
来自:https://twitter.com/GeorgeSeif94
—End—