一、CuPy 介绍
NumPy作为Python科学计算生态的基石,凭借其简洁和丰富的数学函数库以及高效的C语言底层实现,已成为数据科学、机器学习领域不可或缺的工具。然而,NumPy的主要局限在于其计算完全依赖CPU,当面对大规模数据集和高维矩阵运算时,性能瓶颈日益凸显。
而CuPy的出现,几乎可以让用户无感的前提下完成性能的提升,CuPy是一个开源的高性能计算库,旨在利用GPU加速科学计算,作为NumPy的GPU加速替代方案,几乎完整复刻了NumPy的API设计,允许开发者在不修改现有代码的情况下,将计算任务迁移到GPU上执行。甚至用户只需将import numpy as np改为import cupy as cp,即可直接使用GPU加速执行。CuPy不仅支持基础的数组操作,还扩展实现了SciPy中的稀疏矩阵、信号处理等模块,并且还允许用户自定义CUDA内核以应对特定计算需求。
官方文档地址:https://docs.cupy.dev/en/stable/index.html
CuPy 安装
CuPy 版本与 CUDA 的版本对应:
| CUDA | CuPy 版本 |
|---|---|
| v11.2 ~ 11.8 (x86_64 / aarch64) | cupy-cuda11x |
| v12.x (x86_64 / aarch64) | cupy-cuda12x |
| v13.x (x86_64 / aarch64) | cupy-cuda13x |
我的电脑是11.6,这里安装cupy-cuda11x进行测试:
二、Numpy VS CuPy 计算速度对比
Numpy 测试
importtimeimportnumpyasnp# 测试不同规模的矩阵乘法sizes=[10,100,500,1000,2000,5000,8000,10000]forsizeinsizes:a=np.random.randn(size,size)b=np.random.randn(size,size)start=time.time()c=np.dot(a,b)use_time=time.time()-startprint(f"Size{size}x{size}: Use Time:{use_time}s")运行结果:
Numpy 随着计算量的增多耗时逐渐增多。
Cupy 测试
使用相同的代码,将import numpy as np替换为import cupy as np:
importtimeimportcupyasnp## cupy 先预热, 让后续时间计算更准确dummy=np.ones((100,100))_=np.dot(dummy,dummy)# 测试不同规模的矩阵乘法sizes=[10,100,500,1000,2000,5000,8000,10000]forsizeinsizes:a=np.random.randn(size,size)b=np.random.randn(size,size)start=time.time()c=np.dot(a,b)use_time=time.time()-startprint(f"Size{size}x{size}: Use Time:{use_time}s")CuPy 随着计算量的增多,耗时提升不明显。对比 Numpy 速度提升非常明显。