一文教你实战CuPy:提速Numpy数百倍!

2023-11-10

Numpy 的速度已经较 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 亿三维数组。为了测量创建数组的速度,用户可以使用 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.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 倍。

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

  • 数组乘以 5

  • 数组本身相乘

  • 数组添加到其自身

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 所需要处理的数据。

有朋友表示使用Cupy更慢,猜测可能是如下原因:

1、可以查一下是不是indexing太多了,猜测也可能是帕斯卡架构和图灵架构差异
2、需要英伟达GPU才行
3、Cupy需要来回数据copy的overhead,此处耗时过长

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文教你实战CuPy:提速Numpy数百倍! 的相关文章

  • 查找 with: 块中定义的函数

    这是一些代码理查德 琼斯的博客 http www mechanicalcat net richard log Python Something I m working on 3 with gui vertical text gui labe
  • 使用 python 制作本地服务器应用程序的最佳方法

    我想要简单轻松地集成 python 和 vba 人们 如果他们在阅读本文后亲自见到我 阅读本文可能会杀了我 但我正在使用 django 开发服务器来实现此目的 有没有什么简单又好的方法 仅举个例子 我想使用 python 模块 openpy
  • 将 pandas 数据框中的列减去其第一个值

    我需要将 pandas 数据帧的一列中的所有元素减去其第一个值 在这段代码中 pandas 抱怨 self inferred type 我猜这是循环引用 df Time df Time df Time 0 在这段代码中 pandas 抱怨为
  • Matplotlib 标准化颜色条 (Python)

    我正在尝试使用 matplotlib 当然还有 numpy 绘制轮廓图 它有效 它绘制了它应该绘制的内容 但不幸的是我无法设置颜色条范围 问题是我有很多图 并且需要所有图都具有相同的颜色条 相同的最小值和最大值 相同的颜色 我复制并粘贴了在
  • Dask DataFrame 的逐行处理

    我需要处理一个大文件并更改一些值 我想做这样的事情 for index row in dataFrame iterrows foo doSomeStuffWith row lol doOtherStuffWith row dataFrame
  • 类属性在功能上依赖于其他类属性

    我正在尝试使用静态类属性来定义另一个静态类属性 我认为可以通过以下代码来实现 f lambda s s 1 class A foo foo bar f A foo 然而 这导致NameError name A is not defined
  • Python:随时接受用户输入

    我正在创建一个可以做很多事情的单元 其中之一是计算机器的周期 虽然我将把它转移到梯形逻辑 CoDeSys 但我首先将我的想法放入 Python 中 我将进行计数 只需一个简单的操作 counter 1 print counter 跟踪我处于
  • Pandas:根据列名进行列的成对乘法

    我有以下数据框 gt gt gt df pd DataFrame ap1 X 1 2 3 4 as1 X 1 2 3 4 ap2 X 2 2 2 2 as2 X 3 3 3 3 gt gt gt df ap1 X as1 X ap2 X a
  • 在 Mac 上安装 Pygame 到 Enthought 构建中

    关于在 Mac 上安装 Pygame 有许多未解答的问题 但我将在这里提出我的具体问题并希望得到答案 我在 Mac 上安装 Pygame 时遇到了难以置信的困难 我使用 Enthought 版本 EPD 7 3 2 32 位 它是我的默认框
  • urllib2.urlopen() 是否实际获取页面?

    当我使用 urllib2 urlopen 时 我在考虑它只是为了读取标题还是实际上带回整个网页 IE 是否真的通过 urlopen 调用或 read 调用获取 HTML 页面 handle urllib2 urlopen url html
  • ValueError:无法插入 ID,已存在

    我有这个数据 ID TIME 1 2 1 4 1 2 2 3 我想按以下方式对数据进行分组ID并计算每组的平均时间和规模 ID MEAN TIME COUNT 1 2 67 3 2 3 00 1 如果我运行此代码 则会收到错误 ValueE
  • Python Flask 是否定义了路由顺序?

    在我看来 我的设置类似于以下内容 app route test def test app route
  • 是否可以写一个负的python类型注释

    这可能听起来不合理 但现在我需要否定类型注释 我的意思是这样的 an int Not Iterable a string Iterable 这是因为我为一个函数编写了一个重载 而 mypy 不理解我 我的功能看起来像这样 overload
  • 使用 Doc2vec 后如何解释 Clusters 结果?

    我正在使用 doc2vec 将关注者的前 100 条推文转换为矢量表示形式 例如 v1 v100 之后 我使用向量表示来进行 K 均值聚类 model Doc2Vec documents t size 100 alpha 035 windo
  • Pandas 在特定列将数据帧拆分为两个数据帧

    I have pandas我组成的 DataFrameconcat 一行由 96 个值组成 我想将 DataFrame 从值 72 中分离出来 这样 一行的前 72 个值存储在 Dataframe1 中 接下来的 24 个值存储在 Data
  • Google App Engine 中的自定义身份验证

    有谁知道或知道我可以在哪里学习如何使用 Python 和 Google App Engine 创建自定义身份验证流程 我不想使用 Google 帐户进行身份验证 并且希望能够创建自己的用户 如果不是专门针对 Google App Engin
  • 从 dask 数据框中的日期时间序列获取年份和星期?

    如果我有一个 Pandas 数据框和一个日期时间类型的列 我可以按如下方式获取年份 df year df date dt year 对于 dask 数据框 这是行不通的 如果我先计算 像这样 df year df date compute
  • 如何对字符串列表进行排序?

    在 Python 中创建按字母顺序排序的列表的最佳方法是什么 基本回答 mylist b C A mylist sort 这会修改您的原始列表 即就地排序 要获取列表的排序副本而不更改原始列表 请使用sorted http docs pyt
  • 将 Scikit-Learn OneHotEncoder 与 Pandas DataFrame 结合使用

    我正在尝试使用 Scikit Learn 的 OneHotEncoder 将 Pandas DataFrame 中包含字符串的列替换为 one hot 编码的等效项 我的下面的代码不起作用 from sklearn preprocessin
  • 使用“pythonw”(而不是“python”)运行应用程序时找不到模块

    我尝试了这个最小的例子 from flask import Flask app Flask name app route def hello world return Hello World if name main app run deb

随机推荐

  • JS 事件冒泡和事件捕获

    原文 https www cnblogs com qq9694526 p 5653728 html JS 事件冒泡和事件捕获 本文中关于事件冒泡和事件捕获的描述和例子都是OK的 错就错在后面用jquery去展示了利用事件冒泡的例子有误 其实
  • 常用的快速数学函数(with SSE2 )

    很明显 在工业或者一些智能设备的控制方面 对运行速度的要求总是比较严苛的 有时候 在速度和精度上做一合理的取舍就显得尤为重要了 今天当一个搬运工 带来一些常用的数学库函数 这些函数采用一定的算法对结果进行了高精度的逼近 在工程上应用问题不大
  • Geoserver+mysql+openlayers2

    Geoserver mysql openlayers2 mysql几何数据数据存储参考 DROP TABLE IF EXISTS points CREATE TABLE points id int 11 UNSIGNED NOT NULL
  • AD画PCB,批量修改线宽

    Altium PCB中更改线宽的技巧总结 1 设置altium designer的默认pcb线宽 在布线前直接在设计规则中设置 Design Rules Routing Width 修改这个里面的Preferred Width即可 还可以进
  • [Andrioid开发] Splash界面/用户协议与隐私政策弹窗/界面开发

    Andrioid开发 Splash界面 用户协议与隐私政策弹窗 界面开发 启动页界面开发 首次启动时的启动页用户协议与隐私政策弹窗 只要不点击同意每次打开都会显示弹窗 同意后立即跳转到主界面 当下次再进入软件就是两秒后自动跳转到主界面 实现
  • 建设面向青少年的创客教育实验室

    创客教育的核心是所有学生都是创造者 与为了测试而去记忆知识 创客教育鼓励学生使用他们所知道的去设计和建造项目 这些项目五花八门 可能有黑客 日常物品 音乐编程或使用3D打印机为孩子建立机械假肢 在常规课程中 基础知识部分包括知识背景 项目实
  • Skulpt在线模拟运行Python工具

    1 Skulpt是一个完全依靠浏览器端模拟实现Python运行的工具 2 不需要预处理 插件或服务器端支持 只需编写python并重新载入即可 3 由于代码完全是在浏览器中运行的 所以不必担心 服务器崩溃 问题 github https g
  • Jupyter中使用Pyecharts绘制地图

    背景 根据各省频率绘制地图 根据各省频率绘制地图 可以使用 Pyecharts 绘制 下面是详细的步骤 1 安装 Pyecharts 可以通过 pip install pyecharts 命令安装 2 导入相关库 import pandas
  • Java线程异步执行多个方法

    https jingyan baidu com article 20095761feaa9fcb0721b4d2 html
  • 游戏中的“垂直同步”与“三重缓冲”究竟是个啥?

    从今天开始 我们会开启 小教程 的兄弟栏目 小科普 给大家介绍在配电脑或玩游戏过程中经常会遇到的专业名词 第一期 小科普 我们来讲讲游戏中经常会遇到的一个画面选项 垂直同步 我们曾在一期语音里和大家讲探讨过垂直同步的功用 可惜语音有 60
  • 【XGBoost】第 7 章:使用 XGBoost 发现系外行星

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 递归学习——记忆化搜索

    目录 编辑 一 概念和效果 二 题目 1 斐波那契数 1 题目 2 题目接口 3 解题思路 2 不同的路径 1 题目 2 题目接口 3 解题思路 3 最长增长子序列 1 题目 2 题目接口 3 解题思路 4 猜数字游戏II 1 题目 2 题
  • 各领域机器学习数据集汇总(附下载地址)

    原文地址 大学公开数据集 Stanford 69G大规模无人机 校园 图像数据集 Stanford http cvgl stanford edu projects uav data 人脸素描数据集 CUHK http mmlab ie cu
  • INSTALLING PREVIOUS VERSIONS OF PYTORCH

    COMMANDS FOR VERSIONS gt 1 0 0 v1 7 1 Conda OSX conda conda install pytorch 1 7 1 torchvision 0 8 2 torchaudio 0 7 2 c p
  • kaggle比赛集成指南

    介绍 集成模型是一种能在各种的机器学习任务上提高准确率的强有力技术 在这篇文章中 我会分享我在Kaggle比赛中的集成方法 在第一部分中 我们会讨论从提交文件中建立集成 主要包括 投票集成 平均 排名平均 第二部分我们会讨论 通过 gene
  • Python格式化输出与format函数

    本文主要整理和汇总python一系列的格式化输出方式 打印整数 print I m number d 20 gt gt gt I m number 20 打印浮点数 默认 print This book s weight is f kg 0
  • Python之参数化DDT(包含:openpyxl的初步了解)

    文章目录 前言 一 参数化 DDT 二 初步了解Excel表格操作 总结 前言 记录参数化DDT数据驱动 初步了解Python中openpyxl对Excel表格操作和手动操作表格的区别点 一 参数化 DDT DDT Data Driven
  • 查看npm依赖包最新版本以及下载依赖的指令

    第一步 查看版本 npm view npm包名称 version 第二步 下载依赖 npm install npm包名称 版本号 或 npm i npm包名称
  • Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 报错

    核心错误提示 Dependency annotations org springframework beans factory annotation Autowired required true 项目环境描述 以spring spring
  • 一文教你实战CuPy:提速Numpy数百倍!

    Numpy 的速度已经较 Python 有了很大的提升 尤其出现大量 for loops 循环时 可以将数据处理移入 Numpy 并实现其向量化最高速度处理 但Numpy 加速只是在 CPU 上实现的 由于消费级 CPU 通常只有 8 个核