4、AI加速器(NPU)选型要点:神经网络架构支持、量化精度、稀疏化与张量核心
聊到NPU选型,很多工程师第一反应就是看算力。TOPS越高越好?我见过不少项目,选了个100TOPS的芯片,结果跑Transformer模型卡成PPT。为什么?因为NPU的架构设计,远比纸面算力复杂。
我个人习惯把NPU选型拆成四个维度:神经网络架构支持、量化精度、稀疏化支持、张量核心设计。这四个点,任何一个踩坑,整个项目都得返工。
4.1 神经网络架构支持:别让模型“水土不服”
你想想看,现在主流的模型架构就三种:CNN、RNN、Transformer。但NPU对它们的支持程度,天差地别。
4.1.1 CNN支持:基本功,但别大意
CNN是NPU的“基本功”。几乎所有NPU都能跑卷积、池化、全连接这些算子。但这里有个坑:卷积核尺寸和步长的硬件适配。
我在项目中遇到过,某款NPU对3x3卷积优化得特别好,但换成5x5或7x7,效率直接腰斩。为什么?因为它的MAC阵列是专门为3x3设计的,大卷积核需要拆成多次计算,带宽浪费严重。
4.1.2 RNN支持:被忽视的“时序痛点”
RNN(包括LSTM、GRU)在语音、时序预测里很常见。但很多NPU对RNN的支持,说白了就是“能用,但不好用”。
RNN的核心问题是循环依赖。每一步计算都依赖上一步的输出,无法像CNN那样大规模并行。我见过某款NPU,跑CNN能到80%利用率,跑LSTM直接掉到15%。
4.1.3 Transformer支持:2024年的“必考题”
Transformer现在太火了。从BERT到GPT,从ViT到Swin,几乎无处不在。但Transformer对NPU的挑战,主要来自Self-Attention机制。
Self-Attention需要计算Q、K、V矩阵,然后做softmax。这里面有两个瓶颈:
- 矩阵乘法维度大:尤其是长序列场景,QK^T矩阵的尺寸是序列长度的平方,内存消耗爆炸。
- softmax的指数运算:很多NPU没有专门的指数运算单元,只能用查表法或近似计算,精度和速度都受影响。
我个人建议:如果项目涉及Transformer,优先选原生支持Flash Attention或类似优化技术的NPU。比如某款芯片在硬件里集成了softmax加速器,性能能提升3-5倍。
4.2 量化精度:INT8、FP16、BF16,怎么选?
量化精度,说白了就是“用更少的比特数,尽量不损失模型精度”。这里面门道很多。
4.2.1 INT8:性价比之王,但有“精度焦虑”
INT8是目前最主流的量化格式。推理速度快,功耗低,内存占用小。但问题是:不是所有模型都能无损量化到INT8。
我在项目中遇到过,一个轻量级分类模型,INT8量化后精度只掉了0.3%,完全能接受。但换成一个目标检测模型,直接掉了2.5%,没法用。
| 量化格式 | 位宽 | 动态范围 | 典型场景 |
|---|---|---|---|
| INT8 | 8 bit | [-128, 127] | CNN、轻量级模型 |
| FP16 | 16 bit | ±65504 | Transformer、高精度需求 |
| BF16 | 16 bit | ±3.4e38 | 训练、大模型推理 |
4.2.2 FP16 vs BF16:精度与范围的博弈
FP16和BF16都是16位浮点,但区别在于:FP16有5位指数、10位尾数;BF16有8位指数、7位尾数。
BF16的指数范围和FP32一样,所以不容易溢出。我训练大模型时,经常遇到FP16梯度下溢(变成0),换成BF16就解决了。但BF16的尾数精度低,对某些对小数敏感的任务(比如语音合成)可能不够。
4.2.3 混合精度:一个“既要又要”的方案
很多现代NPU支持混合精度:不同层用不同精度。比如卷积层用INT8,全连接层用FP16。这样能在精度和速度之间取得平衡。
嗯,这里要注意:混合精度的配置非常依赖模型结构。我建议用芯片原厂的自动混合精度工具,手动调的话,工作量很大。
4.3 稀疏化支持:算力的“免费午餐”
稀疏化,就是让NPU跳过权重矩阵中的零值,只计算非零元素。理论上,如果模型稀疏度达到50%,算力可以翻倍。
但现实是:不是所有NPU都支持真正的稀疏化。
4.3.1 结构化稀疏 vs 非结构化稀疏
- 结构化稀疏:按块或按通道剪枝,硬件实现简单。比如NxM稀疏(每M个连续权重中,只有N个非零)。
- 非结构化稀疏:任意位置剪枝,压缩率高,但硬件支持难度大。
我曾经踩过一个坑:某款NPU号称支持稀疏化,但只支持2:4结构化稀疏(50%稀疏度)。我辛辛苦苦把模型剪枝到70%稀疏度,结果硬件不认,白忙一场。
4.3.2 稀疏化与量化的协同
稀疏化和量化可以叠加使用。比如INT8 + 50%稀疏,理论上能实现4倍压缩。但要注意:稀疏化后的权重分布可能更不均匀,影响量化精度。
我建议:先做量化,再做稀疏化。或者用联合训练的方法,让模型同时适应量化和稀疏化。
4.4 张量核心设计:NPU的“心脏”
张量核心(Tensor Core)是NPU里做矩阵乘法的专用单元。它的设计直接决定了NPU的峰值算力和实际效率。
4.4.1 MAC阵列尺寸:大还是小?
MAC阵列的尺寸,比如16x16、32x32、64x64,决定了单次能计算的矩阵乘法大小。
- 大阵列(比如64x64):适合大矩阵乘法,比如全连接层、大卷积核。但小矩阵时利用率低。
- 小阵列(比如16x16):灵活,适合小矩阵和深度可分离卷积。但大矩阵时需要多次计算。
我个人觉得,没有绝对的好坏。关键看你的模型里,矩阵乘法的尺寸分布。如果模型里全是1x1卷积和全连接层,大阵列更合适。如果模型里有很多3x3深度可分离卷积,小阵列更灵活。
4.4.2 数据流架构:权重固定还是数据固定?
张量核心的数据流架构,主要分两种:
- 权重固定(Weight Stationary):权重数据留在MAC阵列里,输入数据流进来。适合卷积层,因为权重可以复用。
- 数据固定(Data Stationary):输入数据留在MAC阵列里,权重数据流进来。适合全连接层,因为输入数据可以复用。
嗯,这里要注意:很多NPU是混合架构,不同模式下切换。但切换开销很大,频繁切换反而会降低效率。
4.4.3 张量核心的“隐藏参数”:累加精度
很多人忽略了一个细节:张量核心的累加精度。比如INT8乘法,累加时用INT16还是INT32?
如果累加精度不够,大矩阵乘法时很容易溢出。我在项目中遇到过,某款NPU的INT8累加只用INT16,结果跑ResNet-50时,某些层的输出全是NaN。后来换成累加精度INT32的芯片,问题解决。
4.5 一张图看懂NPU选型逻辑
下面这张图,是我自己总结的NPU选型决策流程。每次选型前,我都会过一遍。
这张图的核心逻辑是:先分析模型,再选精度,最后看稀疏化。顺序不能乱,否则容易选错。
4.6 总结:我的NPU选型清单
最后,分享一个我自己的选型清单。每次评估NPU时,我都会逐条核对:
- 模型覆盖度:NPU是否原生支持我的模型里的所有算子?尤其是Transformer和RNN。
- 量化工具链:量化工具是否成熟?支持INT8/FP16/BF16混合精度吗?
- 稀疏化支持:支持哪种稀疏模式?实际加速比是多少?
- 张量核心设计:MAC阵列尺寸是否匹配我的模型?累加精度够不够?
- 编译器质量:编译器能否自动优化数据流和内存布局?
嗯,差不多就这些。NPU选型没有“万能芯片”,只有“最适合你项目”的芯片。多花时间做模型分析和benchmark,比看宣传页靠谱得多。
公众号:蓝海资料掘金营,微信deep3321