把numpy加速700倍?用cupy吧!

Wang_AI Wang_AI     2022-12-08     203

关键词:

来源:机器之心

作为 Python 语言的一个扩展程序库,Numpy 支持大量的维度数组与矩阵运算,为 Python 社区带来了很多帮助。借助于 Numpy,数据科学家、机器学习实践者和统计学家能够以一种简单高效的方式处理大量的矩阵数据。那么 Numpy 速度还能提升吗?本文介绍了如何利用 CuPy 库来加速 Numpy 运算速度。

就其自身来说,Numpy 的速度已经较 Python 有了很大的提升。当你发现 Python 代码运行较慢,尤其出现大量的 for-loops 循环时,通常可以将数据处理移入 Numpy 并实现其向量化最高速度处理。

但有一点,上述 Numpy 加速只是在 CPU 上实现的。由于消费级 CPU 通常只有 8 个核心或更少,所以并行处理数量以及可以实现的加速是有限的。

这就催生了新的加速工具——CuPy 库。

何为 CuPy?

CuPy 是一个借助 CUDA GPU 库在英伟达 GPU 上实现 Numpy 数组的库。基于 Numpy 数组的实现,GPU 自身具有的多个 CUDA 核心可以促成更好的并行加速。

CuPy 接口是 Numpy 的一个镜像,并且在大多情况下,它可以直接替换 Numpy 使用。只要用兼容的 CuPy 代码替换 Numpy 代码,用户就可以实现 GPU 加速。

CuPy 支持 Numpy 的大多数数组运算,包括索引、广播、数组数学以及各种矩阵变换。

如果遇到一些不支持的特殊情况,用户也可以编写自定义 Python 代码,这些代码会利用到 CUDA 和 GPU 加速。整个过程只需要 C++格式的一小段代码,然后 CuPy 就可以自动进行 GPU 转换,这与使用 Cython 非常相似。

在开始使用 CuPy 之前,用户可以通过 pip 安装 CuPy 库:

pip install cupy

使用 CuPy 在 GPU 上运行

为符合相应基准测试,PC 配置如下:

  • i7–8700k CPU

  • 1080 Ti GPU

  • 32 GB of DDR4 3000MHz RAM

  • CUDA 9.0

CuPy 安装之后,用户可以像导入 Numpy 一样导入 CuPy:

import numpy as np
import cupy as cp
import time

在接下来的编码中,Numpy 和 CuPy 之间的切换就像用 CuPy 的 cp 替换 Numpy 的 np 一样简单。如下代码为 Numpy 和 CuPy 创建了一个具有 10 亿 1』s 的 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 创建一个具有 10 亿 1』s 的数组用了 1.68 秒,而 CuPy 仅用了 0.16 秒,实现了 10.5 倍的加速。

但 CuPy 能做到的还不止于此。

比如在数组中做一些数学运算。这次将整个数组乘以 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 倍。

现在尝试使用更多数组并执行以下三种运算:

  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.16 倍。

数组大小(数据点)达到 1000 万,运算速度大幅度提升

使用 CuPy 能够在 GPU 上实现 Numpy 和矩阵运算的多倍加速。值得注意的是,用户所能实现的加速高度依赖于自身正在处理的数组大小。下表显示了不同数组大小(数据点)的加速差异:

数据点一旦达到 1000 万,速度将会猛然提升;超过 1 亿,速度提升极为明显。Numpy 在数据点低于 1000 万时实际运行更快。此外,GPU 内存越大,处理的数据也就更多。所以用户应当注意,GPU 内存是否足以应对 CuPy 所需要处理的数据。

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

觉得还不错就给我一个小小的鼓励吧!

切片 300MB CuPy 数组比 NumPy 慢约 5 倍

】切片300MBCuPy数组比NumPy慢约5倍【英文标题】:Slicinga300MBCuPyarrayis~5xslowerthanNumPy【发布时间】:2020-03-3117:48:08【问题描述】:我的代码涉及对432x432x400数组进行总计约1000万次切片,以生成用于神经网络训练的批量数据。由于这些... 查看详情

pythongpu加速数据科学|计算距离矩阵在用cupy时快了约100倍

文章目录一、环境配置二、计算距离矩阵CSDN叶庭云:https://yetingyun.blog.csdn.net/一、环境配置利用cuPy的cupyx.scipy.spatial.distance方法计算距离矩阵时,这个distance模块使用pylibraft作为后端,因此还需要安装好pylibraftpackage才行,可以直... 查看详情

pythongpu加速数据科学|计算距离矩阵在用cupy时快了约100倍

文章目录一、环境配置二、计算距离矩阵CSDN叶庭云:https://yetingyun.blog.csdn.net/一、环境配置利用cuPy的cupyx.scipy.spatial.distance方法计算距离矩阵时,这个distance模块使用pylibraft作为后端,因此还需要安装好pylibraftpackage才行,可以直... 查看详情

用cupy(python)计算矩阵的行列式

...0-05-1414:14:58【问题描述】:我目前正在编辑Python中用于GPU加速的Cupy代码。大多数编辑都需要从numpy直接交换到cupy(例如cp.array而不是np.array),但有一些小例外。但是,我在这段代码中遇到了问题,它可以与numpy 查看详情

cupy与numpy的数据类型互转

参考技术A用cupy和numpy直接创建的数组/矩阵,类型是不一样的!无法相互之间进行运算。用type查看二者的数据类型:其实,如果只需要进行大量数组/矩阵间计算,然后将结果存储到某个"容器"之中,以cupy目前实现的函数功能来... 查看详情

为啥我系统上的所有 CuPy 函数都比它们的 NumPy 对应函数慢?

...】:2021-02-0212:10:01【问题描述】:我正在尝试使用CuPy来加速目前主要使用NumPy的python函数。我已经在安装了CUDA10.0的J 查看详情

基于唯一值对 2D Numpy/CuPy 数组进行更快的迭代

...需要的时间非常长。因此,我希望有人可能会提示,如何加速代码:importcu 查看详情

cupy的用处概述

参考技术A前提:传统的数组和矩阵都是通过numpy来设定,然后numpy来调用cpu计算!cupy的作用:数组和矩阵都是通过cupy来设定,然后cupy来调用gpu并行计算!区别与联系:cupy的优势:专门进行大型、高维数组/矩阵的快速计算(非... 查看详情

与 numpy 相比,cupy 代码不够快

】与numpy相比,cupy代码不够快【英文标题】:cupycodeisnotfastenoughcomparedwithnumpy【发布时间】:2019-08-1623:14:34【问题描述】:我是cupy的新手,我一直在使用numpy和cupy来比较执行时间。importcupyimportcupyximportnumpyasnpimporttimedeftest_cupy(a0,a1... 查看详情

cupy或numpy中"数组"与"矩阵"的区别

参考技术Acupy和numpy在矩阵和数组的使用上没有区别,在认识/创建层面有一些区别。在numpy和cupy中,"数组"和"矩阵"数据类型的区别如下:(1)numpy中各种函数创建的"数据类型"的例子:(2)numpy中把原始的"数组转成矩阵"的唯一... 查看详情

在 TX2 上运行 cupy

】在TX2上运行cupy【英文标题】:RunningcupyonTX2【发布时间】:2019-12-3103:28:21【问题描述】:最近我在我的tx2上安装了CUDA10.0和cupy。我在一篇文章中读到,它说cupy比numpy快10倍。所以我运行了这个程序:###NumpyandCPUs=time.time()x_cpu=np.on... 查看详情

将 cupy 转换为 numpy 非常慢

】将cupy转换为numpy非常慢【英文标题】:convertcupytonumpyisveryslow【发布时间】:2020-01-0312:40:57【问题描述】:条件CuPy版本7.0.0操作系统/平台Ubuntu18.04CUDA版本10.1重现代码importcupyasnpimporttimesize=60000000tag=np.zeros(size)#np.random.shuffle(tag)val... 查看详情

TypeError:不允许隐式转换为 NumPy 数组。请使用 `.get()` 显式构造 NumPy 数组。 -CuPy

】TypeError:不允许隐式转换为NumPy数组。请使用`.get()`显式构造NumPy数组。-CuPy【英文标题】:TypeError:ImplicitconversiontoaNumPyarrayisnotallowed.Pleaseuse`.get()`toconstructaNumPyarrayexplicitly.-CuPy【发布时间】:2021-10-0813:13:48【问题描述】:我想在... 查看详情

使用 CuPy 或 NumPy 高效计算分区总和

】使用CuPy或NumPy高效计算分区总和【英文标题】:CalculatepartitionedsumefficientlywithCuPyorNumPy【发布时间】:2020-07-1014:36:30【问题描述】:我有一个很长的数组*,长度为L(我们称之为values),我想对其求和,以及一个相同长度的排序... 查看详情

替换 CuPy 中的 numpy.apply_along_axis

】替换CuPy中的numpy.apply_along_axis【英文标题】:Replacementfornumpy.apply_along_axisinCuPy【发布时间】:2020-05-0804:39:57【问题描述】:我有一个基于NumPy的神经网络,我正在尝试移植到CuPy。我有一个功能如下:importnumpyasnpdeftensor_diag(x):retu... 查看详情

将数组的列作为向量执行“for循环”时,Cupy 比 numpy 慢

】将数组的列作为向量执行“for循环”时,Cupy比numpy慢【英文标题】:Cupyslowerthannumpywhendoinga"forloop"forcolumnsofanarrayasvectors【发布时间】:2019-08-1814:53:21【问题描述】:我正在尝试使用cupy并行化以下操作:我有一个数组。... 查看详情

如何使用cupy循环numpy ndarray?真的会提高执行时间吗?

】如何使用cupy循环numpyndarray?真的会提高执行时间吗?【英文标题】:Howtoloopnumpyndarraybyusingcupy?Iswillreallyimproveexecutiontime?【发布时间】:2019-04-2602:38:59【问题描述】:我有两个相同大小的numpyndarray[512X512]。我想根据其他数组值... 查看详情

用 numpy 加速求解三角线性系统?

】用numpy加速求解三角线性系统?【英文标题】:Speedupsolvingatriangularlinearsystemwithnumpy?【发布时间】:2013-03-1804:44:47【问题描述】:我有一个方阵S(160x160)和一个巨大的矩阵X(160x250000)。两者都是密集的numpy数组。我的目标:找到Q使... 查看详情