尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CPU、GPU、NPU、TPU怎么选?一文讲透AI芯片的架构与实战

CPU、GPU、NPU、TPU怎么选?一文讲透AI芯片的架构与实战 1. 先别急着比跑分搞清楚这些芯片到底在忙什么这两年AI浪潮卷起来之后我身边几乎每天都会有人问同一个问题“我这台机器跑AI到底行不行是不是CPU够强就行”每次听到这种问题我都挺无奈的因为CPU、GPU、NPU、TPU这几个东西并不是简单的“谁强谁弱”的关系而是四个工种完全不同的伙计。先说个生活化的理解方式。你把一次AI推理任务想象成开一家餐厅CPU是店长啥都会一点接电话、记菜单、处理突发状况但是真让他亲自下厨炒一千份菜他得累死。GPU是后厨的普通厨师团队人手多可以十个锅同时炒菜适合那种量大、重复性强的工作。NPU是餐厅专门引进的炒菜机器人只干炒菜这一件事但炒得又快又稳还省电。TPU就更有意思了那是为了某个固定菜单比如只做麻辣香锅专门定制的中央厨房流水线食材进去直接出成品别的菜它真炒不了。这篇文章就是想把CPU、GPU、NPU、TPU这四个家伙的底细彻底聊透。我会从它们各自的架构设计、擅长的任务类型、在AI训练和推理中的实际表现、以及你真正买硬件时该怎么选这几个维度来拆。这篇文章适合谁看适合刚入门想搞清楚AI硬件选型的人也适合做AI应用部署的工程师还适合想搞懂终端设备上那个“NPU”到底有什么用处的产品经理和硬件爱好者。看完你会得到一个很清晰的认知框架以后看到任何一款芯片你能自己判断它适合干什么、不适合干什么、瓶颈在哪里。2. 架构决定命运四种芯片的“出身”差异2.1 CPU什么都能干的“通才”但什么事都不精CPU的诞生比AI早了半个多世纪。它的设计核心目标是处理“逻辑复杂、分支繁多、依赖性强”的通用任务。操作系统调度、数据库查询、网络协议栈处理、业务逻辑判断这些活儿都得CPU来干。CPU内部最值钱的区域被控制单元比如分支预测器、乱序执行引擎和高速缓存L1、L2、L3占据。真正用来算数的ALU单元在芯片总面积里占比并不算高。这种设计思路决定了CPU是一种“延迟敏感型”芯片——它追求的是单个任务从发出指令到拿到结果的时间足够短。在AI计算里CPU并不是完全退出而是承担三类角色一是数据预处理读数据、清洗数据、做格式转换往往是在CPU侧完成的二是模型调度GPU或者NPU干活之前由CPU来发号施令三是处理那些无法向量化的逻辑分支比如Python代码里的if-else、动态循环等。有些时候项目的瓶颈恰恰卡在CPU上。我举个例子之前帮朋友调一个数据导出的脚本他嫌GPU推理太慢结果我一看他的数据管道每次喂给模型之前都要做一次逐行的字符串正则匹配这个活在GPU上根本没法跑只能在CPU上串行做。所以做AI项目时CPU能力往往是那个容易被忽略的“隐形瓶颈”。2.2 GPU人多力量大的“并行狂魔”为矩阵而生GPU最初是被游戏催生出来的。游戏画面渲染本质上是一大堆像素点同时计算颜色和光影这些计算彼此独立天然适合大规模并行。后来人们发现深度学习中神经网络的数学本质——矩阵乘法——竟然也具有同样“数据并行”的特征于是GPU就被“跨界”征用到了AI领域。GPU和CPU最大的区别在于芯片面积的分配策略。一个典型的GPU芯片比如英伟达的A100内部有上万个CUDA核心更准确地说是FP32计算单元。每个计算单元都很简单控制逻辑极其精简但它最大的本事是可以同时执行成千上万条指令处理海量数据。这就像CPU是一个博士能做复杂的微积分GPU是一万个高中生你让他们每人算一道九九乘法表级别的乘法他们能瞬间把一万道题全做完。而神经网络的前向计算和后向传播恰恰就是堆积如山的乘法和加法。这也是为什么过去十年里GPU成了深度学习训练的事实标准。不过GPU也有它的短板。第一功耗高。一块A100满载功耗能到400瓦数据中心里几千块卡一起跑散热和电费都是巨大问题。第二通用性差一些。GPU只能高效处理规则整齐的数据如果你的任务需要大量复杂分支逻辑GPU反而可能表现得不如CPU。第三对于小批量推理任务来说GPU的“并发优势”发挥不出来可能还比不上一颗高端CPU来得快。2.3 NPU专为神经网络定制的“专用炒菜机器人”NPU的全称是Neural Processing Unit神经网络处理单元。它的核心理念是既然神经网络的算子卷积、矩阵乘法、激活函数、池化等是比较固定的那为什么不直接把这些操作做成硬件的“原生指令”这样就不用像GPU那样通过通用计算单元去“模拟”矩阵乘而是直接物理地实现它。NPU最核心的硬件单元叫“乘加阵列”MAC Array也叫脉动阵列或者二维计算阵列。卷积神经网络里的每一个卷积核操作都可以映射成一组乘法和累加操作。NPU中有几十到几百个乘加单元排成阵列数据像流水线一样从一个单元流向另一个单元极大地减少了数据搬运次数提高了计算效率。训练好的模型量化为INT8之后在NPU上跑起来非常快。最新的手机SoC里的NPU跑一个轻量级图像识别模型只需要几毫秒功耗却只有几百毫瓦。这也是为什么现在手机厂商都在狂吹AI摄影、AI语音助手、本地大模型——这些功能都离不开NPU的支持。大家需要注意一个关键点NPU是一个类别不是某一个具体芯片。华为昇腾310、昇腾910高通Hexagon DSP里的AI单元苹果的ANEApple Neural EngineIntel的AI Boost也就是我们常说的Intel NPU还有瑞芯微RK3588里的NPU都属于NPU这个大范畴。虽然它们都叫NPU但架构差异很大软件生态也不互通。用PyTorch写的模型不是说随便就能在任意NPU上跑的中间要经过模型转换工具链。2.4 TPUGoogle的毕设级“专用流水线”TPU全称是Tensor Processing Unit张量处理器。从大类上说它属于NPU的一个特化分支只不过它是Google针对自家TensorFlow框架和云服务场景专门定制的。TPU和通用NPU最大的不同在于两点。第一TPU的设计思路是“极致的专用化”它甚至针对矩阵乘法和激活函数做了更深度的硬件融合使用一种所谓的“脉动阵列”架构让数据在计算单元之间像传动带一样流动每个单元只需要做极简单的工作但整体效率非常夸张。第二TPU和Google的云基础设施深度捆绑你很难在别的地方买到一块TPU自己插电脑上跑——虽然Google推出了Edge TPU这种小设备但主要面向边缘推理场景。TPU对AI社区最大的贡献是它证明了“专用计算芯片”这条路是可行的。早期的TPU只有推理能力后来的TPU v2/v3/v4开始同时支持训练。很多在Google Cloud上跑大模型训练的团队反馈TPU在特定规模下的性价比确实比GPU好但前提是你的模型得用TensorFlow或JAX并且对TPU的XLA编译机制非常熟悉。否则你可能会被各种算子不支持、兼容性报错折腾到怀疑人生。3. 四个维度硬核对比算力、功耗、生态与成本3.1 算力怎么算别只看“Tops”这个纸面数字说到算力大部分人习惯看一个叫Tops每秒万亿次操作的数字。但这里有个很常见的误区不同芯片标的Tops衡量口径根本不一样。GPU的算力往往标的是FP32单精度浮点和FP16半精度浮点峰值NPU标的多半是INT8峰值TPU则经常标INT8和BF16的混合精度峰值。这三个口径之间的差别极大。INT8的Tops数字通常是FP16的两倍是FP32的四倍甚至更多。所以一款NPU标称“20 Tops”并不意味着它比一块标称“10 TFLOPS”的GPU更“强”因为前者是INT8的整数算力后者是FP32的浮点算力单位都不一样直接比较意义不大。实际推算一个模型在某个硬件上的推理速度我更推荐“反向测算”的方法。比如你想在本地GPU上跑一个70B参数的大模型显存占用估算公式可以简单记作显存 ≈ 参数量GB× 精度位数字节数× 系数。7B模型用FP16每个参数2字节至少需要14GB显存再加上KV Cache、激活值、中间变量等开销实际没个20GB肯定跑不动。算力需求则取决于你希望多快出一个token每秒出10个token和每秒出100个token需要的算力天差地别。3.2 功耗与能效比边缘设备活下去的关键做AI硬件选型功耗和能效比是我最先关注的指标。数据中心里我们可能对功耗容忍度稍高一些因为可以上液冷、上大风扇但对于手机、智能摄像头、边缘盒子这些设备来说功耗上限几乎决定了算力上限。拿手机NPU举例。手机电池就那么大一个NPU如果功耗超过5瓦握在手里就像握着一个小火炉。所以手机NPU的设计目标是在1到3瓦的功耗里塞进尽可能多的算力。而桌面级显卡GPU的功耗上限可能是350瓦数据中心里的A100甚至可以做到400瓦它们代表的完全是两个量级的设计思路。能效比这个指标在跑AI模型的场景里比单纯的峰值算力更有参考价值。同样跑一个ResNet-50图像分类模型CPU可能需要几瓦到几十瓦GPU需要几百瓦而专用的NPU可能只需要零点几瓦就能达到差不多的吞吐量。这也是为什么端侧AI边缘计算这几年特别强调NPU的重要性——很多任务其实根本不需要把数据传到云端本地芯片直接就能处理。3.3 生态才是真正的护城河我一直觉得芯片设计只是第一道门槛软件生态才是真正的生死线。CPU有x86和ARM两套极其成熟的生态几乎所有软件都能跑。GPU这一块英伟达的CUDA生态已经形成了一个巨大壁垒PyTorch、TensorFlow、ONNX Runtime等主流框架对CUDA的支持都做到开箱即用。哪怕AMD的ROCm这些年一直在追赶实际用起来还是有很多坑驱动莫名其妙的报错能让你排查半天。NPU生态就更加碎片化了。每个厂商都有自己的工具链华为有CANN和MindSpore瑞芯微有RKNN-ToolkitIntel有OpenVINO高通有QNNQualcomm Neural Network。好处是各个工具链都在努力向ONNX靠拢你只要能把模型导出成ONNX格式再通过对应工具转换成目标硬件能跑的格式基本流程是痛但可行的。坏处是一旦某个算子你的工具链不支持排查起来特别费劲。TPU生态则是“自成宇宙”。Google搞了一套XLA编译器走的是“整个模型图编译”的路线跟PyTorch动态图那种“一行一行解释执行”的方式完全不一样。这带来了性能上的优势——编译器可以看到整张计算图做全局优化但也带来了调试上的困难——报错信息往往发生在编译阶段你很难定位到具体是哪一行代码引起的。4. 实操向你到底该怎么选硬件、怎么调用这些芯片4.1 按场景选型训练、云端推理、边缘推理、端侧推理这是我自己总结的一套选型逻辑不一定适合所有场景但至少可以帮你省掉很多纠结的时间。如果是做大模型预训练或者全量微调GPU仍是首选。训练任务需要最大的显存和最强的浮点运算能力同时还需要成熟的分布式训练框架支持比如DeepSpeed、Megatron目前只有CUDA生态能提供最顺滑的体验。除非你的团队是JAX/TensorFlow重度用户并且有一定的人力去维护TPU的适配否则不要轻易在生产环境用TPU做训练那是一个连资深工程师都会头疼的维护负担。如果模型已经训练好了只是做云端推理服务你需要在高性能GPU和专用推理芯片之间做取舍。推理不像训练那样需要完整保存梯度信息大量计算可以用INT8量化来加速这对NPU和TPU非常友好。常见的方案有英伟达T4/L4显卡做通用推理性价比不错华为昇腾310做国产化推理加速Google Cloud TPU按需租用做大规模服务。边缘场景比如工厂质检、安防摄像头、智能网关优先选带NPU的SoC方案市面上成熟的方案有瑞芯微RK3588、地平线旭日系列、昇腾310系列。这些方案的核心优势是功耗低、价格适中、集成度高一颗芯片上集成了CPU、GPU、NPU多个计算单元。端侧设备手机、智能手表、IoT设备则主要依赖SoC内置的NPU比如苹果的ANE、高通的Hexagon、联发科的APU以及Intel的AI Boost。这类NPU不需要你去单独买硬件直接调用系统级AI框架就行。我用一张表把选型逻辑整理出来方便你对照参考使用场景首选硬件关键指标注意事项大模型预训练/微调NVIDIA GPUA100/H100显存容量、HBM带宽、多卡互联需要搭配高速网络和分布式框架云端小模型推理NVIDIA T4/L4、昇腾310功耗、INT8算力、延迟关注单路并发能力和价格边缘设备推理瑞芯微RK3588、华为昇腾NPU算力、外设接口、散热模型需要量化转换手机/笔记本端苹果ANE、Intel NPU能效比、框架支持依赖系统级API调用大规模云端推理Google TPU吞吐量、时延、XLA兼容性绑定Google Cloud生态4.2 用PyTorch实际调用GPU/CPU跑一个推理任务光讲理论太虚了这里直接演示一下如何用PyTorch判断你的机器有没有可用的GPU以及如何指定模型跑在GPU上。你新装完PyTorch之后第一件事应该是确认CUDA是否可用。在Python环境里执行下面这段代码import torch print(PyTorch版本:, torch.__version__) print(CUDA是否可用:, torch.cuda.is_available()) print(GPU数量:, torch.cuda.device_count()) if torch.cuda.is_available(): print(当前GPU名称:, torch.cuda.get_device_name(0))如果你看到CUDA是否可用: False那么大概率是PyTorch安装成了CPU版本。一个非常常见的坑是你明明用pip install torch安装了PyTorch但默认安装的是CPU版本只有去PyTorch官网用pip install torch --index-url https://download.pytorch.org/whl/cu118这种方式安装才会带上CUDA支持。把模型搬运到GPU上也很简单先定义一个模型然后用.to(device)移动即可device torch.device(cuda if torch.cuda.is_available() else cpu) model SomeNeuralNetwork() model model.to(device) # 输入数据也需要移动到同样的设备上 inputs inputs.to(device)我经常看到新手在这里踩坑模型在GPU上但数据还在CPU上运行时报错“Expected all tensors to be on the same device”。报错信息其实已经说得很清楚了但很多人一眼扫过根本没细看。记住一个原则在PyTorch里模型参数和输入张量必须在同一个设备上才能做前向传播。4.3 Intel NPU怎么用从OpenVINO入手最靠谱现在很多新款笔记本搭载了Intel处理器内置的NPUAI Boost但很多人买了之后根本不知道怎么调用。Intel自己主推的工具链是OpenVINO目前对Intel NPU的支持已经比较成熟了。第一步安装OpenVINO的运行时环境pip install openvino openvino-genai第二步用OpenVINO的API加载模型并指定设备为NPUimport openvino as ov core ov.Core() # 查看当前机器可用的计算设备 print(core.available_devices) # 加载ONNX格式的模型 model core.read_model(your_model.onnx) compiled_model core.compile_model(model, NPU) # 准备输入数据并推理 import numpy as np input_data np.random.rand(1, 3, 224, 224).astype(np.float32) output compiled_model([input_data])这里有个注意点Intel NPU对模型的结构和算子类型有比较严格的限制如果模型太复杂编译阶段会报“unsupported operation”之类的错误。解决办法是先确认ONNX模型里有没有NPU不支持的算子比如某些动态形状操作、某些高版本的激活函数等。另外NPU跑INT8量化模型的效率比跑FP16高很多建议先用NNCF或者OpenVINO自带的量化工具对模型做一遍INT8压缩。还有一个很多人不知道的小细节如果程序同时使用集显和NPUWindows下需要在“设置-系统-屏幕-显示卡”里为你的Python程序手动指定使用独立显卡还是集成显卡否则性能可能会被奇怪的调度逻辑拖累。4.4 Kaggle的TPU怎么用薅羊毛也得会用Kaggle每个星期会送30小时的TPU v3-8使用额度这在白嫖党眼里是块肥肉但很多人在上面跑PyTorch模型的尝试都失败了因为Kaggle的TPU和TensorFlow/JAX配合得更好PyTorch对它支持很差。你在Kaggle Notebook里开启TPU加速器之后如果在PyTorch环境里跑大概率会报各种兼容性错误。这里给你两个可行方案。方案一直接用TensorFlow把模型用Keras接口写设置分布式策略即可import tensorflow as tf resolver tf.distribute.cluster_resolver.TPUClusterResolver() tf.config.experimental_connect_to_cluster(resolver) tf.tpu.experimental.initialize_tpu_system(resolver) strategy tf.distribute.TPUStrategy(resolver) with strategy.scope(): model create_your_model() model.compile(optimizeradam, losssparse_categorical_crossentropy)方案二如果你坚持用PyTorch需要安装torch-xla包然后通过xla_model来管理设备。但说实话这套流程的复杂度比较高如果你不是对XLA机制特别熟悉我不建议在Kaggle上浪费时间折腾PyTorch跑TPU性价比很低。如果你真的想用TPU做实验TensorFlow才是“亲儿子”。5. 实战中的坑CPU/GPU/NPU/TPU踩坑实录5.1 “CPU内存占用都不高但很卡”该怎么排查这个问题我在各个技术社区见过无数次机器配置不低CPU占用率不高内存还剩很多GPU利用率也只有几十但整个系统跑起来就是卡顿。从我自己的排查经验看这种“三不高但卡”的诡异现象最常见的根源有四个。第一是磁盘IO瓶颈。AI训练过程中高频读写checkpoint、数据集、日志文件如果磁盘是机械硬盘或者低端SATA SSDIO等待时间会成为隐藏瓶颈。排查方法是看iostat的输出如果%util长期高于80%说明磁盘已经吃不消了。解决办法是把数据集放到NVMe SSD上或者用内存文件系统缓存小文件。第二是内存带宽瓶颈。内存和CPU之间的带宽是有限的当你的程序频繁访问大数组时即使内存容量够用带宽也可能被打满导致CPU核心在“等待数据”而不是“计算数据”。第三是锁竞争Python的多线程GIL问题其实算是这一类。第四是散热降频笔记本尤其严重CPU/GPU一热就自动降频反映在任务管理器里就是“占用率不高”但实际算力已经砍半。5.2 GPU利用率上不去问题可能不在GPU而在数据管道跑深度学习训练时你经常能看到nvidia-smi里的GPU利用率在0%到100%之间来回震荡平均下来可能只有30%。很多人第一反应是“显卡坏了”或者“模型太小了”但真正的元凶往往是数据加载跟不上GPU的消费速度。举个我自己的例子有一次训练一个图像分类模型数据集是几千张小图存在机械硬盘上每次迭代都要从磁盘读一批图片做完解码、缩放、归一化后再送去GPU。结果整个训练的瓶颈完全卡在CPU上的数据预处理环节GPU大部分时间在“饿肚子”等数据。排查方法是盯GPU利用率曲线如果利用率呈现“尖峰大段空闲”的锯齿状基本就是数据供给不足。解决办法是一套组合拳用DataLoader设置num_workers大于0让多个子进程并行做数据读取和预处理把数据格式从零散的图片文件打包成TFRecord或者WebDataset这种顺序读取的格式减少随机IO针对图像类数据把“读取-解码-缩放-增强”放到GPU上做比如用DALI库让数据在显存里流转。把这些都做到位之后GPU利用率通常能从30%提升到90%以上。5.3 NPU工具链报错速查表转模型失败别慌用NPU做模型转换和部署报错是家常便饭。以下是我在处理NPU工具链问题时整理的高频报错和对应的解决思路报错现象常见原因解决办法转换时报“Unsupported Operator”模型中包含NPU工具链不支持的算子查看算子列表用等价算子替换或者将这部分提取出来在CPU上执行编译时显存/内存溢出模型的中间表示占用了太多内存调小batch size开启模型量化减少计算图复杂度量化后精度明显下降校准数据集不具代表性使用覆盖真实分布的校准集适当保留敏感层的浮点精度推理结果全是0或NaN输入数据的范围与量化参数不匹配检查输入的归一化方式模型训练时的预处理要和部署时保持一致设备连接失败驱动未安装或权限不足检查lsusb/lspci能否识别设备确认当前用户是否有设备访问权限关于精度下降这一点我想多说一句。很多人对INT8量化一知半解只知道量化可以让模型变小变快却不知道校准Calibration环节的重要性。校准数据集应该是从真实使用场景中采样的数据而不是随便拿几张网图糊弄过去。如果校准集和实际推理的数据分布差距太大量化的精度损失会让你怀疑人生。5.4 当服务器上报AVX不支持时CPU老型号的坑如果你在旧服务器上跑一些比较新的数据计算工具比如Cell Ranger这类单细胞分析工具映射回热词里的cellranger报错可能会遇到一个报错提示你的CPU不支持AVX指令集程序无法运行。这个问题的本质是越来越多的科学计算库默认启用了AVX/AVX2向量指令集而这些指令需要2011年之后的CPU才能支持。如果你是老旧服务器比如早期的E5系列某些型号可能会中招。解决办法分几个层级最推荐的还是换一台支持AVX2的服务器其次可以尝试找目标工具的老版本——旧版本往往只要求SSE2兼容性好很多最后如果你的工具是用C源码发布的手动编译时关掉AVX标志理论上可行但操作门槛高除非你是折腾爱好者不然不要轻易尝试。6. 写在最后芯片不是越贵越好匹配才是王道说了这么多最想表达的一句话是芯片的世界里没有“最好的芯片”只有“最合适的芯片”。CPU、GPU、NPU、TPU本质上都是在不同约束条件下算力需求、功耗限制、生态依赖、成本预算做出的不同设计取舍。从我个人的使用经验来看大多数人一开始都会过度迷信高端GPU总觉得只有NVIDIA顶级卡才能做AI但实际做过几个项目之后你会发现很多应用场景用NPU甚至CPU就能跑得很舒服还省电、省钱、省心。反过来说某些场景里的确只有大显存的GPU才能救场用任何NPU都替代不了。如果你准备入坑AI硬件我建议从这样一个思路开始先明确自己的任务类型训练还是推理、运行环境云端还是本地还是端侧、模型规模几百MB还是几十GB、成本预算几块钱还是几十万然后再对着芯片的规格参数去匹配。别一上来就看天梯排行榜天梯图解决的是“谁性能强”的问题但解决不了“你需要什么”的问题。最后再分享一个实操小技巧做AI项目时不要把所有计算都压在一种芯片上异构计算才是常态。让CPU负责调度和预处理GPU/NPU负责重计算必要时让独立显卡和核显协同工作各干各擅长的活儿系统的整体效率和稳定性都会好很多。我见过太多人把CPU和GPU割裂开来看待结果明明硬件都不错整体性能却一直上不去。算力这件事从来都是系统工程而不只是某一个芯片的锅。
返回列表