【数据科学】如何使用CuPy使Numpy更快

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

 

 

Numpy一直是Python社区的礼物。它允许数据科学家,机器学习从业者和统计学家以简单有效的方式处理矩阵格式的大量数据。

就速度而言,Numpy本身就是Python的重要一步。每当你发现你的Python代码运行缓慢时,特别是如果你看到很多for循环,那么将数据处理转移到Numpy并让它的矢量化以最快的速度完成工作总是一个好主意!

尽管如此,即使加速,Numpy也只能在CPU上运行。由于消费者CPU通常具有8个核心或更少,因此并行处理量以及因此可以实现的加速量是有限的。

这就是我们的新朋友CuPy进来的地方!


目录

什么是CuPy?

使用CuPy在GPU上运行

总是超级快吗?


 

 

什么是CuPy?

CuPy是一个通过利用CUDA GPU库在Nvidia GPU上实现Numpy阵列的库。通过该实现,由于GPU具有许多CUDA核心,因此可以实现优异的并行加速。

 

CuPy的界面是Numpy的镜像,在大多数情况下,它可以用作直接替代品。只需用兼容的CuPy代码替换你的Numpy代码,就可以获得GPU加速。CuPy将支持Numpy所拥有的大多数阵列操作,包括索引,广播,数组上的数学和各种矩阵变换。

您还可以编写自定义Python代码,如果您具有尚不支持的特定内容,则可以利用CUDA和GPU加速。所需要的只是C ++格式代码的一小部分,CuPy会自动进行GPU转换,非常类似于使用Cython。

要开始使用CuPy,我们可以通过pip安装库:

pip install cupy

 

使用CuPy在GPU上运行

对于这些基准测试,我将使用具有以下设置的PC:

  • i7-8700k CPU
  • 1080 Ti GPU
  • 32 GB DDR4 3000MHz RAM
  • CUDA 9.0

安装CuPy后,我们可以像Numpy一样导入它:

import numpy as np
import cupy as cp
import time

对于其余的编码,在Numpy和CuPy之间切换就像用npCuPy 替换Numpy一样简单cp。下面的代码为Numpy和CuPy创建了一个10亿1的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在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.1X的加速!

现在让我们尝试使用多个数组并执行一些操作。下面的代码将执行以下操作:

  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.16X加速!

 

总是超级快吗?

使用CuPy是在GPU上多次加速Numpy和矩阵操作的好方法。重要的是要注意,您将获得的加速很大程度上取决于您正在使用的阵列的大小。下表显示了我们更改正在处理的数组大小时的速度差异:

一旦我们达到大约1000万个数据点,加速就会大幅提升,一旦我们跨越1亿个点数,速度就会快得多。在那之下,Numpy实际上更快。另外请记住,更多的GPU内存将帮助您处理更多数据,因此,重要的是要了解您的GPU是否有足够的内存来容纳足够的数据,而CuPy是值得的。

 

 

 

你可能感兴趣的:(数据科学)