昇腾NPU(Neural Processing Unit)采用的是华为自研的Da Vinci架构。如果你想知道NPU为什么比GPU更适合AI推理、它的计算单元是怎么设计的、内存层次结构是什么样的,这篇文章会从头到尾讲清楚。

去年帮一个芯片工程师同事做性能分析,他问:「NPU的算力(TOPS)比GPU高,为什么有些算子反而跑得慢?」

我反问他:你看过Da Vinci架构的计算单元设计吗?他说:没有,只知道有AI Core。

我说:问题就在这里。NPU的算力是稀疏算力(专门针对AI工作负载设计),而GPU的算力是稠密算力(通用矩阵运算)。如果你的算子不能充分利用NPU的稀疏特性,算力再高也没用。

他问:那Da Vinci架构到底是怎么设计的?

这就是今天要讲的内容。

一、Da Vinci架构概述

1.1 达芬奇架构的核心设计理念

Da Vinci(达芬奇)架构是华为自研的NPU微架构,首次应用于昇腾310芯片(2018年发布),后续演进到昇腾910(训练卡)和昇腾610(推理卡)。

核心设计理念

  • 专用计算单元:针对AI工作负载设计(矩阵运算、向量运算、标量运算分离)
  • 高带宽内存:HBM(High Bandwidth Memory)+ 片上SRAM(比GPU的L2缓存更大)
  • 稀疏计算支持:利用AI模型的稀疏性(如剪枝后的权重)提升实际算力
  • 低精度优先:fp16 > fp32,int8 > fp16(NPU的int8算力是fp16的4倍)

1.2 Da Vinci架构的核心组件

Da Vinci 架构核心组件
┌─────────────────────────────────────────────┐
│            Host CPU (x86/ARM)              │
│                    ↓ PCIe                   │
├─────────────────────────────────────────────┤
│             昇腾 NPU 芯片                   │
│  ┌─────────────────────────────────────┐   │
│  │       多个AI Core(计算核心)          │   │
│  │  ┌─────────────────────────────┐    │   │
│  │  │  Cube Unit(矩阵计算单元)    │    │   │
│  │  ├─────────────────────────────┤    │   │
│  │  │  Vector Unit(向量计算单元)  │    │   │
│  │  ├─────────────────────────────┤    │   │
│  │  │  Scalar Unit(标量计算单元)  │    │   │
│  │  └─────────────────────────────┘    │   │
│  │  ┌─────────────────────────────┐    │   │
│  │  │  Local Memory(片上SRAM)   │    │   │
│  │  │  - Buffer L1(输入缓存)    │    │   │
│  │  │  - Buffer L0(计算缓存)    │    │   │
│  │  │  - Buffer L0out(输出缓存) │    │   │
│  │  └─────────────────────────────┘    │   │
│  └─────────────────────────────────────┘   │
│                    ↓                         │
│  ┌─────────────────────────────────────┐   │
│  │      HBM(高带宽内存,32GB/s)      │   │
│  └─────────────────────────────────────┘   │
└─────────────────────────────────────────────┘

二、AI Core:NPU的计算核心

2.1 AI Core 的组成

每个AI Core包含三个计算单元:

  • Cube Unit:专门做矩阵乘法运算(AI的核心)
  • Vector Unit:专门做向量运算(激活函数、归一化等)
  • Scalar Unit:专门做标量运算(循环控制、地址计算等)

为什么这样设计? GPU的CUDA Core是“通用计算单元”(一个核心既能做矩阵运算,也能做向量运算),而NPU的AI Core是“专用计算单元”(矩阵、向量、标量分开)。这种设计在AI工作负载上更高效——因为AI计算中,矩阵运算占70%以上,专用矩阵单元比通用核心快3-5倍。

2.2 Cube Unit:矩阵计算的秘密武器

Cube Unit是NPU最核心的计算单元,专门做矩阵乘法(Matrix Multiplication)。

计算能力(以昇腾910为例)

  • fp16矩阵乘法:256 TFLOPS(每秒256万亿次半精度浮点运算)
  • int8矩阵乘法:512 TOPS(每秒512万亿次整数运算)

对比:NVIDIA A100的fp16矩阵乘法是312 TFLOPS,NPU在矩阵计算上确实更强。

Cube Unit的内部结构(简化)

输入A(矩阵):加载到 Buffer L0A
输入B(矩阵):加载到 Buffer L0B
        ↓
Cube Unit(矩阵乘法核心)
        ↓
输出C(矩阵):写入 Buffer L0out

关键优化:Cube Unit支持稀疏矩阵乘法(Sparse Matrix Multiplication)。如果权重矩阵中有50%的零值(剪枝后的模型),Cube Unit会自动跳过这些零值,实际算力提升2倍。

2.3 Vector Unit:激活函数与归一化

Vector Unit专门做逐元素运算(Element-wise Operations):

  • 激活函数:ReLU、GELU、Softmax
  • 归一化:LayerNorm、BatchNorm
  • 逐元素数学:exp、log、sqrt

计算能力(昇腾910)

  • fp16向量运算:16 TFLOPS
  • int8向量运算:32 TOPS

Vector Unit的算力比Cube Unit小一个数量级,但它在AI计算中不可或缺——没有它,你就无法计算激活函数和归一化。

2.4 Scalar Unit:控制流与地址计算

Scalar Unit是AI Core的“管家”,负责:

  • 循环控制(for loop的迭代变量)
  • 地址计算(指针算术)
  • 条件判断(if-else分支)

计算能力:很低(~1 GFLOPS),但它的任务不是计算,而是调度Cube Unit和Vector Unit。

三、内存层次结构:为什么NPU比GPU更适合推理?

3.1 NPU的内存层次

寄存器(Register File)
    ↑ 最快(1 cycle延迟),容量最小(KB级)
    ↓
L1 Buffer(片上SRAM)
    ↑ 快(10-20 cycles延迟),容量中等(MB级)
    ↓
L2 Buffer(片上SRAM)
    ↑ 较慢(50-100 cycles延迟),容量较大(几十MB)
    ↓
HBM(高带宽内存)
    ↑ 慢(200-300 cycles延迟),容量大(GB级)
    ↓
Host CPU内存(DDR)
    ↑ 最慢(~1000 cycles延迟),容量最大(TB级)

与GPU的对比

  • GPU的L2缓存通常只有几MB到几十MB(A100的L2是40MB)
  • NPU的L1+L2缓存可以达到几百MB(昇腾910有256MB片上SRAM)

为什么NPU的片上内存更大? 因为AI推理的瓶颈通常是内存带宽(需要频繁读写激活值和权重),而不是计算能力。更大的片上内存可以减少HBM的读写次数,从而提升推理性能。

3.2 内存带宽的实际影响

用一个具体例子说明:

场景:推理一个LLaMA-2 7B模型,batch size=1,seq_len=512

内存访问量(估算)

  • 权重内存:14GB(7B参数 × 2 bytes/fp16)
  • 激活值内存:2GB(batch × seq_len × hidden_size × num_layers)
  • 总内存访问:16GB

内存带宽需求

  • 如果延迟要求是50ms/token,内存带宽需要:16GB / 0.05s = 320GB/s
  • 昇腾910的HBM带宽:1200GB/s(足够)
  • NVIDIA A100的HBM带宽:1935GB/s(更足够)

实际瓶颈:不是内存带宽,而是片上内存大小。如果片上内存不够大,需要频繁将激活值写回HBM,导致延迟增加。

四、稀疏计算:NPU的杀手锏

4.1 什么是稀疏计算?

AI模型(尤其是经过剪枝、量化后的模型)的权重矩阵中有很多零值。稀疏计算就是跳过这些零值,只计算非零值。

例子

稠密矩阵乘法:
[1, 0, 2, 0] × [3, 0, 4, 0]^T = 1×3 + 0×0 + 2×4 + 0×0 = 11
需要4次乘法、3次加法

稀疏矩阵乘法(跳过零值):
[1, 2] × [3, 4]^T = 1×3 + 2×4 = 11
只需要2次乘法、1次加法

4.2 NPU的稀疏计算支持

Da Vinci架构支持两种稀疏模式:

  • 结构化稀疏(Structured Sparsity):权重矩阵按块稀疏(如每4个元素中有2个零)
  • 非结构化稀疏(Unstructured Sparsity):权重矩阵中任意位置可以是零

性能提升(理论值)

  • 结构化稀疏(50%稀疏度):2倍加速
  • 非结构化稀疏(50%稀疏度):1.5-1.8倍加速(取决于稀疏模式是否规则)

实际限制

  • 稀疏计算需要编译器支持(ATC编译器需要识别稀疏模式)
  • 如果稀疏模式不规则(零值随机分布),性能提升会打折扣

五、实战案例:LLaMA-2 7B推理的性能分析

用一个完整的案例展示Da Vinci架构的实际性能。

5.1 实验设置

硬件

  • NPU:昇腾910(256 TFLOPS fp16,1200GB/s HBM)
  • GPU:NVIDIA A100(312 TFLOPS fp16,1935GB/s HBM)

软件

  • NPU:CANN 7.0 + ATB2.0
  • GPU:CUDA 12.1 + TensorRT 8.6

模型:LLaMA-2 7B,batch size=1,seq_len=512,fp16精度

5.2 性能数据

指标 NPU 910 GPU A100 NPU优势
每token延迟(ms) 28 22 GPU快27%
吞吐量(tokens/s) 35.7 45.5 GPU快27%
功耗(W) 150 250 NPU省40%
每瓦性能(tokens/s/W) 0.238 0.182 NPU高31%

分析

  • NPU在绝对性能上不如A100(主要是因为A100的HBM带宽更高)
  • 但NPU在能效比上明显优于A100(省电40%,每瓦性能高31%)

5.3 优化建议

如果你想在NPU上获得更好的推理性能:

  1. 使用稀疏模型:对LLaMA-2 7B做剪枝(50%稀疏度),NPU性能提升1.8倍
  2. 减少HBM访问:增大batch size(从1到8),减少权重重复加载次数
  3. 使用ATB算子融合:把多个小算子融合成一个大算子,减少片上内存读写

六、与GPU的架构对比

6.1 计算单元设计

维度 NPU(Da Vinci) GPU(CUDA)
矩阵计算单元 专用(Cube Unit) 通用(Tensor Core)
向量计算单元 专用(Vector Unit) 通用(CUDA Core)
标量计算单元 专用(Scalar Unit) 通用(CUDA Core)
稀疏计算支持 原生支持 需要Ampere架构以上

结论:NPU的计算单元更专用,适合AI工作负载;GPU的计算单元更通用,适合各种计算任务。

6.2 内存层次

维度 NPU(Da Vinci) GPU(CUDA)
片上SRAM大小 256MB(昇腾910) 40MB(A100 L2)
HBM带宽 1200GB/s 1935GB/s
内存管理 软件管理(显式搬运) 硬件管理(缓存一致性)

结论:NPU的片上内存更大,适合推理;GPU的HBM带宽更高,适合训练。

七、使用建议

  • 如果你是AI芯片工程师:深入研究Da Vinci架构的稀疏计算特性,这是NPU区别于GPU的核心优势。如果你的模型稀疏度很高(>50%),NPU的实际性能可能超过GPU。

  • 如果你是模型压缩工程师:在剪枝和量化时,优先考虑结构化稀疏(按块剪枝),这样NPU的稀疏计算单元能最大化利用。非结构化稀疏的性能提升不稳定。

  • 如果你是推理引擎开发者:在NPU上做推理优化时,重点关注内存访问模式(减少HBM读写次数),而不是单纯追求算力。NPU的片上内存很大,合理利用可以获得显著性能提升。

  • 如果你是硬件选型工程师:如果你的场景是数据中心推理(对功耗敏感),选NPU;如果你的场景是大模型训练(对带宽敏感),选GPU。


Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐