一、NPU 基础认知:从“专用加速”说起
各位同学好,我是你们这门课的老朋友。
咱们直接开门见山。NPU 是什么?说白了,就是一颗专门为神经网络计算设计的芯片。你想想看,CPU 什么都能干,GPU 擅长并行浮点运算,但到了神经网络推理这个场景,它们都太“臃肿”了。
我早年做嵌入式 AI 项目时,用 CPU 跑一个 MobileNet,帧率惨不忍睹。后来换了 GPU,功耗又压不住。直到接触了 NPU,才真正体会到什么叫“专业的人干专业的事”。
1.1 NPU 与 CPU/GPU/FPGA 的本质区别
很多初学者会问:NPU 不就是个协处理器吗?跟 GPU 有什么区别?
嗯,这里我直接给一张对比表,你看完就明白了。
| 维度 | CPU | GPU | FPGA | NPU |
|---|---|---|---|---|
| 核心设计哲学 | 通用计算,低延迟控制 | 大规模并行浮点运算 | 可编程硬件逻辑 | 专用神经网络加速 |
| 典型应用 | 操作系统、逻辑控制 | 图形渲染、科学计算 | 通信协议、信号处理 | CNN/RNN/Transformer 推理 |
| 能效比 (TOPS/W) | 0.1 ~ 0.5 | 0.5 ~ 2 | 1 ~ 5 | 5 ~ 20+ |
| 灵活性 | 极高 | 高 | 中(可重配置) | 低(固定算子) |
| 典型功耗 | 5~150W | 75~450W | 10~50W | 0.5~15W |
核心结论:NPU 牺牲了通用性,换来了极致的能效比。在端侧推理场景下,NPU 的 TOPS/W 通常是 GPU 的 5~10 倍。
我记得有一次,客户要求把一个人脸检测模型塞进智能门锁里。CPU 跑要 200ms,功耗 1.2W;换了 NPU 之后,直接降到 15ms,功耗只有 0.3W。这就是专用加速的魅力。
1.2 NPU 的典型架构:脉动阵列
聊完区别,咱们看看 NPU 内部到底长什么样。
最经典的架构,就是 脉动阵列(Systolic Array)。这个概念最早来自卡内基梅隆大学的 H.T. Kung 教授,后来被 Google 的 TPU 发扬光大。
脉动阵列的核心思想很简单:数据像血液一样在阵列中“脉动”流动,每个处理单元(PE)只做一件事——乘加运算(MAC)。
我画了一张图,帮你理解这个结构:
避坑指南:我曾经在部署一个 1x1 卷积时,发现 NPU 利用率只有 30%。后来排查发现,脉动阵列对 3x3 以上的大卷积核效率最高,1x1 卷积反而更适合用 CPU 或 DSP 处理。所以,不是所有算子都适合往 NPU 上塞。
1.3 数据流架构:权重固定 vs. 数据固定
脉动阵列只是硬件结构,真正决定性能的,是数据流(Dataflow)策略。业界主要有两种流派:
- 权重固定(Weight Stationary):权重加载到 PE 后不再移动,输入数据在阵列中流动。优点是权重复用率高,适合全连接层。
- 数据固定(Output Stationary):部分和在 PE 本地累加,输入和权重都在阵列中流动。优点是减少中间结果的写回,适合卷积层。
我个人的习惯是:看你的模型里卷积层多还是全连接层多。如果是 MobileNet 这种深度可分离卷积,数据固定更友好;如果是 Transformer 里的 QKV 投影,权重固定更高效。
注意:很多商用 NPU 其实是混合数据流架构。比如寒武纪的 DianNao 系列,在卷积层用数据固定,在全连接层自动切换为权重固定。你作为开发者,不需要手动配置,但理解这个机制有助于你分析性能瓶颈。
1.4 从架构到实战:为什么你要懂这些?
你可能会问:我只是个算法工程师,NPU 架构跟我有什么关系?
关系大了去了。我举两个真实案例:
- 案例一:某团队把 PyTorch 模型直接转成 NPU 模型,发现推理速度比 CPU 还慢。一查,原来模型里用了大量
torch.cat和torch.split,这些操作在脉动阵列上无法流水线化,导致 PE 利用率不到 10%。 - 案例二:另一个团队把卷积核从 3x3 改成 5x5,理论上计算量增加了 2.78 倍,但实际推理时间只增加了 1.5 倍。为什么?因为 5x5 卷积在脉动阵列上的数据复用率更高,访存瓶颈被缓解了。
所以,理解 NPU 架构,是你写出高性能推理代码的第一步。后面的章节,我会带你一步步深入:从算子映射、内存排布,到量化校准、汇编级优化。
嗯,今天就先聊到这儿。记住一句话:NPU 不是万能的,但在它擅长的领域,它是无敌的。