GPU性能测试中的张量和矩阵运算

news2024/11/15 11:10:22

787b18e24277a995f54b30735df4b7a3.gif

正文共:888 字 7 图,预估阅读时间:1 分钟

前面我们使用PyTorch将Tesla M4跑起来之后成了!Tesla M4+Windows 10+Anaconda+CUDA 11.8+cuDNN+Python 3.11,一直有个问题,那就是显存容量的问题。

测试中,使用的Python脚本中有这样几行:

size = (10240, 10240)
input_cpu = torch.randn(size)
input_gpu = input_cpu.to(torch.device('cuda'))

其中,torch是深度学习框架PyTorch库的一个常用缩写;randn是PyTorch中的一个函数,用于生成具有标准正态分布(也称为高斯分布)的随机数(均值为0,方差为1);而size定义了生成张量的形状和大小,(10240, 10240)表示创建一个二维张量,第一维度有1024行,第二维度有1024列,得到一个1024*1024的矩阵,每个点对应一个浮点数,一共有1,048,576个浮点数。

b379c62575aeb3e9f8b62dd477649ef9.png

从输出的数值来看,每个浮点数有4位小数点,整数位至少为1位,还分正负,最多有20万种可能,如果按照2为底数来计算,至少需要2的16次方(262144)才能包含;通过查阅资料,randn生成的浮点数使用float32保存,占用4字节空间。

于是,当我们将张量定义到(102400, 102400)时,出现了内存不足的情况,提示需要41,943,040,000字节,这么算下来每个浮点数确实是占用4字节大小的内存。

当我们将张量定义到(51200, 51200)时,出现了显存不足的情况,提示需要9.77 GB的显存。如果也按照每个浮点数占用4字节大小,一共是10,485,760,000字节,按照1024进制计算,一共是9.765625 GB,跟提示的9.77 GB相符。

如此说来,执行等量的运算,CPU运算占用的内存与GPU运算占用的显存是一样的,那Tesla M4这4 GB的小显存有点吃亏啊,看来得换成24 GB的大显存才好使啊,但是24 GB显存的Tesla P40是全高双插槽的GPU,得换大个的服务器才能使,还得再等等。

ce64661aba27673537497f0315b106b6.png

而按照回显显示的3840MB(3953131520字节)大小,最多可以分配31436*31436个浮点数,实际设置成(30000,30000)执行一下。

82ff6d8657186d40d2101fed51830aea.png

提示CUDA out of memory,还是超了,虽然只需要3.35 GB显存,但为什么会超呢?而且运算中有提示,显存的3.35 GB已经分配给了PyTorch(Of the allocated memory 3.35 GiB is allocated by PyTorch),那为什么会需要两个3.35 GB显存呢?

报错是在output_gpu = torch.mm(input_gpu, input_gpu.t().to(torch.device('cuda')))后面,在这条命令里:

input_gpu是已经在CUDA GPU设备上的张量,对应input_gpu = input_cpu.to(torch.device('cuda')),表示将位于CPU上的张量input_cpu 转移到GPU设备上,约等于input_gpu = torch.randn(size),但实际效果有所不同,具体等会看;

input_gpu.t()中的.t()用于计算并返回张量的转置(行变成列、列变成行);

torch.mm()函数则是进行矩阵乘法运算,即对input_gpu与它的转置input_gpu.t()进行矩阵乘法运算。

那要这么看,我是不是可以仅对GPU进行运算?

import torch
import time
output_gpu = None
size = (30000,30000)
input_gpu = torch.randn(size)
start_time_gpu = time.time()
output_gpu = torch.mm(input_gpu, input_gpu.t())
duration_gpu = time.time() - start_time_gpu
output_gpu = None
print(f"GPU Matrix Multiplication Time: {duration_gpu:.6f} seconds")

9995662431305eb5abba67ad9fcacdb8.png

难道可行?这次GPU没有报错,但出现了一个问题,没有调用GPU设备,还是使用CPU运算的。

调用GPU设备试一下。

import torch
import time
size = (30000,30000)
input_gpu = torch.randn(size, device=torch.device('cuda'))
start_time_gpu = time.time()
output_gpu = torch.mm(input_gpu, input_gpu.t())
duration_gpu = time.time() - start_time_gpu
output_gpu = None
print(f"GPU矩阵乘法运行时间: {duration_gpu:.6f} 秒")

d78734834daa0ac78a4c110a471cebc7.png

接下来,我们考虑为什么会占用2个3.35 GB,应该是input_gpu占用了3.35 GB,之后input_gpu.t()又要占用3.35 GB,导致显存不足;及时如此,生成的结果还可能会占用1个3.35 GB,这样一来,显存明显就不够了。

这样的话,实际应该按照1920 MB来计算张量,也就是(21000,21000),测试一下。

import torch
import time
size = (21000,21000)
input_gpu = torch.randn(size, device=torch.device('cuda'))
start_time_gpu = time.time()
output_gpu = torch.mm(input_gpu, input_gpu.t())
duration_gpu = time.time() - start_time_gpu
print(f"GPU矩阵乘法运行时间: {duration_gpu:.6f} 秒")

f87a1e7646006ce431f573f5a85b00a9.png

果然,就是这个原因,(21000,21000)实际对应1682 MB显存,两倍的话就是3364 MB,加上一部分其他占用,与最终的3450 MB差不多。

按照这个张量,再对比一下CPU和GPU的性能。

import torch
import time
size = (21000,21000)
input_cpu = torch.randn(size)
input_gpu = input_cpu.to(torch.device('cuda'))
# 在CPU上执行矩阵乘法(耗时操作)
start_time_cpu = time.time()
output_cpu = torch.mm(input_cpu, input_cpu.t())
duration_cpu = time.time() - start_time_cpu
# 在GPU上执行同样的操作
start_time_gpu = time.time()
output_gpu = torch.mm(input_gpu, input_gpu.t().to(torch.device('cuda')))
duration_gpu = time.time() - start_time_gpu
print(f"CPU矩阵乘法运行时间: {duration_cpu:.6f} 秒")
print(f"GPU矩阵乘法运行时间: {duration_gpu:.6f} 秒")

2d25a9f38c6c094bab7d3600d06add20.png

CPU耗时为GPU的312倍,说明GPU的运算效率大约是CPU的312倍吧。

cafbaeb2545e36464c1e026dda09b06a.gif

长按二维码
关注我们吧

b5e441ede228c4c6d0a03f13b08ff578.jpeg

7470a81d09032b6c0355492f6649f34c.png

成了!Tesla M4+Windows 10+Anaconda+CUDA 11.8+cuDNN+Python 3.11

人工智能如何发展到AIGC?解密一份我四年前写的机器学习分享材料

一起学习几个简单的Python算法实现

MX250笔记本安装Pytorch、CUDA和cuDNN

复制成功!GTX1050Ti换版本安装Pytorch、CUDA和cuDNN

Windows Server 2019配置多用户远程桌面登录服务器

Windows Server调整策略实现999999个远程用户用时登录

RDP授权119天不够用?给你的Windows Server续个命吧!

使用Python脚本实现SSH登录设备

配置VMware实现从服务器到虚拟机的一键启动脚本

CentOS 7.9安装Tesla M4驱动、CUDA和cuDNN

使用vSRX测试一下IPsec VPN各加密算法的性能差异

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1515824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot的配置文件及其优先级

配置文件 内置配置文件 配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;SpringBoot使用一个全局的配置文件,配置文件名是固定的: application.propertiesapplication.yml 以上…

javaweb篇请求与相应的参数问题

目录 前言 简单传参设置 get请求无法识别 post请求 简单传参问题无法识别的解决问题 注意事项 改法 实体参数 代码展示 今日分享 前言 友友们,大家好,今天来开荒了,今天介绍的是在进行数据请求以及相应的时候,我们不仅仅只是进入一…

Java SE 抽象类与接口(二):接口(下)

2.5 实现多个接口 在Java语言中,类和类之间是单继承关系,一个类只可以有一个父类,即Java中不支持多继承关系,但是一个类可以实现多个接口,下面通过Animal类来具体说明 class Animal {protected String name;public A…

phpcms上传漏洞

原始漏洞 漏洞原理:我们上传一个zip的压缩包,它会解压然后删除其中不是.jpg .gig .png的文件 function check_dir($dir):这是一个PHP函数的定义,它接受一个参数 $dir,代表要检查的目录路径。 $handle opendir($dir)…

MySQL学习Day32——数据库备份与恢复

在任何数据库环境中,总会有不确定的意外情况发生,比如例外的停电、计算机系统中的各种软硬件故障、人为破坏、管理员误操作等是不可避免的,这些情况可能会导致数据的丢失、 服务器瘫痪等严重的后果。存在多个服务器时,会出现主从服…

C语言程序环境和预处理Pt.1 - 预处理指令|预处理操作符

电脑所能识别的语言为二进制指令,而我们所写的C语言代码是文本信息。为了能使计算机识别并执行C语言代码,就需要翻译环境,使C语言代码翻译为二进制的指令。 1.按下编译按钮的幕后 - 程序的翻译环境 从C语言源代码到计算机可识别的二进制文件…

【前端】 响应式布局

目录 1.媒体查询 2.BootStrap 2.1BootStrap引入 2.2BootStrap栅格系统 2.3BootStrap手册查询 1.媒体查询 响应式布局:显示区域改变,布局随之改变,即同一套代码适配不同大小的显示器 媒体查询:检测视口宽度,设置差…

案例分析篇12:可靠性设计考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

信号与系统学习笔记——信号的分类

目录 一、确定与随机 二、连续与离散 三、周期与非周期 判断是否为周期函数 离散信号的周期 结论 四、能量与功率 定义 结论 五、因果与反因果 六、阶跃函数 定义 性质 七、冲激函数 定义 重要关系 作用 一、确定与随机 确定信号:可以确定时间函数…

【AIGC】重磅消息,GPT-4.5 Turbo将在6月发布?

2024 年 AI 辅助研发趋势 文章目录 强烈推荐GPT-4.5 Turbo竞争对手Anthropic的Claude 3谷歌的Gemini 1.5 Pro 总结强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击…

酷开系统走在前列,品牌重启增长,酷开科技成为品牌商合作目标

区别于火热的移动端,手机屏作为私密屏,往往面向的是用户个体,而电视作为家庭连接的重要枢纽,不仅仅定位于公共屏,同时也面向客厅场景发挥着其大屏传播的作用,这里不仅牵扯到大屏营销,也关联着大…

低代码开发平台,快速搭建开源MES系统

MS低代码云MES作为一家专注于提供生产制造数字化方案的服务商,“以客户为中心”、以“数据驱动、智能化、互联化”为企业的核心标签,以低代码平台为切入点,帮助企业构建以人为本的未来供应链生态系统,实现制造企业的智能化转型。 …

基于uniapp的旅游景点入园预约系统 微信小程序0220o

技术要求: a) 操作系统:Windows、Linux等; b) 开发工具:Android Studio、pycharm等; c) 数据库:Oracle、MySQL等; d) 开发语言:python; e) 技术框架:采用MVC模…

【MyBatis面试题】

目录 前言 1.MyBatis执行流程。 2.Mybatis是否支持延迟加载? 3.延迟加载的底层原理知道吗? 4.Mybatis的一级、二级缓存用过吗? 5.Mybatis的二级缓存什么时候会清理缓存中的数据? 总结 前言 本文主要介绍了MyBatis面试题相…

CSS 03

1.选择器 1.1 结构伪类选择器 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>结…

算法基础杂项

1算法最优解 1.首先&#xff0c;保证时间复杂度最低 2.其次&#xff0c;保证空间复杂度最低 3.常数项低不低&#xff0c;一般没人管 2.时间复杂度排序 3.对数器

性能测试-数据库

一、数据库事务机制 ACID描述 1、原子性Atomicity&#xff1a;事务通常由多个语句组成。原子性保证将每个事务视为一个“单元”&#xff0c;该事务要么完全成功&#xff0c;要么完全失败 2、一致性Consistency&#xff1a;“一致”是指数据库中的数据是正确的&#xff0c;不存…

云桥通SD-WAN企业组网与IPLC:广域网连接方案对比

1、技术原理&#xff1a; a.云桥通SD-WAN企业组网&#xff1a;基于软件定义网络技术&#xff0c;通过虚拟化、智能路由和网络功能虚拟化等手段实现多种网络连接的集中管理。 b.IPLC&#xff1a;采用传统电路交换技术&#xff0c;通过物理专线在不同地理位置建立点对点的专用通…

【C语言】求字符串长度,三种方法(库函数,指针运算)简单易懂!

目录 一&#xff0c;strlen函数 1&#xff0c;strlen函数 2&#xff0c;strlen函数使用 二&#xff0c;getchar()函数 1&#xff0c;getchar函数 2&#xff0c;代码 三&#xff0c;指针运算 代码&#xff1a; 四&#xff0c;小结 一&#xff0c;strlen函数 1&#xff…

ATA-2168高压放大器用途有哪些方面

高压放大器是一种电子设备&#xff0c;用于将低电压信号放大为较高电压信号。它在各种应用领域中都具有重要作用。下面西安安泰Aigtek将详细探讨高压放大器的多重应用方面&#xff0c;以及它们在科学、医疗、工业和通信等领域中的关键作用。 一、科学研究 1.1物理学实验 高压放…