2. NPU内存层次结构:片上SRAM、全局内存、DDR带宽、HBM
做NPU系统工程师这些年,我最大的体会就是——内存层次结构决定了AI芯片的天花板。你想想看,算力再强,数据喂不进去,一切都是白搭。今天我们就来拆解NPU里这几层存储,看看它们各自扮演什么角色。
2.1 片上SRAM — 最快的那块“桌面”
片上SRAM,说白了就是NPU核心旁边的高速暂存区。我个人习惯叫它“计算单元的桌面”——你正在处理的数据必须摆在桌面上,手一伸就能拿到。容量不大,通常2~32 MB,但延迟只有1~5 ns,带宽能到恐怖的10 TB/s以上。
我在项目中遇到过一个典型的卷积层优化:如果能把输入特征图和权重全部塞进SRAM,算子耗时能降40%。但一旦塞不下,就得频繁搬数据,性能直接腰斩。所以很多NPU的编译器会做“分块tiling”,目的就是把数据切成小块,一块一块喂给SRAM。
2.2 全局内存 — 片上的“共享仓库”
全局内存通常是更大的片上SRAM(也叫L2 SRAM或共享内存),容量32~256 MB,延迟10~30 ns。它介于SRAM和片外DDR之间,像个中转站。你想想看,多个计算核要交换数据,或者做Reduce、Gather操作,全局内存就是那个“共享白板”。
我记得有一次做BERT推理优化,发现Self-Attention的中间结果太大,片上SRAM放不下,但全局内存刚好能装下。于是我把QKT的结果暂存在全局内存,避免写回DDR,延迟直接降了3倍。这就是用好层次结构的好处。
2.3 DDR带宽 — 传统片外内存
DDR(比如DDR4/DDR5/LPDDR5)是NPU的传统片外内存。容量大(8~256 GB),但延迟高(50~100 ns),带宽相对有限(通常50~100 GB/s)。对于很多边缘端NPU,DDR就是主存。但说实话,对于大模型推理,DDR带宽经常是瓶颈。
我见过不少团队在DDR带宽上踩坑。举个例子,一个7B模型,权重就要14 GB(FP16),如果全部放在DDR里,每次推理都要把权重从DDR搬到片上,带宽很容易打满。这时候就得靠量化、权重压缩、甚至模型剪枝来“减负”。
2.4 HBM — 高带宽内存,大模型时代的“救星”
HBM(High Bandwidth Memory)是近年来AI芯片的标配。它通过3D堆叠和硅中介层,把多个DRAM die堆在一起,带宽轻松上1~3 TB/s。容量4~64 GB,延迟比DDR稍低(50~150 ns)。
为什么HBM这么重要?你想想看,训练一个GPT-3级别的模型,数据吞吐量是PB级,DDR那点带宽根本不够看。HBM的带宽是DDR的5~10倍,而且功耗还更低。我参与过的某款7nm NPU,用了4个HBM2E stack,总带宽2 TB/s,总算把训练效率提上来了。
但HBM也不是万能的。 它的容量相对有限(目前单颗HBM3最多32 GB),而且成本高。所以很多芯片会同时搭配DDR和HBM:HBM放热数据,DDR放冷数据。这就是所谓的“异构内存管理”。
| 内存层次 | 典型容量 | 延迟 | 带宽 | 管理方式 |
|---|---|---|---|---|
| 片上SRAM | 2~32 MB | 1~5 ns | 10~100 TB/s | 软件显式管理 |
| 全局内存 (L2 SRAM) | 32~256 MB | 10~30 ns | 2~10 TB/s | 软件/DMA管理 |
| HBM | 4~64 GB | 50~150 ns | 1~3 TB/s | 硬件+驱动管理 |
| DDR | 8~256 GB | 50~200 ns | 50~100 GB/s | 操作系统管理 |
2.5 如何选择 & 数据流设计
实际项目中,我一般遵循一个原则:能放片上不放片外,能放SRAM不放全局内存。但具体怎么搬、什么时候搬,得看算子特性。
举个例子,一个卷积层:
- 如果卷积核是3x3,输入是112x112x64,输出也是112x112x64。我建议把权重(3x3x64x64 ≈ 144 KB)常驻SRAM。
- 输入特征图太大(112x112x64 ≈ 800 KB),SRAM放不下,那就分块:每次处理一行或者一个tile,从全局内存或HBM搬入。
- 输出写回时,尽量用DMA批量写,别让计算核干等。
最后说一句,内存层次结构不是死的。不同NPU的SRAM大小、全局内存组织方式、HBM通道数都不一样。做系统优化时,一定要先看芯片手册,再结合profiling数据做决策。别光凭经验猜,我吃过这个亏。