尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

端侧AI推理的带宽困局:Adreno Neural Fusion如何让大模型在手机跑起来?

端侧AI推理的带宽困局:Adreno Neural Fusion如何让大模型在手机跑起来? 前阵子我把一个70亿参数的对话模型量化后塞进手机跑推理首轮生成卡了近十秒才吐出一个词。当时我的第一反应是GPU算力不够可翻出Profiler一看计算单元利用率不足三成真正堵死的是数据搬运的通道。端侧AI推理的瓶颈从来不在峰值算力而在内存带宽和硬件利用率——这也是Adreno Neural Fusion这颗全新硬件加速单元要解决的问题。高通把它嵌进Adreno GPU内部不是想替代Hexagon NPU而是让AI负载在GPU本地就能高效完成绕开数据在不同芯片之间来回倒腾的老路。这篇文章我会从端侧AI为什么吃带宽、Neural Fusion在硬件层面做对了什么、开发者实际调优时怎么让算子真正落到这颗单元上这几个角度展开。适合正在做端侧大模型部署的工程师也适合对手机SoC架构感兴趣的硬件爱好者。1. 为什么GPU里要长出一颗专用AI内核1.1 端侧AI推理的“搬运工”困境算力够用带宽不够聊Neural Fusion之前得先把端侧AI推理的真实瓶颈讲透。很多人一听说手机跑大模型第一反应是“这得多少TOPS算力才够”其实这是误解。LLM推理是一个典型的memory-bound任务每生成一个token理论上都要把模型权重从内存里读一遍参与计算。也就是说权重多大单次推理的访存量就有多大这跟算力关系不大跟内存带宽的关系反而更直接。业界一直有个共识数据移动的能耗和延迟比浮点运算本身高出一到两个数量级。同样做一次乘累加操作计算单元消耗的能量可能只有数据搬运的几十分之一。所以当你把AI任务从CPU调度到GPU、再从GPU搬去NPU数据在总线上绕一圈功耗和延迟立刻上去了。手机不像数据中心散热和电池都有硬上限这种数据搬运动作就是在白白烧掉宝贵的功耗预算。这就是Neural Fusion出现的大背景。它本质上是一套靠近GPU计算阵列的硬件加速单元核心目标不是把算力堆到多夸张而是让模型权重和中间结果尽可能留在片内少去主存里跑几个来回。从工程角度理解这就好比CPU里L2 Cache命中率高的话程序跑得飞快Neural Fusion要做的是把“权重缓存命中率”这件事做成硬件资源从根上解决数据搬运开销。1.2 从图形着色器到AI张量引擎GPU的角色正在切换Adreno的发展轨迹很有意思。早期Adreno就是纯粹的图形处理器顶点着色、像素着色所有硬件设计都是围绕三角形和纹理映射来做的。后来引入了Compute Shader开发者可以通过OpenCL、Vulkan这类接口拿GPU去做通用计算这是GPGPU时代的起点。但Compute Shader本质上还是让一套为图形设计的SIMD流水线去执行通用计算任务矩阵乘法这种操作虽然并行度很高可它需要把矩阵拆成无数个小任务塞进通用指令流水线里大量的硬件资源被浪费在指令获取、调度、寄存器分配这些“杂事”上。Neural Fusion的思路是把神经网络最常出现的计算模式——矩阵乘法、卷积、激活、归一化——变成硬连线操作。你可以把它理解成GPU内部专门给AI挖了一条快车道不用再去排队等通用计算单元的调度而是让专门的MAC阵列乘累加阵列直接吃进张量数据。这个思路不是高通首创NVIDIA的Tensor Core、苹果的ANE都是同一逻辑但Adreno Neural Fusion的差异在于它的目标是明确的在手机的功耗墙内跑出真正可用的端侧大模型体验。从架构描述来看它和GPU的图形渲染单元共享一部分基础设施但又有自己独立的计算和存储资源这样才能做到“既能干活又不抢游戏渲染的资源”。1.3 为什么不能只靠Hexagon NPU很多人会问高通不是一直有Hexagon NPU吗拍照、语音、传感器处理都在用它AI任务全丢给NPU不就好了为什么GPU还要再长一套AI引擎这个问题我在跟同行交流时经常被问到我自己的理解是这样的。Hexagon NPU确实能效比很好但它是为特定类型的AI负载优化的。对于卷积网络、固定流程的视觉模型、音频识别这类任务Hexagon的表现非常出色。可到了大模型时代Transformer架构的特点是序列长度动态变化、注意力机制需要灵活的内存访问、计算模式也不像卷积那么规整。NPU这种专用处理器在灵活性上是有代价的遇到动态shape和复杂分支就不那么舒服了。另一个关键点在于现代AI应用早就不是单打独斗。比如端侧运行一个多模态助手它要处理摄像头输入、语音信号、文本生成、图像渲染整个链路横跨ISP、NPU、CPU、GPU。如果文本生成这段逻辑必须把数据先从GPU搬走再交回GPU显示这个穿梭成本就太高了。所以高通的思路是让Hexagon和Neural Fusion各管一摊Hexagon继续负责它擅长的视觉和语音小模型而Transformer大模型直接在GPU内部完成两者由高通的AI Engine运行时统一调度。总吞吐量上去了端到端延迟反而下来了。2. 拆解Neural Fusion的硬件底牌共享内存、混合精度与协同分工2.1 高带宽共享内存数据不再“过桥”我看高通公开的技术资料时反复被强调的一个词是“高带宽共享内存”。深挖下去会发现这恰恰是整个硬件加速单元设计里最值钱的部分。大模型推理的时候权重是反复使用的热点数据如果每一层计算都要从主存重新加载权重那DRAM带宽很快就会被吃满计算单元只能干等着。Neural Fusion的做法是在GPU内部提供一块容量可观的SRAM作为共享内存让权重和激活值在这块本地内存里流动。用生活化的类比来说传统GPU算AI好比每个工人都要去仓库领料来回一趟花时间花体力Neural Fusion相当于给工人身边修了一个临时物料架大部分常用材料顺手就能拿到。这个“物料架”就是高带宽共享内存它直接决定了数据能少走多少冤枉路。实际效果是模型权重被反复读取时大量访问可以在片内完成DRAM带宽占用明显下降整体的延迟和功耗都跟着改善。这块共享内存还有一个细节值得注意它不光是给计算单元用的还支持CPU和NPU通过统一的内存管理机制直接访问。这意味着一个tensor在GPU里算完如果下一步要交给Hexagon处理不需要做一次彻底的拷贝而可以通过软硬协同的方式做零拷贝或低开销共享。这种设计让异构计算真正成为一个整体而不是几个IP拼凑在一起。2.2 混合精度支持从FP16到INT4的硬件账聊完共享内存第二个关键底牌是精度策略。目前的端侧大模型推理几乎不可能全程用FP32算功耗和带宽都吃不消。行业的做法是量化训练时用高精度推理时把权重压到FP16、INT8甚至INT4。硬件加速单元的价值就在于原生支持这些低精度数据类型而不是靠软件模拟。我做过一个粗略的带宽估算很能说明问题。一个70亿参数的模型如果权重用FP16存储大约是14GB如果压到INT4大概3.5GB。手机内存和带宽都有限端侧推理要做得流畅除了量化没有别的出路。而INT4不仅是容量降下来了读取权重需要的带宽也同步降到FP16的四分之一。硬件层面做INT4点积其实有技巧会把多个INT4数据打包成一组在一条乘累加指令里连续处理这样才能把榨出来的带宽优势真正转化为性能提升。这里需要提醒一句精度支持不是光看数据类型列表还要看硬件怎么处理量化误差。同样标称支持INT4有的硬件做的是weight-only量化有的能把KV Cache也量化到INT8甚至INT4。把KV Cache也做低精度会在长对话场景里进一步降低内存和带宽压力。开发者选型时一定要看清楚硬件和运行时支持的量化粒度不然换来的可能不是性能而是对话越久越卡的体验。2.3 与Hexagon NPU、CPU的分工一张表看懂协同调度现在手机SoC里的AI算力早就是“群架”模式了单靠任何一块裸算力都撑不起复杂应用。以Snapdragon 8 Elite这类平台为例CPU、GPU含Neural Fusion、Hexagon NPU各自承担着不同的角色。计算单元擅长任务不擅长任务典型应用场景CPU延迟敏感的小任务、分支逻辑复杂的控制流大规模矩阵运算、高并行任务语音唤醒、小模型快速响应、任务调度Adreno GPU Neural FusionTransformer大模型、注意力机制、跨模态生成超低功耗的常驻AI任务端侧LLM对话、图像生成、AI辅助创作Hexagon NPU卷积网络、信号处理、固定流程视觉任务动态shape、长序列推理相机AI处理、语音识别、传感器理解这张表的划分不是绝对的但代表了高通当前异构AI调度的基本逻辑。Neural Fusion位于GPU内部所以天然适合和图形、显示输出紧密耦合的AI任务Hexagon NPU则更专注能效比极高的感知类工作。具体某个算子跑在哪通常不需要开发者手动指定高通AI Engine DirectQNN会根据算子的形状、精度、功耗预算和当前温度状态做动态决策。但这个调度器也不是万能的如果你在模型里写了某些奇怪的算子导致它无法识别那调度器也只会给你回落CPU性能直接打骨折。3. 从纸面架构到真实体验推理延迟、能效与温控3.1 本地大模型推理延迟的下降靠的是工程细节评估一个硬件加速单元不能只看发布会上的TOPS数字得看真实模型跑出来的延迟和吞吐。高通的公开演示里新架构平台可以在端侧跑70亿参数级别的多模态模型首token延迟已经进入可用范围。这个目标的实现靠的不是某一个大招而是前面说的共享内存命中、低精度MAC阵列效率、以及减少跨IP搬运这些工程细节共同叠加的结果。如果你自己有一台开发板想验证Neural Fusion是否真的在工作我建议的流程是先跑一个标准的LLM推理脚本然后用高通Profiler抓一段trace重点看GPU AI引擎的利用率以及DRAM带宽的占用。如果DRAM带宽占用明显下降而AI引擎利用率保持在高位说明权重确实更多地被本地共享内存接住了而不是每次从主存重新读取。这是最直观的验证方式比跑分软件出来的综合分数更有说服力。3.2 能效比才是移动端AI的生死线移动端AI和云端AI的差别不在算力而在功耗预算。数据中心可以让GPU一直跑在300瓦以上手机芯片的整机SoC功耗可能被限制在10瓦以内留给AI加速单元的部分更少。所以在这个场景下“每瓦性能”比“峰值TOPS”更有意义。Neural Fusion的能效优势来自两个层面。第一层是减少数据搬运前面已经讲了很多第二层是减少指令开销专用硬件阵列不需要像通用Compute Shader那样每条指令都走一遍完整的取指-译码-执行流水线这本身就是一种“省电模式”。虽然高通没有公布详细的能效曲线图但按照架构逻辑推断同样跑一个7B模型Neural Fusion方案的能量效率会比纯Compute Shader方案高出不少。开发者的直观感受会体现在发热和掉电速度上。同样在手机上跑端侧大模型老平台撑几分钟就开始发热降频而新架构平台能把性能维持更久帧率和token生成速度不会断崖下跌。持续性能sustained performance比峰值的意义大得多这一点用过一段时间就会发现。3.3 高负载下的调度与温控策略手机上的硬约束永远是散热。芯片设计得再强热量散不出去一切白搭。所以系统调度器在任何关键任务面前都要算一笔“功耗和温度”的账。当游戏渲染和AI推理同时发生时比如一边打游戏一边让语音助手总结屏幕内容GPU的渲染管线可能已经被帧渲染占用这时候AI任务就需要被调度到Hexagon或CPU上去执行。反过来如果大量AI推理占用了GPU的计算单元系统也会限制游戏帧率来保证整体流畅。这一点对普通用户的体验影响很大而对开发者来说测试的时候一定要覆盖这类“混合负载”场景。只跑一个纯LLM推理脚本或只跑一个纯游戏benchmark都没法反映真实使用。我习惯的做法是让模型推理和实时渲染并行跑观察两者的性能波动和温度曲线这才比较容易暴露调度器在资源竞争时的决策问题。4. 开发者怎么调让算子真正落到硬件加速单元上4.1 用对推理运行时QNN、Delegate与CPU回退陷阱很多做端侧AI的开发者日常工作还停留在用TFLite或者ONNX Runtime直接部署模型。这套流程在传统CNN时代问题不大但放到大模型时代要想让模型真正吃到Neural Fusion的硬件红利就绕不开高通的AI引擎框架。正确的做法是走Qualcomm AI Engine DirectQNN这条路径。QNN提供编译器可以把训练好的模型转换为能在NPU、GPU和CPU上高效执行的指令序列并尽可能把算子映射到Neural Fusion上。如果你用的是ONNX Runtime可以挂载QNN Execution Provider如果你用TFLite可以接入QNN Delegate。QNN编译工具链会根据算子列表、张量形状、精度要求决定哪些算子落到硬件加速单元上哪些算子需要回退到通用模式。但这中间有个非常容易踩的坑不是模型里所有算子都在QNN的支持列表里。一旦遇到不支持的算子QNN的调度器会悄悄地把它回退到CPU执行而且整个过程可能没有任何报错只是性能断崖式下跌。所以跑完模型之后一定要检查一份算子映射日志看看有多少算子真正跑在了GPU AI引擎上有多少落到了CPU。这一步在工程上花的时间不多但收益立竿见影。4.2 常见掉坑点动态shape、非量化算子与自定义激活函数根据我自己帮团队review过的端侧模型部署案例最常把Neural Fusion挡在门外的是这三类问题。第一类是动态shape。大模型的序列长度天生是可变的但如果模型在导出时把输入维度全设成动态编译器就没法做很多预分配和融合优化最终导致算子频繁fallback。我的建议是把所有张量的形状尽量固定或者把序列长度分桶量化成几个档位比如128、256、512、1024编译器就可以针对每个档位做优化性能提升非常明显。第二类是非量化算子。Neural Fusion对低精度数据类型的加速效果最好如果模型里有个别层是FP32计算而其他层是INT8调度器可能为了兼容性放弃整个子图的加速。所以部署前一定要做完整的量化校准最好用量化感知训练QAT把精度损失控制住别等模型跑起来了才发现INT8吃不下。第三类是自定义激活函数。很多新模型喜欢在Attention里加一些自定义的融合操作比如某种特殊的归一化或门控单元。这些算子QNN未必认识编译器一旦不识别就会直接回退。遇到这种情况要么把自定义算子重写为QNN支持的组合算子要么用QNN提供的自定义算子接口去实现低层映射。总之要确保整个模型的计算图里没有“编外”算子。4.3 内存复用与KV Cache的工程优化最后说一个和硬件加速单元强相关的底层优化方向内存复用和KV Cache管理。Transformer推理时KV Cache会随着对话长度线性增长是一笔非常大的内存开销。以一套7B参数的对话模型为例上下文越长KV Cache占用越大如果分配位置不合理会直接加剧内存带宽的压力。理想情况下KV Cache应该分配在GPU共享内存可达的区域内并且由Neural Fusion直接访问这样才能避免每次生成token时KV数据在系统主存和GPU之间反复搬移。如果你的模型部署框架支持KV Cache的显存分配和持久化策略尽量开启支持INT8或INT4量化KV Cache的话也尽量开启对于长对话场景的性能提升非常明显。另一个相关的优化是算子融合把LayerNorm、GELU这类元素级操作合并进周围的矩阵乘法或注意力算子减少kernel启动次数这也是减少数据来回搬运的有效手段。我在实际项目里的体会是这类硬件加速单元给端侧AI带来的不只是跑分提升而是把方向性问题摆到了台面上优化的重心从“堆算力”转向了“管数据”。无论官方TOPS数字怎么变只要抓住“数据少搬家、计算更专一”这个总原则后面做算子落点和内存规划时就不会跑偏。如果你现在正准备把一个语言模型往端侧移植我建议第一件事就是用QNN的profile工具完整过一遍模型看清楚到底多少个算子在真正使用硬件加速单元再决定下一步优化方向。这套流程跑通之后你会发现所谓芯片级加速其实是从一行一行的工程细节里抠出来的。
返回列表