1. 推理硬件选型的真实困境
1.1 一个被问烂了但始终没有标准答案的问题
做AI推理部署的人,几乎都绕不开这个问题:到底用GPU还是NPU?每次技术选型会上,这个问题一抛出来,基本就是两派意见僵持不下。做算法出身的人倾向GPU,理由很直接——生态成熟、框架支持好、调试方便;做嵌入式或端侧出身的人倾向NPU,理由也很硬——功耗低、体积小、单位成本可控。
但真正做过完整项目交付的人心里都清楚,这个问题本身就问错了。它把推理硬件选型简化成了一个二选一的单选题,而实际工程中,答案往往在第三个方向上。
我前后参与过几个不同量级的推理项目,从边缘端的小盒子到机房里的推理集群都碰过。踩过的坑包括但不限于:选了GPU结果功耗和散热压不住、选了NPU结果模型算子不支持导致回退到CPU跑、两种方案都试了发现混合部署才是最优解。这些经历让我逐渐意识到,推理硬件选型的核心不是“选哪个”,而是“怎么配”。
1.2 为什么GPU和NPU的二元对立是个伪命题
先把这个问题的本质拆开来看。GPU的强项在于通用并行计算能力,它的架构设计决定了它能高效处理大量同构的浮点运算,加上CUDA生态积累了十几年的工具链和算子库,几乎你听说过的所有深度学习框架都对它做了深度适配。但代价是什么?功耗高、发热大、单位算力成本在低负载场景下不划算。
NPU的逻辑正好反过来。它是为特定类型的计算定制的,通常在矩阵乘法、卷积运算上能做到极高的能效比。但它的短板也很明显:算子覆盖有限,遇到不支持的算子就得回退,回退到CPU之后性能可能直接掉一个数量级。而且不同厂商的NPU工具链差异巨大,模型转换和量化过程经常出各种莫名其妙的错误。
所以你看,GPU和NPU各自的优劣势是互补的,不是对立的。把它们放在一起对比然后选一个,就像问一个木匠“你要锤子还是螺丝刀”——答案是看你在干什么活。
1.3 第三个答案到底是什么
我说的“第三个答案”,不是某个具体的硬件产品,而是一种选型思路:按推理任务的特性做分层部署,让GPU和NPU各干各擅长的事,同时引入第三种计算资源作为弹性补充。
这个第三种计算资源,在不同场景下可能是CPU集群、可能是FPGA、也可能是新兴的存算一体方案。核心思想是:不要试图用一种硬件解决所有推理需求,而是根据任务的延迟要求、吞吐量要求、精度要求、功耗约束,把推理负载拆分到最合适的硬件上。
听起来像是正确的废话?别急,接下来我会把这套思路拆成可操作的步骤,包括怎么评估任务特性、怎么划分负载、怎么处理混合部署中的工程问题。这些内容不是从文档里抄的,是我在实际项目中反复试出来的。
2. 推理任务特性评估方法论
2.1 先搞清楚你的推理任务属于哪一类
在做任何硬件选型之前,你需要先把推理任务分类。我一般从四个维度来评估:
第一个维度是延迟敏感度。有些推理任务是实时性的,比如视频流中的目标检测,要求单帧处理时间在几十毫秒以内;有些则是批处理性质的,比如离线文档分析,跑几个小时也无所谓。延迟敏感度直接决定了你能不能接受队列排队和批处理带来的额外延迟。
第二个维度是吞吐量需求。单位时间内需要处理多少条推理请求?是每秒几条还是每秒几万条?这个数字决定了你需要多少并行计算资源。
第三个维度是模型复杂度。模型有多少层、参数量多大、有没有特殊算子(比如自定义的注意力机制变体、非标准卷积等)?这直接影响NPU能不能跑、需不需要回退。
第四个维度是精度要求。能不能接受INT8量化?还是必须保持FP16甚至FP32?量化对精度的损失在你的业务场景中是否可接受?这个问题直接关系到NPU的可用性,因为很多NPU对低精度计算的支持远好于高精度。
把这四个维度画成一个雷达图,你就能大致看出你的推理任务是什么“形状”。延迟敏感+高吞吐+复杂模型+高精度,这种任务基本只能上GPU。延迟不敏感+低吞吐+简单模型+可量化,NPU是更好的选择。而大多数实际任务,都落在中间地带。
2.2 算一笔真实的账:GPU和NPU的成本对比
光说定性分析不够,得算账。我拿一个实际项目的数据来举例(数据做了脱敏处理,但比例关系是真实的)。
假设你需要部署一个图像分类服务,模型是ResNet-50级别的规模,QPS要求是500,延迟要求P99在100ms以内。
方案A:单张推理卡GPU。单卡吞吐量实测大约能到1200 QPS(batch size调到最优的情况下),功耗250W,整机(含CPU、内存、主板等)成本约3万。为了满足500 QPS,一张卡绰绰有余,但考虑到冗余和峰值,可能需要两张卡做负载均衡。总算力成本约6万,总功耗约600W(含整机)。
方案B:NPU加速卡。单卡吞吐量实测大约300 QPS(同样batch size调优),功耗75W,单卡成本约8000。满足500 QPS需要两张卡,加上冗余需要三张。总硬件成本约2.4万,总功耗约300W(含整机)。
从纯数字上看,NPU方案在成本和功耗上都有明显优势。但这里有几个隐藏成本需要算进去:
- 模型转换和调优的人力成本:NPU的模型转换通常需要专门的工具链,遇到不支持的算子需要手动替换或重写。这个过程的耗时可能是GPU方案的3到5倍。
- 运维复杂度:NPU的监控工具、日志系统、故障排查手段通常不如GPU成熟,出问题时的定位时间更长。
- 弹性扩展的灵活性:GPU方案在需要临时扩容时,云服务商的选择更多,NPU的云实例相对有限。
把这些隐性成本折算进去,NPU方案的总拥有成本优势可能从表面的60%缩小到20%到30%。这个差距仍然值得考虑,但不再是“碾压式”的优势了。
2.3 什么情况下必须考虑混合方案
有三种情况,我会强烈建议考虑GPU+NPU的混合部署:
第一种是模型异构的场景。你的服务里可能同时跑着好几个模型:一个大的主干模型做特征提取,几个小的辅助模型做后处理。大模型对算力和精度要求高,适合GPU;小模型对延迟和功耗敏感,适合NPU。把它们拆开部署,各取所需。
第二种是流量波峰波谷明显的场景。白天高峰期QPS可能是夜间的10倍。如果全部用GPU,低谷期资源浪费严重;如果全部用NPU,高峰期可能扛不住。用NPU做基础负载,GPU做弹性扩容,是更经济的做法。
第三种是端云协同的场景。端侧设备用NPU做初步推理和过滤,把复杂样本上传到云端GPU做精细推理。这样既降低了端侧的功耗和成本,又保证了整体精度。
3. 混合部署的工程实现细节
3.1 负载划分策略:什么任务放GPU,什么任务放NPU
负载划分不是拍脑袋决定的,我一般用一套简单的评分机制来做初步判断,然后再用实际测试来验证。
评分维度包括:
| 评估维度 | 倾向GPU的分值 | 倾向NPU的分值 |
|---|---|---|
| 模型算子复杂度 | 高(有自定义算子) | 低(标准算子为主) |
| 精度要求 | FP16及以上 | INT8可接受 |
| 延迟要求 | P99<50ms | P99<200ms即可 |
| 吞吐量波动 | 波动大 | 波动小 |
| 功耗约束 | 宽松 | 严格 |
| 团队技术栈 | 熟悉CUDA | 熟悉NPU工具链 |
每个维度打1到5分,加总后如果GPU倾向分明显高于NPU,就放GPU;反之放NPU;如果接近,就做A/B测试。
这套评分机制看起来简单,但实际用起来很有效。它强迫你在选型之前把关键约束想清楚,而不是凭感觉做决定。
3.2 模型转换与算子兼容性处理
这是混合部署中最容易踩坑的环节。NPU的模型转换通常需要经过“框架模型→中间格式→NPU指令”的流程,每一步都可能出问题。
我遇到过的典型问题包括:
- 算子不支持:某个自定义的激活函数在NPU上没有对应实现。解决方案是用近似算子替换,或者在NPU上跑一部分、回退到CPU跑另一部分。
- 量化精度损失:INT8量化后模型精度掉了3个百分点,超出了业务容忍范围。解决方案是采用混合量化策略,对精度敏感的层保持FP16,其余层用INT8。
- 动态shape支持有限:NPU对动态输入尺寸的支持通常不如GPU,需要固定输入尺寸或者做padding处理。
处理这些问题的通用思路是:先在NPU上跑一遍完整的模型转换流程,记录所有报错和不支持的算子,然后逐个解决。不要试图一次性解决所有问题,而是先让模型能跑起来,再逐步优化。
3.3 推理请求的路由与调度
混合部署之后,你需要一个调度层来决定每个推理请求发给GPU还是NPU。这个调度层可以很简单,也可以很复杂,取决于你的业务需求。
最简单的做法是静态路由:根据模型类型直接指定硬件。比如模型A走GPU,模型B走NPU。这种方式的优点是实现简单、延迟可预测;缺点是无法根据实时负载做动态调整。
进阶做法是动态路由:调度层实时监控GPU和NPU的队列长度、利用率、延迟指标,把请求发给当前负载较低的硬件。这种方式能提高整体资源利用率,但实现复杂度更高,而且需要处理“同一个请求在不同硬件上结果可能不一致”的问题。
我的建议是:先从静态路由开始,等业务稳定后再考虑动态路由。静态路由虽然不够“智能”,但它的可预测性和可调试性在早期阶段更重要。
4. 实操过程中的避坑指南
4.1 性能测试的常见误区
做硬件选型时,性能测试是必不可少的环节。但我见过太多人在测试环节踩坑,导致选型决策基于错误的数据。
误区一:只看峰值吞吐量。很多测试报告只给出batch size调到最大时的吞吐量,但实际业务中batch size往往受限于延迟要求,不可能无限增大。正确的做法是在满足延迟约束的前提下测吞吐量。
误区二:忽略预热时间。GPU和NPU在刚启动时性能都不在最佳状态,需要一定的预热时间。如果测试时没有考虑预热,得到的首请求延迟会偏高,影响判断。
误区三:用理想数据测试。用规整的、分布均匀的数据做测试,和用真实业务数据做测试,结果可能差很多。特别是NPU,对输入数据的分布比较敏感,建议用真实数据做测试。
误区四:只测单模型。实际业务中往往是多个模型串联或并联运行,单模型性能好不代表多模型混合运行时性能也好。资源竞争和上下文切换的开销需要在实际场景中测试。
4.2 功耗与散热的实际考量
NPU的功耗优势在纸面上很明显,但实际部署时需要考虑整机功耗和散热方案。
我遇到过的一个情况是:单看NPU卡本身的功耗确实低,但为了给多张NPU卡提供足够的PCIe带宽和内存,整机的功耗并没有比GPU方案低太多。而且NPU卡的散热设计通常不如GPU卡成熟,在密集部署时容易出现局部过热的问题。
建议在做功耗评估时,以整机为单位计算,而不是只看加速卡本身。同时要考虑机柜的供电和散热能力,避免出现“卡能跑但机柜扛不住”的情况。
4.3 软件栈的成熟度差异
GPU的软件栈经过多年发展,工具链、监控、调试、社区支持都比较完善。NPU在这方面还有明显差距。
具体来说,GPU上你可以用nvidia-smi实时监控利用率、显存、温度、功耗等指标,有成熟的profiling工具做性能分析,遇到问题有大量的社区讨论可以参考。NPU的对应工具通常功能更少、文档更薄、社区更小。
这不是说NPU不能用,而是说你需要为此做好心理准备和人力准备。如果你的团队没有NPU相关的经验,建议先做一个小规模的试点项目,积累经验后再扩大部署。
5. 不同场景下的选型建议
5.1 云端推理集群的选型思路
云端推理集群的特点是规模大、负载波动明显、对弹性扩展要求高。在这种场景下,我的建议是以GPU为主、NPU为辅。
GPU的通用性和生态优势在云端场景下价值最大,因为云端往往需要支持多种模型和框架,GPU的兼容性更好。NPU可以作为特定模型的加速补充,比如对某些已经调优好的模型用NPU跑,降低整体成本。
另外,云端场景下要考虑多租户隔离和资源调度的问题。GPU的虚拟化方案相对成熟,NPU的虚拟化支持还在发展中,这也是选型时需要考虑的因素。
5.2 边缘端推理的选型思路
边缘端的特点是功耗约束严格、空间有限、运维不便。在这种场景下,NPU通常是更合适的选择,但前提是你的模型能在NPU上高效运行。
边缘端选型的关键是先确定模型,再选硬件。因为边缘端的硬件一旦部署就很难更换,而模型是可以调整的。先确定业务需要的模型精度和延迟,然后找能满足这个需求的NPU方案,必要时对模型做剪枝、量化等优化来适配NPU。
如果模型实在无法适配NPU,再考虑低功耗GPU方案。但要做好散热设计,边缘端的散热条件通常比机房差很多。
5.3 端云协同场景的选型思路
端云协同是最近越来越常见的部署模式。端侧做初步推理,云侧做精细推理。这种场景下,端侧几乎必然选NPU(功耗和成本约束),云侧几乎必然选GPU(算力和生态优势)。
端云协同的关键不在于硬件选型,而在于端云之间的任务划分和通信优化。哪些任务在端侧做、哪些上传到云侧、上传的数据量多大、通信延迟如何控制,这些问题比硬件选型更重要。
我的经验是:端侧尽量多做过滤和初筛,只把真正需要精细推理的样本上传到云侧。这样既能降低云侧的计算压力,又能减少通信带宽消耗。
6. 常见问题与排查技巧
6.1 NPU模型转换失败怎么办
这是最高频的问题。排查思路如下:
- 确认算子支持列表:先查NPU厂商提供的算子支持文档,确认模型中用到的算子是否都在支持列表中。不在列表中的算子需要替换或回退。
- 检查输入shape:NPU通常对输入shape有要求,比如必须是特定倍数的对齐。检查你的输入shape是否符合要求。
- 检查量化配置:如果做了量化,检查量化配置是否合理。不合理的量化范围会导致精度大幅下降甚至转换失败。
- 查看转换日志:NPU的转换工具通常会输出详细的日志,仔细阅读日志中的warning和error信息,往往能找到线索。
6.2 混合部署下结果不一致怎么处理
GPU和NPU跑同一个模型,结果可能有细微差异。这种差异来自浮点运算顺序不同、量化策略不同等因素。
处理方式取决于业务对一致性的要求:
- 如果业务能容忍微小差异:设定一个容差范围,在范围内的差异不处理。
- 如果业务要求严格一致:考虑统一用同一种硬件跑,或者在后处理阶段做结果对齐。
- 如果差异影响业务逻辑:需要深入分析差异来源,可能是某个算子的实现不同导致的,需要针对性处理。
6.3 性能不达预期怎么排查
性能不达预期时,按以下顺序排查:
| 排查步骤 | 检查内容 | 常见问题 |
|---|---|---|
| 1 | 硬件利用率 | 利用率低说明瓶颈不在加速卡 |
| 2 | 数据预处理 | 预处理耗时可能成为瓶颈 |
| 3 | 内存带宽 | 内存带宽不足会限制加速卡性能 |
| 4 | 批处理策略 | batch size设置不合理 |
| 5 | 模型优化 | 模型本身有优化空间 |
| 6 | 驱动和固件 | 版本不匹配可能导致性能下降 |
这套排查顺序是从外到内、从易到难,能帮你快速定位大部分性能问题。
6.4 独家避坑经验分享
最后分享几个我在实际项目中总结的经验,都是文档里不会写的:
第一,NPU的“理论性能”和“实际性能”差距可能很大。厂商标称的TOPS数字是在理想条件下测出来的,实际跑你的模型时可能只有标称值的30%到50%。做选型时一定要用真实模型做实测,不要只看标称参数。
第二,GPU的“浪费”有时候是必要的。用GPU跑一个小模型,利用率可能只有20%,看起来是浪费。但如果这个小模型的延迟要求很高,GPU的冗余算力反而能保证延迟稳定。不要单纯为了“不浪费”而把任务迁移到NPU上。
第三,混合部署的运维成本被严重低估。两种硬件的监控、告警、故障处理流程都不一样,运维团队需要掌握两套技能。如果团队规模有限,混合部署可能反而增加负担。这种情况下,统一用一种硬件可能更务实。
第四,不要忽视CPU的作用。在很多推理场景中,CPU并不是只做数据预处理和后处理。对于一些轻量级的模型,CPU推理的性价比可能比GPU和NPU都高。选型时把CPU方案也纳入对比,有时候会有意外收获。
第五,硬件选型不是一次性的决定。业务在变、模型在变、硬件也在迭代。建议每半年到一年重新评估一次选型方案,看看是否有更优的选择。不要因为“当初选了GPU”就一直用GPU,也不要因为“NPU便宜”就盲目迁移。
这套选型思路我在几个项目中反复验证过,核心逻辑就是:不要被“GPU还是NPU”这个二元问题框住,而是从任务特性出发,找到最适合的硬件组合。有时候答案是一种硬件,有时候是两种硬件的组合,有时候甚至是三种。关键是想清楚你的约束条件和优化目标,然后让硬件去适配任务,而不是反过来。