共计 2363 个字符,预计需要花费 6 分钟才能阅读完成。
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 的操作。能够通过以下代码将 2 ×2 矩阵转换为 2 ×3 矩阵:
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