到了2025年,AI手机已经成了主流。几乎每一款新发布的旗舰手机,都在强调自己的AI能力,什么AI摄影、AI修图、AI翻译、AI助手,这些功能的背后,都离不开一个核心硬件,那就是NPU。

NPU(Neural Processing Unit,神经网络处理单元)是专门用来运行神经网络的处理器,它比CPU和GPU更适合做AI计算,性能更强,功耗更低。但很多开发者对NPU并不了解,不知道怎么配置和优化,导致AI应用在手机上运行得很慢,或者功耗很高。

这篇文章,我想详细讲解一下AI手机NPU的配置和优化。从基础概念到高级调优,帮你充分利用NPU的AI加速能力,让你的AI应用在手机上跑得又快又省电。

什么是NPU

在讲配置之前,先简单说说什么是NPU。

NPU是神经网络处理单元,是一种专门为人工智能计算设计的处理器。和CPU、GPU不同,NPU的架构是专门针对神经网络的计算特点设计的,特别是矩阵乘法和卷积运算,这些是深度学习中最常见的运算。

CPU是通用处理器,什么都能算,但效率不高。GPU擅长并行计算,在图形渲染和AI训练方面很强,但功耗比较高。而NPU是专门为AI推理设计的,它在做神经网络推理的时候,性能比CPU高几十倍,功耗比GPU低很多,非常适合在手机这种对功耗要求很高的设备上使用。

现在主流的手机芯片,比如高通骁龙、联发科天玑、华为麒麟、苹果A系列,都集成了NPU。不同厂商的NPU架构和性能不一样,但基本原理是一样的,都是通过专门的硬件加速神经网络推理。

NPU的主要应用场景包括:图像识别、人脸识别、语音识别、自然语言处理、AI摄影、AI修图、实时翻译等。这些功能如果用CPU来跑,会很慢很耗电,而用NPU来跑,就能做到实时运行,而且功耗很低。

NPU的工作原理

NPU的工作原理,简单来说就是把神经网络的计算,从CPU转移到专门的硬件上执行。

一个神经网络模型,通常由很多层组成,每一层都有大量的矩阵乘法和加法运算。这些运算的特点是数据量大、并行度高、控制逻辑简单。CPU做这些运算的时候,需要一条指令一条指令地执行,效率很低。而NPU有大量的计算单元,可以同时执行很多运算,所以效率很高。

具体来说,NPU通常采用"存算一体"或者"近存计算"的架构,减少数据搬运的开销。它有大量的乘加单元(MAC),可以在一个时钟周期内完成多次乘法和加法运算。还有专门的缓冲区,用来存储权重和激活值,减少对内存的访问。

当一个AI应用需要运行神经网络的时候,系统会把模型加载到NPU上,然后NPU逐层计算,最后输出结果。这个过程对开发者来说通常是透明的,系统会自动调度,但如果想要最好的性能,就需要手动配置和优化。

主流手机NPU架构

目前主流的手机NPU有几种架构,各有特点。

第一个是高通的Hexagon NPU。高通骁龙芯片里的NPU叫做Hexagon,从骁龙855开始集成,现在已经发展到第七代了。Hexagon NPU的特点是性能强,支持的算子多,生态完善。高通提供了Snapdragon Neural Processing Engine(SNPE)框架,开发者可以用这个框架把模型部署到NPU上。

第二个是联发科的APU。联发科天玑芯片里的NPU叫做APU(AI Processing Unit),性能也很强,特别是在中端芯片上,APU的表现往往比同价位的高通NPU好。联发科提供了NeuroPilot框架,支持TensorFlow、PyTorch等主流框架。

第三个是华为的达芬奇NPU。华为麒麟芯片里的NPU叫做达芬奇架构,特点是算力强,支持大模型推理。华为提供了MindSpore框架和HMS Core的AI能力,开发者可以很方便地调用NPU。

第四个是苹果的Neural Engine。苹果A系列芯片里的NPU叫做Neural Engine,从A11开始集成,现在已经发展到第七代了。苹果的NPU生态做得很好,Core ML框架非常成熟,开发者可以很方便地把模型部署到NPU上。而且苹果的NPU和系统结合得很紧密,很多系统功能都在用NPU加速。

不同厂商的NPU,性能和支持的算子都不一样。在做AI应用开发的时候,需要考虑兼容性,最好能支持多种NPU架构,或者用跨平台的框架,比如TensorFlow Lite、ONNX Runtime等。

基础配置:让模型跑在NPU上

讲完了基础概念,接下来讲怎么配置NPU。最基础的配置,就是让你的AI模型跑在NPU上,而不是CPU上。

如果你用的是TensorFlow Lite,配置很简单。TensorFlow Lite有一个NNAPI delegate,可以调用安卓系统的神经网络API,自动把计算分配到NPU上。代码大概是这样的:

val interpreter = Interpreter(model, Interpreter.Options().apply {
    addDelegate(NnApiDelegate())
})

加上这一行,模型就会尝试用NPU来加速。但要注意,不是所有的算子都支持NPU,如果模型里有NPU不支持的算子,系统会自动回退到CPU。这时候性能可能还不如纯CPU,因为数据在NPU和CPU之间搬运会有开销。

如果你用的是ONNX Runtime,配置也类似。ONNX Runtime有NNAPI EP(Execution Provider),可以调用NPU加速。代码大概是这样的:

val sessionOptions = OrtSession.SessionOptions()
sessionOptions.addNnapi()
val session = env.createSession(modelPath, sessionOptions)

如果你想针对特定厂商的NPU做优化,可以用厂商提供的框架。比如高通的SNPE,联发科的NeuroPilot,华为的MindSpore Lite。这些厂商框架能更好地利用NPU的性能,支持更多的算子,但缺点是不跨平台,只能在特定厂商的芯片上运行。

模型优化:让NPU跑得更快

让模型跑在NPU上只是第一步,想要更好的性能,还需要对模型进行优化。

第一个优化是模型量化。量化是把模型的浮点数参数转换成整数,比如从FP32转换成INT8。量化之后,模型的体积会变小,计算速度会变快,功耗会降低。NPU通常对INT8的支持最好,性能比FP16和FP32高很多。

TensorFlow Lite支持训练后量化和量化感知训练。训练后量化比较简单,不需要重新训练,直接把训练好的模型量化就行。量化感知训练需要在训练的时候加入量化的模拟,精度损失更小,但比较麻烦。一般来说,训练后量化就够用了,精度损失不大,但性能提升明显。

第二个优化是算子融合。算子融合是把多个小算子合并成一个大算子,减少计算量和内存访问。比如把卷积、激活、池化合并成一个算子。NPU通常对融合后的算子支持更好,性能更高。很多推理框架在转换模型的时候会自动做算子融合,但也可以手动优化。

第三个优化是减少模型大小。模型越小,加载越快,计算越少。可以用模型剪枝、知识蒸馏等方法来减小模型。模型剪枝是去掉模型中不重要的参数,知识蒸馏是用大模型训练小模型。这些方法能在保持精度的同时,大幅减小模型大小。

第四个优化是输入预处理优化。很多AI应用在输入模型之前,需要做预处理,比如缩放、裁剪、归一化。这些预处理如果用CPU来做,会很慢。可以把预处理放到NPU上做,或者用GPU来做,减少CPU的负担。

高级配置:多NPU调度和内存管理

基础配置和模型优化能解决大部分问题,但如果想要极致的性能,还需要一些高级配置。

第一个高级配置是多NPU调度。现在有些高端手机芯片有多个NPU核心,比如高通骁龙8 Gen3有两个NPU核心,联发科天玑9300也有多个APU核心。可以把模型的不同层分配到不同的NPU核心上,并行计算,提升性能。

但多NPU调度比较复杂,需要框架支持。高通的SNPE支持多NPU调度,可以指定模型运行在哪个NPU核心上。苹果的Core ML也支持多Neural Engine调度。开发者需要根据具体的框架来配置。

第二个高级配置是内存管理。NPU的内存和CPU的内存是分开的,数据需要在两者之间搬运。如果频繁搬运数据,会有很大的开销。可以通过复用内存、减少数据拷贝、使用零拷贝技术等方法,来减少内存开销。

比如,在处理视频的时候,可以直接把摄像头的帧数据传给NPU,不需要先拷贝到CPU内存。很多框架都支持零拷贝输入,能大幅提升性能。

第三个高级配置是动态形状支持。很多NPU只支持固定形状的输入,如果输入形状变化,就需要重新编译模型,会有延迟。现在一些新的NPU开始支持动态形状,但性能可能不如固定形状。如果你的应用输入形状不固定,需要考虑这个问题,可能需要做形状缓存或者动态批处理。

第四个高级配置是功耗控制。NPU虽然比CPU和GPU省电,但长时间高负载运行还是会发热,导致降频。可以通过调整NPU的性能模式、控制推理频率、做任务调度等方法,来平衡性能和功耗。比如,在不需要实时性的时候,可以降低NPU的性能模式,节省电量。

常见问题和解决方案

在实际开发中,经常会遇到一些问题,这里总结几个常见的问题和解决方案。

第一个问题是模型跑在CPU上而不是NPU上。这通常是因为模型里有NPU不支持的算子。可以用框架提供的工具查看模型的算子支持情况,把不支持的算子替换成支持的,或者用自定义算子。也可以尝试更新框架版本,新版本通常支持更多算子。

第二个问题是NPU推理精度下降。这通常是因为量化导致的。可以尝试用FP16量化代替INT8量化,或者用量化感知训练。也可以检查一下预处理和后处理的代码,确保和训练时一致。

第三个问题是NPU推理延迟不稳定。这通常是因为系统调度或者发热降频导致的。可以尝试用性能模式,或者减少推理频率,避免NPU长时间高负载。也可以做一些预热,提前加载模型,减少首次推理的延迟。

第四个问题是不同手机上表现差异大。这是因为不同厂商的NPU性能和支持的算子不一样。可以针对主流厂商的NPU做适配和测试,或者用跨平台框架,保证在不同手机上都能正常运行。

写在最后

NPU是AI手机的核心硬件,也是未来移动端AI发展的关键。充分利用NPU的加速能力,能让AI应用在手机上跑得又快又省电,给用户带来更好的体验。

这篇文章从基础概念到高级配置,讲解了NPU的配置和优化方法。但NPU技术发展很快,新的架构和新的框架不断出现,需要持续学习和跟进。

对于开发者来说,不要觉得NPU很神秘,其实配置起来并不复杂。从最基础的NNAPI delegate开始,让模型跑在NPU上,然后逐步优化模型和配置,就能获得不错的性能提升。

当然,NPU也不是万能的,它适合做神经网络推理,但不适合做通用计算。在做AI应用开发的时候,要合理分配CPU、GPU、NPU的任务,让每个硬件都做自己最擅长的事情,才能达到最好的整体性能。

最后用一句话来结束这篇文章:"好的AI应用,不是算法有多复杂,而是在端上跑得又快又省电。"

愿每一个开发者都能充分利用NPU的能力,开发出优秀的AI应用。