动手学深度学习|深度学习硬件基础:CPU 和 GPU 到底有什么区别?为什么训练模型更喜欢 GPU?
前言学完前面的卷积神经网络、批量归一化、残差网络之后很多同学会慢慢注意到一个非常现实的问题模型会写了代码也能跑了但为什么有时候训练特别慢这时候你就会接触到深度学习里一个非常重要的话题——硬件。在深度学习中最常见的两类计算硬件就是CPUGPU很多初学者一开始会有些疑惑CPU 和 GPU 不都是用来算东西的吗为什么训练深度学习模型时总说“有没有 GPU”特别重要GPU 到底快在哪CPU 就不能训练深度学习吗什么时候该用 CPU什么时候该用 GPU这篇文章就把这些问题系统讲清楚。一、什么是 CPUCPU 的全称是Central Processing Unit中央处理器它可以理解为计算机的“大脑”负责执行各种通用任务。比如运行操作系统打开浏览器处理文件控制程序流程执行各种逻辑判断调度内存和外设CPU 的特点可以概括为通用性强、逻辑控制强、单核能力强。也就是说CPU 很擅长处理复杂逻辑分支判断串行任务多种不同类型的小任务切换二、什么是 GPUGPU 的全称是Graphics Processing Unit图形处理器最早它主要是为了图形渲染设计的比如3D 游戏图像显示图形绘制但后来人们发现GPU 有一个非常强的特点它特别擅长做大规模、重复性的并行计算。而深度学习中最核心的计算恰好就是矩阵乘法向量运算卷积运算大量相同结构的数值计算所以 GPU 和深度学习天然非常匹配。三、CPU 和 GPU 的本质区别是什么如果用一句最直白的话来概括CPU 擅长少而复杂的任务GPU 擅长多而重复的任务。1. CPU少量强核心CPU 一般核心数相对少但每个核心都很强擅长做复杂控制。你可以把 CPU 理解成几个非常聪明、能力很强的专家每个人都能独立处理复杂问题适合解决需要大量判断和调度的任务2. GPU大量相对简单的核心GPU 通常有大量计算核心单个核心没有 CPU 那么“全能”但数量特别多。你可以把 GPU 理解成一大群分工明确的工人每个人负责重复做同一种小计算适合大规模并行处理四、为什么深度学习特别适合 GPU这是最关键的问题。深度学习训练的本质很多时候就是在反复做这些事情张量加法张量乘法矩阵乘法卷积激活函数计算梯度反向传播这些操作有一个共同特点计算量大而且很多元素之间可以同时计算。例如矩阵乘法矩阵中每个位置的结果很多时候都可以独立并行算出来。这就非常适合 GPU。所以你可以这样理解CPU 更像“会思考、会调度”的总指挥GPU 更像“能同时动手干活”的超大施工队而深度学习训练本质上就是一个巨大的“重复数值计算工地”所以 GPU 会特别占优势。五、CPU 和 GPU 在深度学习中的分工很多人以为只要有 GPUCPU 就没用了。其实不是。在深度学习任务里CPU 和 GPU 通常是配合工作的。1. CPU 负责什么CPU 通常负责程序整体控制数据读取数据预处理调用训练流程调度 GPU处理一些不适合 GPU 的逻辑任务比如你训练模型时读图片解码图片做数据增强组织 batch启动 forward / backward保存日志和权重这些很多工作都和 CPU 有关。2. GPU 负责什么GPU 主要负责神经网络前向传播反向传播梯度计算参数更新中涉及的大规模张量运算也就是说真正最吃算力的部分通常交给 GPU。六、为什么 GPU 训练往往快很多原因主要有三点。1. 并行能力强深度学习里的大量张量运算可以并行执行而 GPU 天生适合这种场景。比如卷积层中一个特征图很多位置可以同时算多个卷积核可以同时算多个样本也可以并行算所以 GPU 能大幅提升吞吐量。2. 专门为高吞吐数值计算优化GPU 在设计上就更重视高并发大规模浮点计算高带宽数据搬运而深度学习正好大量依赖这些能力。3. 深度学习框架对 GPU 做了很多优化像PyTorchTensorFlow这些框架都对 GPU 计算做了大量底层优化例如CUDAcuDNN高效矩阵库所以实际训练时GPU 通常能比 CPU 快很多倍甚至几十倍。七、CPU 就不能做深度学习吗当然能。其实很多初学者最开始就是在 CPU 上跑模型的。例如学习张量操作调试小模型跑很小的数据集验证代码是否正确这些场景用 CPU 完全没问题。但是如果你开始训练CNNResNet大一点的数据集多 epoch 训练那 CPU 往往就会很慢。所以更准确地说CPU 不是不能做深度学习而是不适合做大规模训练。八、什么时候更适合用 CPU下面这些场景CPU 很常见。1. 学习和调试阶段模型很小主要看代码能不能跑通这时 CPU 就够了。2. 数据预处理很多数据加载、文件处理、文本解析任务本来就更适合 CPU。3. 小模型推理如果模型很轻或者对实时性要求不极端CPU 推理也可以。4. 没有 GPU 环境时比如课程实验、普通电脑、轻量任务CPU 也能完成基础工作。九、什么时候更适合用 GPU下面这些场景GPU 几乎是刚需。1. 训练深度神经网络尤其是CNNRNNTransformer大型多层 MLP2. 数据量较大时数据集一大训练次数一多CPU 训练时间会非常夸张。3. 需要快速迭代实验时比如你要频繁调学习率batch size网络结构损失函数没有 GPU试错成本会很高。4. 需要跑较大 batch 时GPU 更适合处理大 batch 张量并行计算。十、深度学习里常说的显存是什么讲 GPU 就绕不开一个概念——显存。显存可以理解成GPU 自己的高速工作内存在训练模型时显存里要存很多东西比如模型参数中间激活值梯度optimizer 状态输入数据 batch所以显存够不够直接影响你能不能训练某个模型。显存不足会怎么样最常见的情况就是报错CUDA out of memoryOOM这说明 GPU 显存不够了。通常解决方法包括减小 batch size降低输入分辨率换更小的模型使用混合精度训练梯度累积十一、GPU 这么强是不是什么都比 CPU 好不是。GPU 的优势非常明显但它也不是万能的。GPU 不擅长的地方1. 复杂逻辑控制如果任务里有很多 if-else、分支跳转、复杂调度GPU 反而不一定占优。2. 小规模任务如果任务非常小数据搬运到 GPU 的开销可能都比计算本身大。3. 通用系统任务像操作系统调度、文件系统管理、普通办公软件运行还是 CPU 更适合。所以并不是“GPU 全面替代 CPU”而是它们擅长的方向不同。十二、为什么把数据搬到 GPU 也要时间这是很多初学者容易忽略的点。训练时数据通常一开始在硬盘内存而 GPU 有自己的显存。所以数据要先经过硬盘 → 内存内存 → 显存这个过程叫数据传输。如果数据加载太慢CPU 预处理跟不上数据传输效率低那 GPU 可能会“闲着等数据”。这也是为什么实际训练时不只是看 GPU 强不强还要看CPU 是否够用内存是否够用数据加载是否高效十三、PyTorch 中如何查看和使用 CPU / GPU下面给一个最基础的例子。import torch print(torch.cuda.is_available()) # 是否有可用GPU print(torch.cuda.device_count()) # GPU数量 print(torch.cuda.get_device_name(0)) # 第0块GPU名字如果要指定设备device torch.device(cuda if torch.cuda.is_available() else cpu) print(device)把张量放到 GPUx torch.tensor([1.0, 2.0, 3.0]).to(device) print(x)把模型放到 GPUmodel MyNet().to(device)训练时也要记得把数据放到同一个设备for X, y in dataloader: X X.to(device) y y.to(device) pred model(X)这一点非常重要模型和数据必须在同一设备上。十四、一个直观例子为什么矩阵运算更适合 GPU假设我们要做一个很大的矩阵乘法这里会产生大量重复计算。比如输出矩阵中每个元素都是一行和一列的点积。这些点积之间很多都可以同时计算。所以CPU也能算但更多是少量强核心分工做GPU可以让大量核心同时参与这就是为什么深度学习里大量线性代数操作特别适合 GPU。十五、学习深度学习硬件时最该抓住的核心点1. CPU 和 GPU 的定位不同CPU通用、擅长逻辑控制GPU并行、擅长大规模数值计算2. 深度学习训练特别适合 GPU因为核心操作大多是矩阵和张量并行计算。3. CPU 和 GPU 是协同关系不是谁替代谁而是CPU 负责调度和数据准备GPU 负责重计算部分4. 显存是 GPU 训练中的关键资源很多训练问题本质上都是显存问题。5. 小任务和调试阶段CPU 也很有价值不是所有任务都非 GPU 不可。十六、从深度学习发展角度看为什么硬件这么重要深度学习的发展不只是算法发展也是硬件发展的结果。如果没有更强的计算硬件很多深层网络即便理论上很好也根本训不出来。比如AlexNet 的成功和 GPU 训练密切相关更深的 ResNet、Transformer也都依赖强算力支持所以可以说现代深度学习的爆发本质上是算法、数据、硬件三者共同推动的结果。十七、总结这篇关于 CPU 和 GPU最核心的内容可以记成下面几点1. CPU 是中央处理器擅长通用计算、逻辑控制和串行任务。2. GPU 是图形处理器擅长大规模并行数值计算。3. 深度学习训练更偏爱 GPU因为神经网络中大量操作都可以并行化。4. CPU 和 GPU 在训练中通常协同工作CPU 负责数据准备和流程控制GPU 负责前向、反向和大规模张量计算5. 显存是 GPU 训练中的重要限制因素显存不足会直接影响模型训练。十八、结尾对于深度学习来说硬件从来都不是“边角知识”而是非常核心的一部分。因为很多时候决定你能不能快速做实验、能不能训更大的模型、能不能高效迭代的不只是你会不会写网络结构还包括你是否理解 CPU 和 GPU 的分工以及它们为什么对深度学习这么重要。学到这里你就会发现深度学习不是只在研究“模型怎么设计”也在研究“模型怎么高效地算出来”。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2498577.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!