2、AI芯片架构基础:GPU与NPU架构对比
聊AI芯片架构之前,我先说说自己的体会。刚入行那会儿,我总觉得GPU和NPU差不多,都是做并行计算的嘛。直到有一次在项目里做算子移植,才发现这两者的设计哲学完全不同。今天咱们就掰开揉碎了聊聊。
2.1 GPU与NPU:两种不同的设计哲学
GPU最初是为图形渲染设计的。你想想看,屏幕上几百万个像素点,每个都要做矩阵变换、纹理映射,天然就需要大量并行计算。所以GPU的核心思路是:用大量简单计算单元,同时处理大量数据。
NPU呢?它是专门为神经网络设计的。神经网络的计算模式很固定——卷积、矩阵乘、激活函数。NPU的思路是:针对这些固定模式做极致优化,减少数据搬运,提高计算效率。
我打个比方。GPU就像一个大食堂,有100个厨师,每个厨师都能做各种菜。NPU呢,像一条流水线,专门做红烧肉,每个环节都优化到极致。你说哪个好?看场景。
核心区别一句话总结:
GPU是通用并行处理器,NPU是领域专用处理器。
GPU灵活但效率有上限,NPU高效但灵活性受限。
2.2 计算单元与存储层次
咱们先看GPU。以NVIDIA的架构为例,一个GPU包含多个Streaming Multiprocessor(SM),每个SM里有几十个CUDA Core。这些CUDA Core可以执行相同的指令,但处理不同的数据——这就是SIMT(单指令多线程)模型。
存储层次上,GPU有:
- 全局内存(Global Memory):容量大,但延迟高,几百个cycle
- 共享内存(Shared Memory):每个SM内部,延迟低,几十个cycle
- 寄存器(Register):每个线程私有,延迟最低
- L1/L2缓存:自动管理,对程序员透明
我在做矩阵乘优化时踩过一个坑。当时数据放在全局内存里,每次计算都要去读,性能惨不忍睹。后来改成用共享内存做分块(tiling),性能直接翻了4倍。嗯,这里要注意:GPU编程的核心就是管理数据在存储层次间的移动。
再看NPU。以华为昇腾为例,它的计算单元叫AI Core。每个AI Core里有:
- Cube Unit:专门做矩阵乘,一次能算16x16x16的矩阵
- Vector Unit:做向量运算,比如激活函数、归一化
- Scalar Unit:做标量运算,控制逻辑
存储层次上,NPU有个特点:显式管理的Buffer。昇腾有L0 Buffer、L1 Buffer,程序员需要手动管理数据在这些Buffer间的搬运。这跟GPU的自动缓存不一样,说白了就是:NPU把优化权交给了你,但也把麻烦交给了你。
| 对比项 | NVIDIA GPU | 华为昇腾NPU |
|---|---|---|
| 计算单元 | CUDA Core(通用) | AI Core(专用) |
| 矩阵乘 | Tensor Core(专用) | Cube Unit(专用) |
| 存储管理 | 自动缓存 | 显式Buffer |
| 编程模型 | SIMT(线程级) | SIMD(数据级) |
2.3 数据流与并行计算模型
数据流这块,GPU和NPU的思路完全不同。
GPU的数据流是线程驱动的。你写一个kernel,启动成千上万个线程,每个线程处理一部分数据。线程之间通过共享内存通信,通过全局内存同步。这种模型灵活,但有个问题:线程间的同步开销很大。
NPU的数据流是数据驱动的。你定义好计算图,数据在计算单元间流动,每个单元处理完就传给下一个。这种模型减少了同步开销,但要求计算图是固定的——说白了就是流水线式的处理。
我举个例子。做卷积操作时,GPU的做法是:每个线程算一个输出像素,需要从全局内存读输入数据。NPU的做法是:把输入数据加载到Buffer,Cube Unit做矩阵乘,结果直接传给Vector Unit做激活,一气呵成。
个人经验:
如果你做的是大模型推理,NPU的流水线模型更高效。但如果你做的是多变的算法研究,GPU的灵活性更香。我建议根据场景选型,别盲目跟风。
2.4 典型AI芯片架构简介
2.4.1 NVIDIA GPU
NVIDIA的GPU架构从Volta开始引入了Tensor Core,专门做矩阵乘。到了Ampere架构,Tensor Core支持了稀疏计算。Hopper架构又加入了Transformer Engine,针对Transformer模型做了优化。
我记得在Volta刚出来时,我们团队做BERT训练,用Tensor Core比用CUDA Core快了将近5倍。但有个坑:Tensor Core要求数据格式是FP16或INT8,精度控制不好会掉点。后来我们加了混合精度训练,才把这个问题解决。
2.4.2 华为昇腾
昇腾的架构设计很有特色。它的AI Core里,Cube Unit占了大部分面积,Vector Unit和Scalar Unit辅助。这种设计说白了就是:把矩阵乘做到极致。
昇腾还有个叫Da Vinci的架构,支持了3D Cube计算。什么意思呢?就是一次能算三维的矩阵乘,对卷积操作特别友好。我在做图像分类模型移植时,用昇腾的3D Cube比GPU快了30%左右。
避坑指南:
我曾经在昇腾上踩过一个坑:它的Buffer大小有限,如果数据量太大,需要手动做分块。我当时没注意,结果跑大模型时直接OOM了。后来改成逐层加载,才跑通。所以用NPU时,一定要关注Buffer容量。
2.4.3 寒武纪
寒武纪的架构思路跟昇腾类似,但也有自己的特色。它的MLU(Machine Learning Unit)里,有专门的卷积计算单元和池化单元。寒武纪还支持了虚拟化,一个物理芯片可以虚拟成多个逻辑芯片,对云场景很友好。
寒武纪的编程模型叫Cambricon Neuware,跟CUDA有点像,但有些细节不同。比如它的内存管理是显式的,需要手动分配和释放。我刚开始用的时候不太习惯,后来发现这样反而更容易控制内存使用。
2.5 架构对比总结
说了这么多,咱们总结一下。GPU和NPU的架构差异,本质上是通用性和效率的权衡。GPU追求灵活,NPU追求极致。没有绝对的好坏,只有适不适合。
我个人建议:
- 如果你做算法研究,经常换模型,选GPU
- 如果你做产品落地,模型固定,选NPU
- 如果你做大规模部署,考虑成本和功耗,NPU更有优势
最后说一句:架构是死的,人是活的。不管用哪种芯片,理解它的设计哲学,才能写出高效的算子。嗯,今天就聊到这儿。