如何用CuPy来对Numpy进行700倍加速

2024-06-21 09:18
文章标签 进行 加速 numpy 700 cupy

本文主要是介绍如何用CuPy来对Numpy进行700倍加速,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


作者:George Seif

编译:ronghuaiyang

导读

给大家试试GPU的威力!

640?wx_fmt=jpeg

Numpy是Python社区的一份大礼。它允许数据科学家、机器学习使用者和统计学家以一种简单有效的方式处理矩阵格式的大量数据。

即使就其本身而言,Numpy在速度方面已经比Python有了很大的提升。当你发现自己Python代码运行缓慢,尤其是如果你看到很多的for循环,使用Numpy总是一个好主意,将数据处理成Numpy并让其向量化工作,可以得到最高速度!

尽管如此,Numpy只在CPU上运行。对于通常只有8个或更少内核的消费级cpu,并行处理的数量以及因此可以达到的加速速度是有限的。

这时候,该我们的新朋友CuPy出场了!

什么是CuPy?

CuPy是一个库,它利用CUDA GPU库在Nvidia GPU上实现Numpy数组的运算功能。有了这个实现,由于gpu的CUDA核有很多,可以实现更好的并行加速。

640?wx_fmt=png

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

  • 32gb的DDR4 3000MHz内存

  • CUDA 9.0

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

 import numpy as np
 import cupy as cp
 import time

对于剩下的代码,在Numpy和CuPy之间切换就像用CuPy的cp替换Numpy的np一样简单。下面的代码为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.507s,CuPy只花了0.000710s,这是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倍加速!

是不是超级快?

使用CuPy是在GPU上多次加速Numpy和矩阵运算的好方法。需要注意的是,你将获得的加速高度依赖于你正在处理的数组的大小。下表显示了我们改变数组大小时的速度差异:

640?wx_fmt=png

一旦我们达到大约1000万个数据点,速度就会大大加快,而一旦超过1亿个数据点,速度就会大大加快。在此之下,Numpy实际上更快。此外,请记住,更多的GPU内存将帮助你处理更多的数据,所以很重要的是看看你的GPU是否有足够的内存,以适应足够的数据,CuPy是值得的。

640?wx_fmt=png

—END—

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

640?wx_fmt=jpeg

请长按或扫描二维码关注本公众号

喜欢的话,请给我个好看吧640?wx_fmt=gif

这篇关于如何用CuPy来对Numpy进行700倍加速的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080816

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

Python对PDF书签进行添加,修改提取和删除操作

《Python对PDF书签进行添加,修改提取和删除操作》PDF书签是PDF文件中的导航工具,通常包含一个标题和一个跳转位置,本教程将详细介绍如何使用Python对PDF文件中的书签进行操作... 目录简介使用工具python 向 PDF 添加书签添加书签添加嵌套书签Python 修改 PDF 书签Pytho

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代

Pandas进行周期与时间戳转换的方法

《Pandas进行周期与时间戳转换的方法》本教程将深入讲解如何在pandas中使用to_period()和to_timestamp()方法,完成时间戳与周期之间的转换,并结合实际应用场景展示这些方法的... 目录to_period() 时间戳转周期基本操作应用示例to_timestamp() 周期转时间戳基