第二章:NPU芯片架构入门

各位同学好,我是老张。今天咱们聊聊NPU的芯片架构。说实话,很多做模型部署的同学,一上来就调算子、改图结构,结果性能死活上不去。为什么?因为你不了解底层的硬件在干什么。

我刚开始接触NPU时也犯过这毛病。后来被芯片厂商的FAE怼了一句:“你连我的计算单元怎么工作的都不知道,怎么优化?”嗯,从那以后,我养成了一个习惯——拿到一块新芯片,先看架构图,再看指令集,最后才看SDK文档。

这一章,我们就从NPU与CPU/GPU的区别讲起,再聊聊几种主流的NPU架构,最后说说算力指标怎么看。相信我,搞懂这些,你后面调模型会顺手很多。

2.1 NPU与CPU/GPU的区别

先问大家一个问题:为什么不用CPU跑神经网络?

CPU是“万金油”。它能处理各种复杂的逻辑控制,分支预测、乱序执行、大缓存,样样精通。但它的计算单元(ALU)占比很小,大部分面积给了缓存和控制逻辑。说白了,CPU擅长“想”,不擅长“算”。

GPU呢?GPU是“大力出奇迹”。它用大量简单的计算核心(CUDA Core)做并行计算,特别适合矩阵乘法这类运算。但GPU的每个核心还是相对通用,能处理各种数据类型和指令。

NPU就不一样了。NPU是“专才”。它只做一件事——神经网络计算。它的计算单元是专门为卷积、矩阵乘、激活函数设计的。没有复杂的控制逻辑,没有大缓存,就是拼命算。

核心区别一句话总结:

  • CPU:控制强,计算弱,适合串行任务
  • GPU:计算强,控制弱,适合并行任务
  • NPU:计算极强,控制极弱,专为神经网络而生

我在项目中遇到过一件事:一个客户用CPU跑MobileNet,一帧要200ms。换成NPU后,直接降到5ms。差距就是这么大。但注意,NPU不是万能的——你让它跑个数据库查询试试?立马歇菜。

2.2 常见NPU架构

市面上的NPU架构五花八门,但核心思路差不多。我挑三个有代表性的讲讲:华为的达芬奇、寒武纪的MLU、地平线的BPU。

2.2.1 达芬奇架构(华为)

达芬奇架构是华为自研的NPU架构,用在昇腾系列芯片上。它的设计思路很有意思——3D Cube。

什么叫3D Cube?说白了,就是一个三维的乘加阵列。传统的NPU做矩阵乘法,是一次算一行乘一列。达芬奇不一样,它一次算一个立方体。比如16x16x16的Cube,一次完成4096个乘加操作。

我记得第一次看到这个设计时,心里想:“这玩意儿散热能行吗?”后来发现华为用了独特的流水线设计,把计算和访存重叠起来,效率确实高。

达芬奇架构有几个关键特点:

  • AI Core:每个核心包含Cube Unit、Vector Unit、Scalar Unit
  • Cube Unit:负责矩阵乘,是性能核心
  • Vector Unit:负责向量运算,比如激活函数、池化
  • Scalar Unit:负责标量运算,比如控制逻辑

我的经验:在达芬奇架构上部署模型,要特别注意数据排布。Cube Unit要求输入数据是特定的格式(比如NC1HWC0),如果排布不对,性能直接腰斩。我曾经花了两天时间,就为了调一个transpose算子——后来发现是数据排布没对齐。

2.2.2 寒武纪MLU架构

寒武纪的MLU(Machine Learning Unit)架构,走的是另一条路——多核并行。每个MLU核心包含大量的乘法器和加法器,通过片上网络(NoC)连接。

寒武纪的设计理念是“软件定义硬件”。什么意思?就是通过编译器来调度计算资源,而不是靠硬件硬连线。这样做的好处是灵活性高,坏处是编译器优化难度大。

我接触寒武纪的芯片比较早,当时还是MLU100。说实话,那时候的编译器确实不太成熟,经常出现“明明算力很高,实际跑起来却一般”的情况。后来到了MLU270,情况好多了。

寒武纪架构的特点:

  • 多核设计:每个核心独立执行任务
  • 片上网络:核心之间通过NoC通信
  • 软件定义:编译器决定计算调度

避坑指南:我曾经在寒武纪芯片上部署一个多分支的网络,结果性能惨不忍睹。后来发现是分支之间的数据依赖导致核心空闲。解决办法是手动调整网络结构,把独立的分支合并成一个大算子。嗯,这招叫“算子融合”,后面章节会细讲。

2.2.3 地平线BPU架构

地平线的BPU(Brain Processing Unit)架构,主打的是“数据驱动”。它的设计思路是:让数据在计算单元之间流动,尽量减少数据搬运。

BPU采用了一种叫“脉动阵列”(Systolic Array)的结构。数据像流水一样,从一个计算单元流到下一个,每个单元只做简单的乘加操作。这样做的好处是:数据复用率高,带宽需求低。

地平线的芯片在自动驾驶领域用得比较多。我有个朋友在做ADAS,他说BPU对低精度量化支持特别好,INT8跑起来几乎不掉点。

BPU架构的特点:

  • 脉动阵列:数据流式计算,高复用率
  • 低精度支持:INT8/INT4量化友好
  • 低功耗:适合边缘设备

2.3 NPU的算力指标

聊完架构,咱们说说怎么衡量一个NPU的性能。很多同学只看TOPS,其实这是不够的。

2.3.1 算力指标有哪些?

指标 单位 说明
TOPS 万亿次/秒 理论峰值算力,通常指INT8
TFLOPS 万亿次浮点/秒 浮点算力,FP16/FP32
MACs 乘加操作数 实际计算量,比TOPS更真实
带宽 GB/s 内存带宽,决定数据搬运速度
利用率 百分比 实际算力/理论算力

你看,TOPS只是理论值。实际能跑多少,还得看利用率。我见过一块标称20TOPS的芯片,实际跑ResNet-50只有5TOPS。为什么?因为数据搬运跟不上计算速度。

算力公式:

实际性能 = 理论算力 × 利用率
利用率 = f(数据复用, 访存带宽, 算子匹配度)

2.3.2 怎么看算力指标?

我个人习惯,拿到一块NPU先看三个数:

  1. 理论TOPS:心里有个上限
  2. 内存带宽:决定数据能不能喂饱计算单元
  3. 片上缓存大小:决定能不能放下模型参数

举个例子:某芯片标称16TOPS,带宽100GB/s,缓存2MB。你算一下,16TOPS的INT8计算,每秒需要搬运16GB的数据(假设每个操作读一次写一次)。但带宽只有100GB/s,理论上利用率最多60%。再加上缓存只有2MB,放不下大模型的权重,还得频繁从DDR搬运。实际利用率可能只有30%。

所以,别被TOPS忽悠了。我见过太多人,一看TOPS高就下单,结果部署时发现性能对不上。嗯,这坑我踩过。

2.4 本章小结

这一章我们聊了:

  • NPU和CPU/GPU的本质区别:专才 vs 通才
  • 三种主流架构:达芬奇的3D Cube、寒武纪的多核并行、地平线的脉动阵列
  • 算力指标怎么看:别只看TOPS,要看带宽和利用率

下一章,我们会讲ONNX模型的结构和算子。到时候你会发现,很多优化技巧其实都跟硬件架构有关。比如,为什么有些算子要融合?为什么数据排布要调整?答案都在这一章里。

好了,今天就到这里。有问题欢迎在群里讨论,或者直接找我。我是老张,咱们下章见。