GPU计算比CPU快多少?在本文中,我将使用Python和PyTorch线性变换函数对其进行测试。以下为试机配置:CPU:Inteli76700k(4c/8t)GPU:RTX3070TI(6,144CUDAcoresand192Tensorcores)内存:32G操作系统:Windows10cpu和显卡都是目前通用的配置不是顶配(待4090正常出货后我们会给出当前顶配测试结果)NVIDIAGPU术语解释CUDA是ComputeUnifiedDeviceArchitecture的缩写。NVIDIAGPU指令集可以使用CUDA直接访问,不需要用户了解复杂的图形编程语言,不像DirectX和OpenGL是专门为构建游戏引擎而设计的。但需要说明的是,CUDA是N卡特有的,所以这也是A卡对深度学习不友好的原因之一。张量核心是加速矩阵乘法过程的处理单元。例如,使用CPU或CUDA将两个4×4矩阵相乘涉及64次乘法和48次加法,每个时钟周期执行一次运算,而TensorCores可以在每个时钟周期执行多次运算。上图来自Nvidia官方对TensorCores的介绍视频。CUDA核心和Tensor核心是什么关系?TensorCore内置于CUDA内核中,当满足特定条件时会触发对这些内核的操作。测试方法GPU的计算速度仅在部分典型场景下比CPU快。在其他一般情况下,GPU执行计算的速度可能比CPU慢!但是CUDA在机器学习和深度学习中的应用非常广泛,因为它特别擅长并行矩阵乘法和加法。上面的运算就是我们常见的线性运算,公式是这样的这是PyTorch的线性函数torch.nn.Linear的运算。一个2x2的矩阵可以通过下面的代码转换成一个2x3的矩阵:importtorchin_row,in_f,out_f=2,2,3tensor=torch.randn(in_row,in_f)l_trans=torch.nn.Linear(in_f,out_f)print(l_trans(tensor))CPUBaselineTesting在测量GPU性能之前,我需要在线对CPU性能进行基准测试。为了充分加载芯片和延长运行时间,我增加了in_row、in_f、out_f的个数,并将循环操作设置为10000次。importtorchimporttorch.nnimporttimein_row,in_f,out_f=256,1024,2048loop_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_inrange(loop_times):print('cputaketime:',time.time()-s)#cputaketime:55.70971965789795可以看到CPU耗时55秒。GPU计算为了让GPU上的CUDA执行相同的计算,我只需将.To('cpu')替换为.cuda()。另外,考虑到CUDA中的操作是异步的,我们还需要添加一个sync语句,保证在所有CUDA任务完成后打印使用时间。s=time.time()张量=torch.randn(in_row,in_f).cuda()l_trans=torch.nn.Linear(in_f,out_f).cuda()for_inrange(loop_times):torch.cuda.synchronize()print('CUDAtaketime:',time.time()-s)#CUDAtaketime:1.327127456665039并行运算只用了1.3秒,几乎比CPU快42倍。这就是为什么在CPU上训练需要几天时间的模型现在在GPU上只需要几个小时。因为并行简单计算GPU的强项是如何使用TensorCoresCUDA已经非常快了,那么如何开启RTX3070Ti的197个TensorCores呢?启用后会不会更快?我们需要在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_inrange(loop_times):torch.cuda.synchronize()print('CUDAwithtensorcorestaketime:',time.time()-s)#CUDAwithtensorcorestaketime:0.5381264686584473是另一个2.6倍的改进。总结本文通过在CPU、GPUCUDA和GPUCUDA+TensorCores上调用PyTorch线性变换函数来比较线性变换操作。这里总结一下结果:NVIDIA的CUDA和TensorCores确实大大提升了矩阵乘法的性能。后面我们会分两个方向更新1.介绍一些简单的CUDA操作(通过Numba),让大家了解一些细节2.我们拿到4090之后会出一个深度学习的专测评测,可以方便大家选择
