python使用GPU,python指定gpu运行

  python使用GPU,python指定gpu运行

  背景GPU加速技术已经广泛应用于深度学习和量子计算领域。其适用的计算模型是内存小的密集型计算场景。如果计算模型内存较大,则需要使用共享内存,这将直接导致数据交互的计算量巨大,通信开销较大。因为pycuda的出现,我们可以直接在python中使用GPU函数,当然也可以直接在python代码中集成一些C代码来构建GPU计算函数。有专门针对pycuda用例的中文开源代码仓库,可以简单参考一些实现实例,但是这个库中的实例数量还是比较有限的,更多的案例可以直接参考pycuda的官方文档。

  Pycuda环境配置pycuda的安装环境很大程度上取决于显卡驱动本身能否安装成功。除了安装pycuda库本身,关键点是要保证下面的指令能够成功运行:

  [de chin @ de chin-manjaro py CUDA]$ NVIDIA-smiSun Mar 21 20:26:43 2021- NVIDIA-SMI 455 . 45 . 01驱动版本:455.45.01 CUDA版本:11.1 - GPU名称Persistence-M Bus-Id Disp。易挥发的不可回收物。ECC Fan Temp Perf Pwr:Usage/Cap Memory-Usage GPU-Util Compute m . MIG m . ===================================================================0 GeForce MX 250 Off 0000000000:3C:00.0 Off N/A N/A 48C p0n/A/N/A 0MiB/2002如果有已执行的任务,显示结果如下:

  [de chin @ de chin-manjaro py CUDA]$ NVIDIA-smiSun Mar 21 20:56:04 2021- NVIDIA-SMI 455 . 45 . 01驱动版本:455.45.01 CUDA版本:11.1 - GPU名称Persistence-M Bus-Id Disp。易挥发的不可回收物。ECC Fan Temp Perf Pwr:Usage/Cap Memory-Usage GPU-Util Compute m . MIG m . =====================================================================0 GeForce MX 250 Off 0000000000:3C:00.0 Off N/A N/A 47C p0n/A/A/N/A 31 MIB/2000在操作过程中,如果任务执行失败,可能会在内存中留下一个进程,需要我们自己手动释放。最简单最残忍的方法就是直接用kill -9 pid杀死剩下的进程。我们可以使用pycuda自带的函数接口,也可以自己编写C代码来实现GPU计算的相关功能。当然,一般来说,更推荐使用pycuda自带的函数。已经实现了以下接口函数,例如gpuarray的接口函数:

  再比如cumath的函数:用GPU计算向量索引。对于一个向量的索引,实际上就是取每个向量元素的索引。当然,这和之前博客里介绍的关于量子门操作的矩阵指数略有不同,要加以区分。

  在下面的例子中,我们比较了numpy和pycuda中实现的指数运算。

  # array _ exp . py import py cuda . autoinitimport py cuda . gpuarray as Gai import py cuda . cumath as GM import numpy as NP import sysif sys . argv[1]=-l :length=int(sys . argv[2])#获取参数值NP . random . seed(1)array=NP . random . randn(length)。astype(NP . float 32)array _ GPU=ga . to _ GPU(array)Exp _ array=NP . Exp(array)print(Exp _ array)Exp _ array _ GPU=GM . Exp(array _ GPU)GPU _ Exp _ array=Exp _ array _ GPU . get()print(GPU _ Exp _ array)这里我们计算一个随机向量的指数,向量的维数长度来自命令行。

  [de chin @ de chin-manjaro py cuda]$ python 3 array _ exp . py-l 5[5.0750957 0.5423974 0.58968204 0.34199178 2.3759744][5.0750975096 0.5423974 0.38968 2.37597]首先,我们确定这里我们可以观察到,两次计算的结果只保证7位数的有效位相等,这在大多数场景下是有保证的。接下来,我们使用timeit来计算和比较两者的性能:

  # array _ exp . py import py cuda . autoinitimport py cuda . gpuarray as Gai import py cuda . cumath as GM import numpy as NP import sys import time itif sys . argv[1]=-l :length=int(sys . argv[2])NP . random . seed(1)array=NP . random . randn(length)。astype(NP . float 32)array _ GPU=ga . to _ GPU(array)def npexp():exp _ array=NP . exp(array)def gmexp():exp _ array _ GPU=GM . exp(array _ GPU)# GPU _ exp _ array=exp _ array _ GPU . get()if _ _ name _ _= _ _ main _ _ :n=1000 t1=time it . time it( npexp(),setup=from __main__ import npexp ,Number=n) print这里需要注意的是,如果__main__函数不用于导入,那么即使是这个文件中的python函数也无法成功导入。当输入向量达到一定大小时,我们发现它在执行时间上比numpy有很大的优势。当然,还有一点需要注意的是,由于我们是在测试计算速度,所以我们本来是用get()函数在GPU中导出计算结果的,但是这部分不应该计入计算时间,所以后来被注释掉了。具体测试数据如下:

  [de chin @ de chin-manjaro py cuda]$ python 3 array _ exp . py-l 100000026.13127974300053.4699699150054使用GPU进行计算可以大大加速我们需要计算的任务,这得益于GPU自带的强大并行化技术。pycuda的出现,让我们不用手工编写GPU的C或C代码,就可以调用GPU进行计算,也提供了很多可以直接使用的python接口。经过测试,本文给出了pycuda的一些基本用法示例和初步测试结果,从中进一步阐明了pycuda的高性能特点。

  版权声明本文首发链接为:https://www.cnblogs.com/dechinphy/p/pycuda.html.

  作者:德钦菲

  更多原创文章请参考:https://www.cnblogs.com/dechinphy/。

  见链接https://documen.tician.de/pycuda/array.html # pycuda . gpuarray . gpuarray

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: