当前位置: 首页 > news >正文

比较CPU和GPU中的矩阵计算

GPU 计算与 CPU 相比能够快多少?在本文中,我将使用 Python 和 PyTorch 线性变换函数对其进行测试。

以下是测试机配置:

CPU:英特尔 i7 6700k (4c/8t) GPU:RTX 3070 TI(6,144 个 CUDA 核心和 192 个 Tensor 核心) 内存:32G 操作系统:Windows 10

无论是cpu和显卡都是目前常见的配置,并不是顶配(等4090能够正常发货后我们会给出目前顶配的测试结果)

NVIDIA GPU 术语解释

CUDA 是Compute Unified Device Architecture的缩写。可以使用 CUDA 直接访问 NVIDIA GPU 指令集,与专门为构建游戏引擎而设计的 DirectX 和 OpenGL 不同,CUDA 不需要用户理解复杂的图形编程语言。但是需要说明的是CUDA为N卡独有,所以这就是为什么A卡对于深度学习不友好的原因之一。

Tensor Cores是加速矩阵乘法过程的处理单元。

例如,使用 CPU 或 CUDA 将两个 4×4 矩阵相乘涉及 64 次乘法和 48 次加法,每个时钟周期一次操作,而Tensor Cores每个时钟周期可以执行多个操作。

上面的图来自 Nvidia 官方对 Tensor Cores 进行的介绍视频

CUDA 核心和 Tensor 核心之间有什么关系?Tensor Cores 内置在 CUDA 核心中,当满足某些条件时,就会触发这些核心的操作。

测试方法

GPU的计算速度仅在某些典型场景下比CPU快。在其他的一般情况下,GPU的计算速度可能比CPU慢!但是CUDA在机器学习和深度学习中被广泛使用,因为它在并行矩阵乘法和加法方面特别出色。

上面的操作就是我们常见的线性操作,公式是这个

这就是PyTorch的线性函数torch.nn.Linear的操作。可以通过以下代码将2x2矩阵转换为2x3矩阵:

 import torch
 in_row,in_f,out_f = 2,2,3
 tensor            = torch.randn(in_row,in_f)
 l_trans           = torch.nn.Linear(in_f,out_f)
 print(l_trans(tensor))

CPU 基线测试

在测量 GPU 性能之前,我需要线测试 CPU 的基准性能。

为了给让芯片满载和延长运行时间,我增加了in_row、in_f、out_f个数,也设置了循环操作10000次。

 import torch
 import torch.nn
 import timein_row, in_f, out_f = 256, 1024, 2048
 loop_times = 10000

现在,让我们看看CPU完成10000个转换需要多少秒:

 s       = time.time()
 tensor  = torch.randn(in_row, in_f).to('cpu')
 l_trans = torch.nn.Linear(in_f, out_f).to('cpu')
 for _ in range(loop_times):
     l_trans(tensor)
 print('cpu take time:',time.time()-s)
 
 #cpu take time: 55.70971965789795

可以看到cpu花费55秒

GPU计算

为了让GPU的CUDA执行相同的计算,我只需将. To (’ cpu ')替换为. cuda()。另外,考虑到CUDA中的操作是异步的,我们还需要添加一个同步语句,以确保在所有CUDA任务完成后打印使用的时间。

 s       = time.time()
 tensor  = torch.randn(in_row, in_f).cuda()
 l_trans = torch.nn.Linear(in_f, out_f).cuda()
 for _ in range(loop_times):
     l_trans(tensor)
 
 torch.cuda.synchronize()
 print('CUDA take time:',time.time()-s)
 
 #CUDA take time: 1.327127456665039

并行运算只用了1.3秒,几乎是CPU运行速度的42倍。这就是为什么一个在CPU上需要几天训练的模型现在在GPU上只需要几个小时。因为并行的简单计算式GPU的强项

如何使用Tensor Cores

CUDA已经很快了,那么如何启用RTX 3070Ti的197Tensor Cores?,启用后是否会更快呢?在PyTorch中我们需要做的是减少浮点精度从FP32到FP16。,也就是我们说的半精度或者叫混合精度

 s       = time.time()
 tensor  = torch.randn(in_row, in_f).cuda().half()
 layer   = torch.nn.Linear(in_f, out_f).cuda().half()
 for _ in range(loop_times):
     layer(tensor)
 torch.cuda.synchronize()
 print('CUDA with tensor cores take time:',time.time()-s)
 
 #CUDA with tensor cores take time:0.5381264686584473

又是2.6倍的提升。

总结

在本文中,通过在CPU、GPU CUDA和GPU CUDA +Tensor Cores中调用PyTorch线性转换函数来比较线性转换操作。下面是一个总结的结果:

NVIDIA的CUDA和Tensor Cores确实大大提高了矩阵乘法的性能。

后面我们会有两个方向的更新

1、介绍一些简单的CUDA操作(通过Numba),这样可以让我们了解一些细节

2、我们会在拿到4090后发布一个专门针对深度学习的评测,这样可以方便大家购买可选择

https://avoid.overfit.cn/post/a4e312b6f109444b9e27de31bf5a7b1d

本文作者:Andrew Zhu

相关文章:

  • 【数据结构】树形结构——线索二叉树
  • 突如其来的第一个1024要笑着过
  • 2022年都快结束了,Java的这些新技术、热门技术,你不会还不知道吧?
  • 【Linux】Linux文件权限的理解
  • 力扣(LeetCode)2008. 出租车的最大盈利(C语言)
  • 【正点原子I.MX6U-MINI应用篇】5、嵌入式Linux在LCD上显示BMP、JPG、PNG图片
  • 四非到保研厦大,我们还有多少路要走----技术人的保研之路
  • 美团Leaf分布式ID源码启动部署
  • 归一化小程序
  • 走过岁月我才发现——云IDE真方便(Python3.8环境测试)
  • SpringBoot核心技术 之 基础入门
  • Linux下编译工具:gcc/g++ の最全使用教程
  • 【计算机视觉】imutils的基本使用
  • Vue--nextTick--作用/用法/原理
  • 自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • download使用浅析
  • ECMAScript6(0):ES6简明参考手册
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaWeb(学习笔记二)
  • js正则,这点儿就够用了
  • MaxCompute访问TableStore(OTS) 数据
  • python3 使用 asyncio 代替线程
  • Spring Boot快速入门(一):Hello Spring Boot
  • 初识MongoDB分片
  • 工作中总结前端开发流程--vue项目
  • 官方解决所有 npm 全局安装权限问题
  • 设计模式走一遍---观察者模式
  • 数据可视化之 Sankey 桑基图的实现
  • 微信小程序:实现悬浮返回和分享按钮
  • 消息队列系列二(IOT中消息队列的应用)
  • 一天一个设计模式之JS实现——适配器模式
  • Spring第一个helloWorld
  • # 飞书APP集成平台-数字化落地
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (¥1011)-(一千零一拾一元整)输出
  • (02)vite环境变量配置
  • (4.10~4.16)
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (算法设计与分析)第一章算法概述-习题
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)Sql Server 保留几位小数的两种做法
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .NET CORE Aws S3 使用
  • .NET Core 通过 Ef Core 操作 Mysql