
说实话刚看到Arm新一代旗舰CPU公开的时候我第一反应是“又来挤牙膏了”但真把资料翻完又上手跑了几个端侧AI画质增强的Demo发现这次确实有点东西。尤其是“手机吃上AI超分插帧”这件事已经不是发布会上拿来画饼的概念而是能在Arm新架构上落地跑通的实用技术。这篇就围绕Arm新架构、AI超分、插帧三件事把我实际体验过程中的原理拆解、参数取舍和踩坑记录都摊开讲给想做端侧画质增强的开发者一个参考。1. Arm新架构到底新在哪1.1 新CPU、新GPU、新NPU的组合拳Arm这次更新的核心不只是某一颗CPU核的频率拉升而是把CPU、GPU、NPU三条线一起换代形成了一套面向端侧AI负载的组合方案。其中CPU方面新发布的C1-Ultra延续了“超大核”路线重点提升了单核的IPC和浮点计算能力配合新一代L2/L3缓存设计在跑AI预处理任务时能把带宽瓶颈缓解不少。GPU方面新架构的旗舰Immortalis系列图形核心增加了对AI超分和插帧更友好的算力资源。直观感受是以前在GPU上跑一个轻量级超分模型要占用大量的纹理单元和ALU画质和帧率很难两全现在GPU本身为这类计算做了调度优化能够把一部分低精度矩阵运算分流到专用硬件或NPU上游戏渲染管线能省出更多吞吐量。NPU的变化同样关键。新架构中的Ethos系列NPU加强了对INT8、INT4量化的支持并且把算子库覆盖到了更多张量运算上。这意味着超分、光流预测、插帧合成这些环节可以不再全部压在GPU上而是由NPU接管一部分高耗时的卷积操作整个系统跑起来更从容。以前做端侧AI插帧经常会遇到“NPU不支持某个算子只能退回CPU跑”的尴尬新架构明显在算子覆盖上收敛了很多问题。1.2 为什么专门为端侧AI画质增强做调整这次新架构的一大变化是把“端侧AI画质增强”当成了核心场景来设计而不是像以前那样只宣传“AI算力TOPS数字”。超分和插帧这两项技术对硬件的需求差异很大超分侧重高吞吐、高带宽要不断读取低分辨率帧并生成高分辨率结果插帧侧重低延迟、强时序感知需要在两帧之间算出运动矢量并合成中间帧。两者叠加对缓存、内存带宽和算力调度都有极高要求。Arm这次的调整思路我总结下来是三个关键词带宽优先、小型化算子、异构激发。带宽优先是指通过新的缓存层次和内存管理策略让数据在NPU、GPU、CPU之间流动时减少等待小型化算子是指NPU支持更多低精度、小尺寸卷积核避免因算子不支持而反复做内存搬运异构激发则是让CPU、GPU、NPU各司其职由驱动层的调度器自动分配任务。从实际体验来看这套设计确实有效果。我在测试设备上跑同一套超分加插帧流水线老平台在帧率为45fps时会明显感觉到发热和卡顿新架构平台在60fps基准下还能保持比较平稳的功耗曲线。很多时候我们看架构发布往往只盯频率和跑分但真正影响端侧AI体验的恰恰是这些不太起眼的缓存策略和算子调度。2. AI超分、插帧的原理用大白话说清楚2.1 超分并不是“放大”是“重建”很多人以为超分就是把图像用双线性算法放大其实那是传统缩放和AI超分完全两码事。AI超分的本质是通过大量低分辨率和高分辨率成对图片训练出来的神经网络在推理时“猜”出原始画面中丢失的高频细节。举个例子一个游戏用720p渲染普通线性缩放拉伸到2K屏幕画面是模糊的而AI超分可以基于训练经验把边缘、纹理、反光这些细节重建出来观感上接近原生2K。端侧超分常用模型大致分两类一类是轻量CNN比如基于ESPCN、FSRCNN的变体参数量小适合手机NPU实时运行另一类是带注意力机制的深层网络画质更好但计算量偏大实时性难保证。在实际项目里我一般把超分模型控制在1到5 GFLOPs之内这样在移动端能做到每帧几十毫秒内完成推理。超分模型的输入输出也存在一个反直觉的点直接放大倍数越大重建难度呈指数级上升。跑端侧超分时我习惯做两次1.5倍到2倍的级联放大而不是一次直接放大3倍甚至4倍。中间加一次轻量锐化或降噪反而比硬上大模型效果更稳定细节也不容易糊。2.2 插帧要猜运动猜错了就鬼影插帧的底层逻辑也不复杂假设当前有第1帧和第3帧系统先估算画面里物体运动的方向和速度再合成出一个第2帧插在中间。这个“估算运动”的过程称为运动估计主流做法是光流法也就是对像素或图像块逐一算出运动矢量有了运动矢量之后再做运动补偿把前后帧的像素按照矢量扭曲合成生成中间帧。问题在于光流法对遮挡、快速运动、重复纹理这些情况特别敏感。物体背后刚露出来的区域前帧根本没有信息只能靠后帧猜高速运动时前后两帧差异太大光流算不准就容易产生残影和破碎感。手机端做插帧还有个特殊限制数据不能像离线视频处理那样整段拿到手只能靠几帧缓存里的信息来实时预测运动估计窗口有限出错率更高。所以端侧插帧工程化时我通常会做几个收口限制插帧倍数不要从30fps直接插到120fps尽量做到60到120fps这种两倍以内加入全局运动检测画面快速切换或镜头剧烈晃动时暂停插帧避免烂帧对运动矢量做个中值滤波把明显突兀的矢量修正掉减少鬼影。2.3 Arm平台上谁负责哪一步一套端侧超分插帧的完整流水线大致包含低分辨率渲染、超分重建、运动估计、中间帧合成、显示输出这几个环节。在新Arm架构上分工可以做得比较干净。低分辨率渲染和中间帧合成这两步天然适合GPU。GPU本身有光栅化和纹理采样单元合成中间帧时可以直接用计算着色器做像素级扭曲效率很高。超分重建和运动估计则更适合NPU。因为这两个环节的核心都是卷积和矩阵运算NPU的高并行低精度能力能够吃得掉而且不会占用GPU宝贵的渲染周期。CPU则负责流水线调度、输入帧缓存管理和异常处理。实际开发时任务分配到什么程度要看设备的内存带宽和NPU性能。我见过有些方案图省事把超分和插帧全塞进NPU结果NPU算力不够导致掉帧也见过全塞进GPU导致渲染帧率直接腰斩。在新Arm平台上利用驱动提供的异构调度接口把“超分丢给NPU、插帧合成丢给GPU、CPU只做调度”是最稳妥的写法。3. 把AI超分插帧跑在Arm新架构上3.1 端侧部署的完整链路PyTorch到TFLite再到NPU先说模型训练和转换。训练阶段在PC上完成用PyTorch或TensorFlow都行但到了部署阶段我会统一把模型导出为ONNX再转成TFLite格式。为什么选TFLite而不直接跑原始PyTorch因为TFLite对移动端推理、NPU加速和INT8量化支持最成熟生态里的Delegate机制能直接把算子分发到Arm Ethos NPU。导出转换时有个坑有些算子比如GroupNorm、动态Resize在ONNX和TFLite之间转换会失败导致模型里出现大量无解的“不支持的算子”。所以我一般在模型设计阶段就避开这些特殊层能换成BatchNorm就换Resize倍率固定成常量这样转换链路会顺畅很多。如果项目中必须用某些特殊算子就手动实现对应的TFLite自定义算子但这会增加不少工作量能不用就不用。转换完成后做量化这是端侧部署最重要的一环。超分和插帧模型参数量不大但计算量不小如果用FP16在GPU上跑功耗高且容易发热转成INT8交给NPU能显著降低时延和内存带宽占用。量化时我有几个固定动作先准备几百张有代表性的校准图覆盖暗场景、亮场景、复杂纹理等类型量化敏感度分析分别量化每一层看精度损失最后做混合量化把某些对精度极敏感的层保留FP16其余全量INT8。3.2 关键参数量化、时延预算、内存带宽量化的精度损失是超分插帧项目里最需要盯的指标。模型在PC上跑出来的PSNR和SSIM再好看一旦量化成INT8细节纹理很容易出现块状模糊插帧则可能因为光流预测误差变大出现闪烁。我给团队定的规则很死量化后PSNR下降必须控制在0.3dB以内SSIM下降必须控制在0.01以内超过就得换混合量化方案。时延预算方面超分和插帧不能无限制吃帧预算。以60fps游戏为例一帧的总预算约16.6毫秒渲染占掉一半以上。实测下来超分模型把1080p放大到2K在NPU上单帧推理大概需要4到6毫秒光流估计加中间帧合成GPU上大概需要3到4毫秒。这么一算画质增强整体占用7到10毫秒游戏渲染势必得让出一些预算。所以更合理的做法是游戏先降低渲染分辨率用720p渲染再用超分拉回1080p或2K。这样虽然加了超分耗时但渲染阶段每帧省下的时间更多总帧率反而可能上升。这个思路非常重要AI画质增强不是单纯画蛇添足它是一个可以“拿总帧率换画质”的调节杠杆。内存带宽是另一个容易被低估的瓶颈。超分要读低分辨率帧、写高分辨率帧插帧要读前后两帧、写中间帧一来一回数据量非常大。Arm新架构对带宽做了优化但实际工程里还要做好帧缓冲复用用 FrameBuffer 管理池循环利用显存避免频繁分配和释放中间计算结果尽量用低精度存储插帧只需要最近两帧老帧及时释放不给内存系统增加无谓负担。3.3 手把手调优路径与实测数据调优路径我会按下面的顺序来。第一步先把流水线跑通用最简单的方式验证端到端流程。我通常会先用CPU做全流程推理确保超分结果和插帧结果正确再逐步把模块迁移到NPU和GPU。这一步要重点检查色彩空间转换超分模型如果训练用的是YCbCr部署时就得在GPU或CPU上先做RGB到YCbCr转换输出后再转回RGB转换环节的舍入误差很容易被忽略。第二步把关键算子迁移到NPU用Arm的TFLite Delegate把超分模型和光流模型推给NPU。迁移后立刻跑了性能测试记录单帧推理时间、NPU占用率、DSP负载这些指标。以我测试的轻量超分模型为例在PC上GTX 3080单帧耗时约0.8毫秒转到手机NPU跑INT8后约4.5毫秒虽然慢了很多但手机端这个耗时是可接受的。第三步GPU插帧合成。用Vulkan Compute Shader写中间帧合成输入是光流图、前帧、后帧和遮挡掩码输出是插帧结果。这里我把合成kernel拆成了三段矢量变形、遮挡检测、混合加权方便单独优化每一段。实测在GPU上处理一帧1080p中间帧三段合计大约2.8毫秒帧率损失在可控范围内。第四步做端到端联调和功耗测试。我用的是某台搭载新Arm旗舰平台的工程机开启超分和插帧后的整机表现是游戏以720p渲染超分到2K分辨率再插帧把60fps提到120fps整条流水线延增加约9毫秒左右画面观感明显比原生720p锐利运动流畅度也比原生60fps丝滑很多。当然功耗同步起来了连续玩半小时机身有明显热感但整体还在可接受的范围内。4. 踩坑合集常见问题与排查实录4.1 花屏闪烁、色偏抖动量化精度的锅第一类高频问题是超分输出画面出现花屏、闪烁和色偏这类问题十有八九出在INT8量化环节。我遇到过最典型的一种情况超分模型在PC上FP16跑得好好的转成INT8上NPU后画面中原本平滑的渐变区域出现了一层一层的色带亮部区域还伴随时序上的亮度抖动。排查思路是先做局部量化定位。具体操作是保存模型每一层的输入输出张量分别用FP16和INT8跑一遍对比哪些层的误差峰值最大。定位到问题层后把这些层改成FP16或FP32其余层保持INT8。混合量化通常就能解决绝大部分精度问题。色带问题则要靠加抖动噪声或微扰项来打破也就是在量化输出前对激活值加一点极小的随机噪声能有效减轻色带效应。还有一类特殊情况模型在NPU和GPU上推理结果不一致表现为同一帧画面在NPU上输出偏绿在GPU上输出正常。这种大概率是NPU实现的算子精度和GPU不同比如某些激活函数在NPU上用了近似实现。我的处理办法是把有精度偏差的算子强制放回GPU执行或者在模型里加入一个小的修正层把误差统一矫正回来。4.2 插帧鬼影光流预测不稳怎么办第二类高频问题是插帧出来有鬼影特别是人物边缘、手臂和背景交错区域容易出现半透明残影。这是光流预测在遮挡区域失效的典型表现。运动物体背后的背景在前后帧中可能被遮挡或显露光流算法没有足够信息就会产生错误的运动矢量合成时把前后帧错误像素混在一起。我排查鬼影问题时会先做可视化把光流图以颜色编码的方式直接输出到屏幕上。看渲染出来的伪彩光流图哪里出现明显杂色、哪里矢量方向紊乱一目了然。针对遮挡区域最常见的修复方案是引入遮挡掩码用一个二分类网络或传统差值法判断每个像素是否处于遮挡区生成0到1的掩码图合成时对遮挡区域减少前帧权重多依赖后帧信息。如果光流图大范围错误就得从模型训练数据入手。训练光流模型时要加入更多快速运动、遮挡比例高的样本甚至用渲染引擎合成一些带真实运动矢量的数据集让模型学会在极端情况下仍然输出合理结果。这也是为什么移动端插帧想做好的团队往往会自研光流模型而不是直接套用PC上的现成模型。4.3 从x86迁移到Arm带来的底层适配问题如果你跟我一样项目原本是在x86 PC上做原型开发再往Arm手机端迁移那一定会遇到底层适配的坑。最典型的是动态库问题不少第三方库在x86上编译出了.so直接拿到Arm设备上会因为ABI不兼容报错。.so文件从x86迁移到Arm必须用ARM64交叉编译工具链重新编译并且确认链接的依赖库也有ARM64版本。另一个坑是指令集差异。x86的SSE/AVX指令和Arm的NEON指令完全不同代码里如果写了很多x86平台特有的SIMD intrinsic迁移到Arm后得用NEON intrinsic重写。比如色空间转换这种对性能敏感又计算量大的模块如果直接用通用C代码写效率可能很差用NEON重新实现后性能可以提升好几倍。我们在迁移时还踩过编译器的坑。不同版本编译器对自动向量化的支持差异很大同样的循环代码在老版本编译器下可能完全无法触发NEON加速。我后来统一用Arm官方推荐的编译器版本并且在编译选项里显式开启-O3 -mcpunative -ffast-math具体参数根据设备CPU调整才把很多热循环的性能拉上来。性能调优时还常用一个办法是用Arm的Performance Monitors Unit寄存器来统计缓存命中率、分支预测失败率等硬件指标再从这些指标倒推代码瓶颈。4.4 性能上不去先查PMU寄存器和cache命中率很多新手在调优端侧AI性能时上来就盯着NPU算力或GPU频率觉得“算力够就一定不卡”。但实际中我遇到好几次模型推理耗时不长端到端帧率却上不去。这种场景我建议先从系统级的硬件计数器查起Arm PMU寄存器能提供非常详细的硬件性能数据。PMU可以统计三类最关键的数据缓存命中率、内存访问延迟和分支预测情况。以插帧为例如果光流图和前后帧都放在内存里GPU计算着色器读取时如果大量L2缓存未命中那性能瓶颈就不在计算单元而在数据搬运。我遇到过合成着色器耗时1.2毫秒但其中近七成时间在等内存数据的情况。调整数据布局把每个工作小组要访问的数据尽量打包到连续内存并把输入帧改成tiled格式耗时立刻从1.2毫秒降到0.6毫秒。再举一个实际例子超分模型输入是720p三通道图像如果按NHWC布局存储某些NPU实现反而更高效但GPU上常用的又是NCHW布局。直接照搬PC端的布局方式往往吃亏我们是靠PMU统计出来的带宽和缓存命中率反推不同布局的优劣。经验就是在生产环境里一个看似简单的内存布局调整效果可能比换一个更大的模型更显著。5. 最后分享几个实操工具和我的个人体会如果打算在Arm新架构上做AI超分插帧项目手边值得常备几样工具。模型分析和部署用Netron、onnxruntime和TFLite工具链算子性能分析用Arm的Streamline Performance Analyzer它能把CPU、GPU、NPU各模块占用率直观的展示出来底层寄存器调试可以用一小段基于perf_event_open封装的自研工具或者直接用perf命令读PMU事件。我的个人体会是手机端AI超分插帧听起来高大上但真正落地时拼的并不是某个炫酷模型而是调度、带宽、量化、功耗这些“脏活累活”。Arm新架构把这些底层能力补齐了不少但工程上该踩的坑一个都不会少。尤其是量化精度和光流鲁棒性这两个点一定要在项目一开始就当作核心风险来管控否则到了联调阶段再返工那时间成本可真不是小数。另外做这类端侧画质增强一定要记得先明确目标设备和性能红绿线。我的做法是先在目标机器上跑一个最小可运行的原型测出超分和插帧各自的时延基线再决定模型复杂度和功能开关。先定基线再做功能这个顺序不要反过来。数据方面如果只是工具生成端到端Demo场景会比较理想如果是真机连续使用一定要盯住功耗和散热。最后想多说一句插帧这东西并不是倍数越高越好也不是任何时候都该开。系统检测到快速切换场景或画面大幅抖动时宁可暂停插帧保持稳定性也不要生硬合成出错误的中间帧。我在这上面吃过亏如果你正在做类似项目一定别忽视这个细节。