在Python中利用CuPy发挥GPU的强大能力

充分发挥GPU强大的能力:Python中的CuPy应用

什么是CuPy?

CuPy 是一个与NumPy和SciPy数组兼容的Python库,专为GPU加速计算而设计。通过用CuPy语法替换NumPy,您可以在NVIDIA CUDA或AMD ROCm平台上运行代码。这使您可以使用GPU加速执行与数组相关的任务,从而加快较大数组的处理速度。

通过仅更改几行代码,您可以利用GPU的大规模并行处理能力来显着加快数组操作,如索引,归一化和矩阵乘法。

CuPy还可以访问低级CUDA功能。它允许使用RawKernels将ndarrays传递给现有的CUDA C / C ++程序,通过流将性能流线型,以及启用对CUDA Runtime API的直接调用。

安装CuPy

您可以使用pip安装CuPy,但在此之前,您必须使用以下命令找到正确的CUDA版本。

 !nvcc --版本 

  nvcc:NVIDIA(R)Cuda编译器驱动程序版权所有(c)2005-2022 NVIDIA Corporation建于Wed_Sep_21_10:33:58_PDT_2022Cudacompilation工具,版本11.8,V11.8.89Build cuda_11.8.r11.8/compiler.31833905_0  

当前版本的Google Colab似乎使用的是CUDA版本11.8。因此,我们将继续安装cupy-cuda11x版本。

如果您正在运行较旧的CUDA版本,我提供了下表,以帮助您确定要安装的适当CuPy软件包。

选择正确的版本后,我们将使用pip安装Python软件包。

 pip install cupy-cuda11x  

如果您安装了Anaconda,您还可以使用conda命令自动检测和安装正确版本的CuPy软件包。

 conda install -c conda-forge cupy  

CuPy基础

在本节中,我们将比较CuPy的语法与Numpy相似度达到95%。您将使用 cp 而不是 np

我们首先将使用Python列表创建一个NumPy和CuPy数组。然后,我们将计算向量的范数。

  import cupy与即为np导入 as np 
    x = [3, 4, 5] 
    x_np = np.array(x) 
    x_cp = cp.array(x)
    l2_np = np.linalg.norm(x_np) 
    l2_cp = cp.linalg.norm(x_cp) 
    print(“ Numpy:”,l2_np) 
    print(“ CuPY:”,l2_cp)  

正如我们所看到的,我们获得了类似的结果。

  Numpy:7.0710678118654755 
    Cupy:7.0710678118654755  

要将NumPy转换为CuPy数组,您可以简单地使用 cp.asarray(X)

  x_array = np.array([10, 22, 30])
    x_cp_array = cp.asarray(x_array) 
    type(x_cp_array)  

  cupy.ndarray  

或使用 .get()将CuPy转换为NumPy数组。

  x_np_array = x_cp_array.get() 
    type(x_np_array)  

 

numpy.ndarray

 

性能比较

 

在这一部分中,我们将比较NumPy和CuPy的性能。

我们将使用time.time()来计时代码的执行时间。然后,我们将创建一个3D的NumPy数组,并执行一些数学运算。

import time# NumPy和CPU运行时间start_time = time.time()x_cpu = np.ones((1000, 100, 1000))np_result = np.sqrt(np.sum(x_cpu**2, axis=-1))end_time = time.time()np_time = end_time - start_timesprint("NumPy消耗的时间:", np_time)

 

NumPy消耗的时间:0.5474584102630615

 

类似地,我们将创建一个3D的CuPy数组,执行数学运算,并计算其性能。

#CuPy和GPU运行时间start_time = time.time()x_gpu = cp.ones((1000, 100, 1000))cp_result = cp.sqrt(cp.sum(x_gpu**2, axis=-1))end_time = time.time()cp_time = end_time - start_timesprint("\nCuPy消耗的时间:", cp_time)

 

CuPy消耗的时间:0.001028299331665039

 

为了计算差异,我们将NumPy的时间除以CuPy的时间。看起来使用CuPy时,性能提升了500倍以上。

diff = np_time/cp_timeprint(f'\nCuPy比NumPy快 {diff: .2f} 倍')

 

CuPy比NumPy快 532.39 倍

 

注意:为了获得更好的结果,建议进行一些预热运行,以减小计时波动。

 

除了速度优势外,CuPy还提供了卓越的多GPU支持,可以实现多个GPU的集体计算能力。

此外,如果您想比较结果,可以查看我的Colab笔记本

 

结论

 

总之,CuPy提供了一种简单的方法来加速在NVIDIA GPU上运行的NumPy代码。只需对代码进行少量修改,将NumPy替换为CuPy,您就可以在数组计算中获得数量级的加速。这种性能提升使您能够处理更大的数据集和模型,从而实现更高级的机器学习和科学计算。

 

资源

 

  

****[Abid Ali Awan](https://www.polywork.com/kingabzpro)****@1abidaliawan)是一名认证的数据科学家,热衷于构建机器学习模型。目前,他专注于内容创作,并在机器学习和数据科学技术方面撰写技术博客。Abid拥有技术管理硕士学位和电信工程学士学位。他的愿景是利用图神经网络为患有心理疾病的学生构建AI产品。