首页 > 其他分享 >Cupy:利用 NVIDIA GPU 来加速计算

Cupy:利用 NVIDIA GPU 来加速计算

时间:2024-05-09 14:47:03浏览次数:25  
标签:CuPy NumPy NVIDIA Cupy time np GPU cp cupy

CuPy是NumPy的GPU加速版本

CuPy 概览

今天我们来聊聊一个在 Python 数据科学领域中日益受到关注的库——CuPy。

什么是 CuPy?

CuPy 是一个开源的 Python 库,它的设计初衷是为了使得在 GPU 上的计算变得简单快捷。
它提供了与 NumPy 非常相似的 API,这意味着如果你已经熟悉 NumPy,那么使用 CuPy 将会非常容易。
CuPy 的亮点在于它能够利用 NVIDIA GPU 来加速计算,这在处理大规模数据时尤其有用。
https://github.com/cupy/cupy
Cupy:利用%20NVIDIA%20GPU%20来加速计算-0

为什么选择 CuPy?

  • 速度提升显著:根据多个来源的数据,CuPy 在某些操作上比 NumPy 快了几十甚至几百倍。这对于数据科学和机器学习等领域的应用来说,意味着更高效的数据处理和分析能力。
  • 易于上手:CuPy 的接口设计遵循 NumPy,这使得那些已经熟悉 NumPy 的用户可以轻松迁移到 CuPy。
  • 广泛的应用场景:从深度学习到图像处理,CuPy 都能提供强大的支持。

安装 CuPy

安装 CuPy 相当简单。你只需要使用 pip 命令:

# For CUDA 11.2 ~ 11.x
pip install cupy-cuda11x

# For CUDA 12.x
pip install cupy-cuda12x

# For AMD ROCm 4.3
pip install cupy-rocm-4-3

# For AMD ROCm 5.0
pip install cupy-rocm-5-

一个简单的例子

让我们来看一个简单的例子,对比一下 NumPy 和 CuPy 在处理同样任务时的速度差异。

import numpy as np
import cupy as cp
import time

# 使用 NumPy 创建一个大数组
start_time = time.time()
numpy_array = np.random.rand(10000, 10000)
numpy_result = numpy_array ** 2
print("NumPy 时间:", time.time() - start_time)

# 使用 CuPy 完成同样的任务
start_time = time.time()
cupy_array = cp.random.rand(10000, 10000)
cupy_result = cupy_array ** 2
print("CuPy 时间:", time.time() - start_time)

NumPy 时间:3.474796772003174
CuPy 时间:0.0693259145678
在这个例子中,我们创建了一个大型数组,并计算了它的平方。
我们会发现,使用 CuPy 完成同样的任务所需的时间远少于 NumPy,速度提升了 50 倍。

一个更酷的性能对比

Cupy:利用%20NVIDIA%20GPU%20来加速计算-1
创建一个 3D NumPy 数组并执行一些数学函数。time.time()

import time

# NumPy and CPU Runtime
s = time.time()
x_cpu = np.ones((1000, 100, 1000))
np_result = np.sqrt(np.sum(x_cpu**2, axis=-1))
e = time.time()
np_time = e - s
print("Time consumed by NumPy: ", np_time)
Time consumed by NumPy: 0.5474584102630615

同样,创建一个 3D CuPy 数组,执行数学运算,并为其计时以提高性能。

# CuPy and GPU Runtime
s = time.time()
x_gpu = cp.ones((1000, 100, 1000))
cp_result = cp.sqrt(cp.sum(x_gpu**2, axis=-1))
e = time.time()
cp_time = e - s
print("\nTime consumed by CuPy: ", cp_time)
Time consumed by CuPy: 0.001028299331665039

为了计算差异,我们将 NumPy 时间除以 CuPy 时间

diff = np_time/cp_time
print(f'\nCuPy is {diff: .2f} X time faster than NumPy')
CuPy is 532.39 X time faster than NumPy

在使用 CuPy 时,我们似乎获得了超过 500 倍的性能提升。

_____                   _ 
    / ____|                 | |
    | |        ___     ___   | |
    | |       / _ \   / _ \  | |
    | |____  | (_) | | (_) | | |
    \_____|  \___/   \___/  |_|

使用示例

在本节中,我们将比较 CuPy 和 Numpy 的语法,它们有 95% 的相似度。

  • 首先使用 Python 列表创建一个 NumPy 和 CuPy 数组,之后我们将计算向量的范数。
import cupy as cp
import numpy as np
x = [3, 4, 5]
x_np = np.array(x)
x_cp = cp.array(x)
l2_np = np.linalg.norm(x_np)
l2_cp = cp.linalg.norm(x_cp)
print("Numpy: ", l2_np)
print("Cupy: ", l2_cp

正如我们所看到的,我们得到了类似的结果。

Numpy:  7.0710678118654755
Cupy:  7.0710678118654755
  • 要将 NumPy 转换为 CuPy 数组,只需使用 .cp.asarray(X)
x_array = np.array([10, 22, 30])
x_cp_array = cp.asarray(x_array)
type(x_cp_array)
cupy.ndarray
  • 或者,使用 将 CuPy 转换为 Numpy 数组。.get()
x_np_array = x_cp_array.get()
type(x_np_array)
numpy.ndarray

CuPy 高级应用示例

  • 图像处理:边缘检测

图像处理是 CuPy 的一个重要应用领域。以下是一个使用 CuPy 进行边缘检测的示例:

import cupy as cp
import cv2

def edge_detection(image_path):
    # 读取图像
    image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    image_gpu = cp.asarray(image)

    # Sobel 边缘检测算子
    sobel_x = cp.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], dtype=cp.float32)
    sobel_y = cp.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]], dtype=cp.float32)

    # 应用算子
    edge_x = cp.abs(cp.signal.convolve2d(image_gpu, sobel_x, mode='same'))
    edge_y = cp.abs(cp.signal.convolve2d(image_gpu, sobel_y, mode='same'))

    # 合并边缘
    edge = cp.sqrt(cp.square(edge_x) + cp.square(edge_y))

    # 将结果转换回 CPU 并显示
    result = cp.asnumpy(edge)
    cv2.imshow('Edge Detection', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 使用示例
edge_detection('path_to_your_image.jpg')

这个示例展示了如何使用 CuPy 在 GPU 上进行图像的边缘检测,这对于图像分析和计算机视觉应用非常有用。

  • 大规模数据运算:矩阵乘法

CuPy 在处理大规模数据运算时表现出色。下面是一个矩阵乘法的示例:

import cupy as cp
import time

# 创建大型随机矩阵
a_gpu = cp.random.rand(10000, 10000)
b_gpu = cp.random.rand(10000, 10000)

# 执行矩阵乘法
start_time = time.time()
c_gpu = cp.dot(a_gpu, b_gpu)
cp.cuda.Stream.null.synchronize()  # 确保计算完成
print("CuPy 矩阵乘法时间:", time.time() - start_time)

这个示例展示了 CuPy 在执行大规模矩阵乘法时的高效性,这对于科学计算和数据分析尤其重要。

  • 深度学习:简单的神经网络

CuPy 也可以用于构建和训练简单的神经网络。以下是一个示例:

import cupy as cp

def sigmoid(x):
    return 1 / (1 + cp.exp(-x))

# 随机初始化权重
weights = cp.random.rand(3, 1)

# 示例输入
inputs = cp.array([[1, 0, 1],
                   [1, 1, 1],
                   [0, 0, 1]])

# 前向传播
outputs = sigmoid(cp.dot(inputs, weights))

print(outputs)

这个示例展示了如何使用 CuPy 进行简单的神经网络前向传播计算。
以上示例展示了 CuPy 在不同领域的应用,包括图像处理、大规模数据运算和深度学习。

Numpy、Cupy 和 Pytorch

CuPy 和 NumPy 之间的区别

别问我有什么区别,问就是几乎一样样。实在要知道到底有什么区别,那就出门左转 https://docs.cupy.dev/en/stable/user_guide/difference.html

Cupy 与 Numpy 互转

import cupy as cp
import numpy as np

# cupy->numpy
numpy_data = cp.asnumpy(cupy_data)

# numpy->cupy
cupy_data = cp.asarray(numpy_data)

Cupy 与 Pytorch 互转

# 需借助中间库 dlpack
# cupy.array<–>Dlpack.Tensor<–>torch.Tensor

from cupy.core.dlpack import toDlpack
from cupy.core.dlpack import fromDlpack
from torch.utils.dlpack import to_dlpack
from torch.utils.dlpack import from_dlpack
import torch

# pytorch->cupy
cupy_data = fromDlpack(to_dlpack(tensor_data))

# cupy->pytorch
tensor_data = from_dlpack(toDlpack(cupy_data)

Numpy 与 Pytorch 互转

import numpy as np
import torch

# pytorch->numpy
numpy_data = tensor_data.numpy()

# numpy->pytorch
tensor_data = torch.from_numpy(numpy_data)

总结

让我们以一张表结束:最快的 CPU VS 最快的 GPU。
Cupy:利用%20NVIDIA%20GPU%20来加速计算-2

CuPy 是一个强大的工具,它能够显著提高数据处理的速度。
对于那些希望在数据科学和机器学习领域进一步提升效率的朋友们,CuPy 绝对值得一试。

标签:CuPy,NumPy,NVIDIA,Cupy,time,np,GPU,cp,cupy
From: https://www.cnblogs.com/luckzack/p/18182236

相关文章

  • pynvml:获取和监控 NVIDIA GPU 设备的信息
    pynvml是一个Python包,用于与NVIDIA的管理库NVML(NVIDIAManagementLibrary)进行交互,以获取和监控NVIDIAGPU设备的信息。它提供了一组函数和类,可以查询GPU设备的状态、显存使用情况、温度、功耗等信息。要使用pynvml包,首先需要安装NVIDIA驱动程序和CUDA工具包。然......
  • Windows下使用ONNXRuntime的GPU进行推理时提示cudnn64_8.dll异常
    一、问题复现将模型放到GPU上推理时时发生的异常。OrtSessionOptionsAppendExecutionProvider_CUDA(session_options,0);...ort_outputs=session_.Run(Ort::RunOptions{nullptr},inputNames.data(),&input_tensor_,1,outNames.data(),outNames.size());二、解......
  • 一个小工具识别哪个docker占用gpu
    我们经常会为了组内谁在占用某块gpu卡而不使用烦恼,通过简单的代码就能快速识别到这块卡上面的进程是哪个容器的。下面的代码会给出如下图这样的结果#!/miniconda3/bin/python#-*-coding:utf-8-*-importpsutilimportsubprocessasspdefpre():ans=sp.che......
  • GpuMalll智算云:重塑AI大模型时代的智能未来
    在数字化浪潮的推动下,人工智能(AI)技术正以前所未有的速度改变着世界。而AI大模型作为这一变革的核心驱动力,正逐步成为科技创新的制高点。GpuMall智算云,作为领先的AI大模型解决方案提供商,致力于为客户提供高效、智能、安全的AI服务,共同开启智能未来。一、GpuMall智算云AI大模型:赋......
  • GPU
     1GPU硬件规格Mali-G610提供相关规格书介绍,其架构图如下:2GPUMali-G610配置3GPUMali-G610子系统启动4GPUMali-G610驱动5GPUMali-G610测试glmark2-es2-drm glmark2-es2-wayland 结果如下:arm_release_verofthislibmaliis'g6p0-01eac0',rk_so_ver......
  • 「云渲染平台」3D模型渲染是CPU还是GPU?
    在数字艺术创作和工程设计这两个领域中,将三维模型转换成逼真的二维图像的过程被称为模型渲染,这是一种对计算资源要求极高的技术活动。在渲染三维模型时,CPU和GPU各自承担着不同的任务。现在,让我们来了解在模型渲染的过程中,主要是消耗CPU资源还是GPU资源。一、模型渲染对CPU和GPU......
  • NVIDIA机器人仿真环境 —— NVIDIA Isaac Sim 的headless模式/无头模式 —— 非桌面模
    相关:https://developer.nvidia.com/isaac-sim可视化模式,也就是在桌面系统上直接安装软件,具体地址:https://developer.nvidia.com/isaac-sim无头模式则是使用docker安装,该种情况下不使用可视化界面,所有操作均在docker容器内,地址:https://catalog.ngc.nvidia.com/orgs/nvid......
  • NVIDIA的ROS项目 —— Isaac ROS
    文档地址:https://nvidia-isaac-ros.github.io/index.htmlGithub地址:https://github.com/NVIDIA-ISAAC-ROS......
  • NVIDIA的Isaac AMR产品介绍
    NVIDIA的IsaacAMR是仓库自动运货机器人项目,说直白些就是一个AGV的小车,不过和传统的AGV不同,NVIDIA推出的这个产品是智能化的。传统AGV小车的运行代码都是写死的,直接把运行命令写到了AGV里面,然后这个小车就只能按照预先的设定来进行运行,但是NVIDIA的这个产品是智能化的,是可以根据实......
  • NVIDIA的人形机器人的基础模型Project GR00T已在实体机器人上进行展示
    原文地址:https://blogs.nvidia.com/blog/isaac-generative-ai-manufacturing-logistics/项目GR00T为人型机器人开发谢幕在GTC上展示,由GR00T驱动的人型机器人可以接受多模态指令——文本、视频和演示——以及它们之前的交互,以产生机器人所需的动作。GR00T在来自不同公司的四个......