我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python3+pycuda实现执行简单GPU计算任务

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python3+pycuda实现执行简单GPU计算任务

技术背景

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

pycuda环境配置

pycuda的安装环境很大程度上取决约显卡驱动本身是否能够安装成功,除了安装pycuda库本身之外,重点是需要确保如下的指令可以运行成功:

[dechin@dechin-manjaro pycuda]$ nvidia-smi
Sun Mar 21 20:26:43 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.45.01    Driver Version: 455.45.01    CUDA Version: 11.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce MX250       Off  | 00000000:3C:00.0 Off |                  N/A |
| N/A   48C    P0    N/A /  N/A |      0MiB /  2002MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

上述返回的结果是一个没有GPU任务情况下的展示界面,包含有显卡型号、显卡内存等信息。如果存在执行的任务,则显示结果如下案例所示:

[dechin@dechin-manjaro pycuda]$ nvidia-smi
Sun Mar 21 20:56:04 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.45.01    Driver Version: 455.45.01    CUDA Version: 11.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce MX250       Off  | 00000000:3C:00.0 Off |                  N/A |
| N/A   47C    P0    N/A /  N/A |     31MiB /  2002MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A     18427      C   python3                            29MiB |
+-----------------------------------------------------------------------------+

我们发现这里多了一个pid为18427的python的进程正在使用GPU进行计算。在运算过程中,如果任务未能够执行成功,有可能在内存中遗留一个进程,这需要我们自己手动去释放。最简单粗暴的方法就是:直接使用kill -9 pid来杀死残留的进程。我们可以使用pycuda自带的函数接口,也可以自己写C++代码来实现GPU计算的相关功能,当然一般情况下更加推荐使用pycuda自带的函数。以下为一部分已经实现的接口函数,比如gpuarray的函数:

再比如cumath的函数:

使用GPU计算向量指数

对于一个向量的指数而言,其实就是将每一个的向量元素取指数。当然,这与前面一篇关于量子门操作的博客中介绍的矩阵指数略有区别,这点要注意区分。

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

# array_exp.py
 
import pycuda.autoinit
import pycuda.gpuarray as ga
import pycuda.cumath as gm
import numpy as np
import sys
 
if sys.argv[1] == '-l':
    length = int(sys.argv[2]) # 从命令行获取参数值
 
np.random.seed(1)
array = np.random.randn(length).astype(np.float32)
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)

这里面我们计算一个随机向量的指数,向量的维度length是从命令行获取的一个参数,上述代码的执行方式和执行结果如下所示:

[dechin@dechin-manjaro pycuda]$ python3 array_exp.py -l 5
[5.0750957  0.5423974  0.58968204 0.34199178 2.3759744 ]
[5.075096   0.5423974  0.58968204 0.34199178 2.3759747 ]

我们先确保两者计算出来的结果是一致的,这里我们可以观察到,两个计算的结果只保障了7位的有效数字是相等的,这一点在大部分的场景下精度都是有保障的。接下来我们使用timeit来统计和对比两者的性能:

# array_exp.py
 
import pycuda.autoinit
import pycuda.gpuarray as ga
import pycuda.cumath as gm
import numpy as np
import sys
import timeit
 
if sys.argv[1] == '-l':
    length = int(sys.argv[2])
 
np.random.seed(1)
array = np.random.randn(length).astype(np.float32)
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 = timeit.timeit('npexp()', setup='from __main__ import npexp', number=n)
    print (t1)
    t2 = timeit.timeit('gmexp()', setup='from __main__ import gmexp', number=n)
    print (t2)

这里也顺便介绍一下timeit的使用方法:这个函数的输入分别是:函数名、函数的导入方式、函数的重复次数。这里需要特别说明的是,如果在函数的导入方式中,不使用__main__函数进行导入,即使是本文件下的python函数,也是无法被导入成功的。在输入的向量达到一定的规模大小时,我们发现在执行时间上相比于numpy有非常大的优势。当然还有一点需要注意的是,由于我们测试的是计算速度,原本使用了get()函数将GPU中计算的结果进行导出,但是这部分其实不应该包含在计算的时间内,因此后来又注释掉了。具体的测试数据如下所示:

[dechin@dechin-manjaro pycuda]$ python3 array_exp.py -l 10000000
26.13127974300005
3.469969915000547

总结概要

使用GPU来进行计算,可以极大程度上的加速我们所需要计算的任务,这得益于GPU强大的自带的并行化技术。pycuda的出现,使得我们不需要手工去写GPU的C或者C++代码也可以调用GPU来进行计算,还提供了众多的python接口可以直接使用。经过测试,本文给出了一些pycuda的基本使用方法示例,以及初步的测试结果,从测试结果中我们进一步明确了pycuda的高性能特性。

到此这篇关于Python3+pycuda实现执行简单GPU计算任务的文章就介绍到这了,更多相关Python pycuda计算GPU内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python3+pycuda实现执行简单GPU计算任务

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python3+pycuda实现执行简单GPU计算任务

GPU的加速技术在深度学习、量子计算领域都已经被广泛的应用。这篇文章就来和大家聊聊Python3如何利用pycuda执行简单GPU计算任务 ,感兴趣的可以了解一下
2023-03-14

怎么使用Python3+pycuda实现执行简单GPU计算任务

今天小编给大家分享一下怎么使用Python3+pycuda实现执行简单GPU计算任务的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一
2023-07-05

Python并行计算简单实现

multiprocessing包是Python中的多进程管理包. Pool(num)类提供一个进程池,然后在多个核中执行这些进程, 其中默认参数num是当前机器CPU的核数.Pool.map(func, iterable[, chunks
2023-01-31

php ignore_user_abort()实现计划(定时执行)任务功能

要实现计划任务功能,可以使用ignore_user_abort()函数来忽略用户中断,并且在后台继续执行脚本。以下是一个示例,展示了如何使用ignore_user_abort()函数来实现计划任务功能:```php// 设置脚本不会在用户断
2023-10-11

使用任务计划功能结合shutdown命令让Win7实现定时自动执行

大家在使用电脑的时候可能会遇到一些需要无人值守让电脑自行执行任务后定时关机的情形,在Win7系统中,我们可以使用“python任务计划”设置功能结合shutdown命令灵活设置任务计划,让Win7系统实现定时自动执行
2023-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录