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