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

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

本文主要是介绍如何用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

相关文章

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

时间服务器中,适用于国内的 NTP 服务器地址,可用于时间同步或 Android 加速 GPS 定位

NTP 是什么?   NTP 是网络时间协议(Network Time Protocol),它用来同步网络设备【如计算机、手机】的时间的协议。 NTP 实现什么目的?   目的很简单,就是为了提供准确时间。因为我们的手表、设备等,经常会时间跑着跑着就有误差,或快或慢的少几秒,时间长了甚至误差过分钟。 NTP 服务器列表 最常见、熟知的就是 www.pool.ntp.org/zo

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述。以下是从不同角度对气象站的种类和应用范围的介绍: 一、气象站的种类 根据用途和安装环境分类: 农业气象站:专为农业生产服务,监测土壤温度、湿度等参数,为农业生产提供科学依据。交通气象站:用于公路、铁路、机场等交通场所的气象监测,提供实时气象数据以支持交通运营和调度。林业气象站:监测林区风速、湿度、温度等气象要素,为林区保护和

企业如何进行员工的网络安全意识培训?

企业网络安全意识培训的重要性         企业网络安全意识培训是提升员工网络安全素质的关键环节。随着网络技术的快速发展,企业面临的网络安全威胁日益增多,员工的网络安全意识和技能水平直接关系到企业的信息安全和业务连续性。因此,企业需要通过系统的网络安全意识培训,提高员工对网络安全的认识和防范能力,从而降低企业在面对潜在安全风险时的损失和影响。 企业网络安全意识培训的方法         企

使用JWT进行安全通信

在现代Web应用中,安全通信是至关重要的。JSON Web Token(JWT)是一种流行的安全通信方式,它允许用户和服务器之间安全地传输信息。JWT是一种紧凑的、URL安全的表示方法,用于在两方之间传输信息。本文将详细介绍JWT的工作原理,并提供代码示例帮助新人理解和实现JWT。 什么是JWT? JWT是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSO

ccp之间是不可以直接进行+,-的,要用ccpSub和ccpAdd。

1.  http://www.cnblogs.com/buaashine/archive/2012/11/12/2765691.html  上面有好多的关于数学的方面的知识,cocos2dx可能会用到的 2.学到了   根据tilemap坐标得到层上物体的id int oneTiled=flagLayer->tileGIDt(tilePos);

大型网站架构演化(六)——使用反向代理和CDN加速网站响应

随着网站业务不断发展,用户规模越来越大,由于中国复杂的网络环境,不同地区的用户访问网站时,速度差别也极大。有研究表明,网站访问延迟和用户流失率正相关,网站访问越慢,用户越容易失去耐心而离开。为了提供更好的用户体验,留住用户,网站需要加速网站访问速度。      主要手段:使用CDN和反向代理。如图。     使用CDN和反向代理的目的都是尽早返回数据给用户,一方面加快用户访问速

使用 GoPhish 和 DigitalOcean 进行网络钓鱼

配置环境 数字海洋VPS 我创建的丢弃物被分配了一个 IP 地址68.183.113.176 让我们登录VPS并安装邮件传递代理: ssh root@68.183.113.176apt-get install postfix 后缀配置中的点变量到我们在 DigitalOcean 中分配的 IP:mynetworks nano /etc/postfix/main.cf

自动驾驶规划中使用 OSQP 进行二次规划 代码原理详细解读

目录 1 问题描述 什么是稀疏矩阵 CSC 形式 QP Path Planning 问题 1. Cost function 1.1 The first term: 1.2 The second term: 1.3 The thrid term: 1.4 The forth term: 对 Qx''' 矩阵公式的验证 整体 Q 矩阵(就是 P 矩阵,二次项的权重矩阵)