当前位置:首页 > 科技  > 软件

借助Python库CuPy,发掘GPU的威力

来源: 责编: 时间:2023-11-07 09:13:05 153观看
导读译者 | 布加迪审校 | 重楼CuPy简介CuPy是一个Python库,与NumPy和SciPy数组兼容,为GPU加速计算而设计。通过将NumPy换成CuPy语法,您可以在英伟达CUDA或AMD ROCm平台上运行代码。这让您可以使用GPU加速执行与数组相关的任

译者 | 布加迪74O28资讯网——每日最新资讯28at.com

审校 | 重楼74O28资讯网——每日最新资讯28at.com

CuPy简介

CuPy是一个Python库,与NumPy和SciPy数组兼容,为GPU加速计算而设计。通过将NumPy换CuPy语法,您可以在英伟达CUDA或AMD ROCm平台上运行代码。这可以使用GPU加速执行与数组相关的任务,从而更快地处理更庞大的数组。74O28资讯网——每日最新资讯28at.com

只需换掉几行代码,就可以利用GPU的大规模并行处理能力来显著加快索引、规范化和矩阵乘法等数组操作。74O28资讯网——每日最新资讯28at.com

CuPy还支持访问低级CUDA功能。它允许使用RawKernels将ndarray传递给现有的CUDA C/ C++程序,借助Streams简化性能,并允许直接调用CUDA Runtime API。74O28资讯网——每日最新资讯28at.com

安装CuPy

您可以使用pip安装CuPy,但在此之前,您必须使用以下命令找到正确的CUDA版本。74O28资讯网——每日最新资讯28at.com

74O28资讯网——每日最新资讯28at.com

!nvcc --versionnvcc: NVIDIA (R) Cuda compiler driverCopyright (c) 2005-2022 NVIDIA CorporationBuilt on Wed_Sep_21_10:33:58_PDT_2022Cuda compilation tools, release 11.8, V11.8.89Build cuda_11.8.r11.8/compiler.31833905_0

谷歌Colab的当前版本似乎使用CUDA版本11.8。因此,我们将继续安装cupy-cuda11x版本。74O28资讯网——每日最新资讯28at.com

如果您使用较旧的CUDA版本,我提供了下面的表格来帮助您确定要安装的合适的CuPy软件包。74O28资讯网——每日最新资讯28at.com

74O28资讯网——每日最新资讯28at.com

选择正确的版本后,我们将使用pip安装Python软件包。74O28资讯网——每日最新资讯28at.com

74O28资讯网——每日最新资讯28at.com

pip install cupy-cuda11x

如果您已安装了Anaconda,还可以使用conda命令自动检测并安装CuPy软件的正确版本74O28资讯网——每日最新资讯28at.com

74O28资讯网——每日最新资讯28at.com

conda install -c conda-forge cupy

CuPy基础知识

在本节中,我们将比较CuPy和Numpy的语法,它们相似度为95%。不是使用np,而是用cp代替它。74O28资讯网——每日最新资讯28at.com

我们将先使用Python列表创建NumPy和CuPy数组。之后,我们将计算向量的范数。74O28资讯网——每日最新资讯28at.com

import cupy as cpimport numpy as npx = [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)

正如我们所,我们得到了类似的结果。74O28资讯网——每日最新资讯28at.com

74O28资讯网——每日最新资讯28at.com

Numpy: 7.071067811865475574O28资讯网——每日最新资讯28at.com

Cupy: 7.071067811865475574O28资讯网——每日最新资讯28at.com

为了将NumPy转换CuPy数组,只需使用cp.asarray(X)。74O28资讯网——每日最新资讯28at.com

x_array = np.array([10, 22, 30])x_cp_array = cp.asarray(x_array)type(x_cp_array)cupy.ndarray

或者,使用.get()将CuPy转换Numpy数组。74O28资讯网——每日最新资讯28at.com

x_np_array = x_cp_array.get()type(x_np_array)numpy.ndarray

性能比较

在本节中,我们将比较NumPy和CuPy的性能。74O28资讯网——每日最新资讯28at.com

我们将使用time.time()对代码执行时间进行计时。然后,我们将创建一个3D NumPy数组并执行一些数学函数。74O28资讯网——每日最新资讯28at.com

import time# NumPy and CPU Runtimes = 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 - sprint("Time consumed by NumPy: ", np_time)Time consumed by NumPy: 0.5474584102630615

类似地,我们将创建一个3D CuPy数组,执行数学运算,并进行计时以评测性能74O28资讯网——每日最新资讯28at.com

# CuPy and GPU Runtimes = 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 - sprint("/nTime consumed by CuPy: ", cp_time)Time consumed by CuPy: 0.001028299331665039

为了计算差异,我们将NumPy时间除以CuPy时间,我们使用CuPy获得了500倍以上的性能提升。74O28资讯网——每日最新资讯28at.com

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

注意为了达到更好的效果,建议进行一番预热运行,以尽量减少时间波动。74O28资讯网——每日最新资讯28at.com

除了速度优势外,CuPy还提供了出色的多GPU支持,可以充分利用多个GPU的集体计算能力。74O28资讯网——每日最新资讯28at.com

此外,如果您想比较结果,可以看看我的Colab笔记本。74O28资讯网——每日最新资讯28at.com

结论

总之,CuPy提供了一种在英伟达GPU上加速NumPy代码的简单方法。只需做几个修改,将NumPy替换CuPy,就可以体验到数组计算在速度上有数量级的提升。这种性能提升使您可以处理庞大得多的数据集和模型,从而实现更先进的机器学习和科学计算。74O28资讯网——每日最新资讯28at.com

相关资源:74O28资讯网——每日最新资讯28at.com

  • 说明文档:https://docs.cupy.dev/en/stable/index.html
  • GitHubhttps://github.com/cupy/cupy
  • 示例:https://github.com/cupy/cupy/tree/main/examples
  • APIhttps://docs.cupy.dev/en/stable/reference/

原文标题:Leveraging the Power of GPUs with CuPy in Python,作者:Abid Ali Awan74O28资讯网——每日最新资讯28at.com


74O28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-17375-0.html借助Python库CuPy,发掘GPU的威力

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Golang 中的 Bytes 包详解之Bytes.Buffer

下一篇: 想快速进入人工智能领域的Java程序员?你准备好了吗?

标签:
  • 热门焦点
Top