你有没有过这样的体验:刚搬进一间温馨的小公寓,却发现钟爱的双开门冰箱、整面墙的书柜、健身房的跑步机,统统搬不进去?门太窄、层高有限、承重墙又不能拆。这时候你只能想尽办法:把不常用的东西断舍离、把羽绒服用真空袋压扁、甚至把大沙发换成小一号的。把大模型部署到手机,本质上就是同一道难题——那头叫“大模型”的大象,怎样才能体面地住进叫“手机”的小公寓。 本文要讲的就是完整的“搬家方案”:先动手做模型压缩(断舍离与真空打包)、挑选合适的推理引擎(专业搬家公司)、规划内存空间(收纳设计师)、控制功耗发热(智能电表管家的艺术),再针对 iOS 和 Android 这两套户型差异做适配,最后像物业管家一样持续维护。全程大白话,不堆公式吓你,用生活常识串联每一个技术环节。
移动端部署是端侧 AI 落地的最后一公里。掌握这套方案,你就能把大模型真正塞进用户口袋里,搞定隐私、时延与成本三大痛点——这是移动开发者和边缘 AI 工程师的核心竞争力。
可视化演示
展示大模型移动端部署三大核心:模型压缩(量化FP32→INT4/剪枝/蒸馏)、推理引擎选择(MLC/TFLite/ONNX多平台)、内存功耗热管理(RAM分配/NPU加速),动态演示端侧AI部署全链路。
本节配有交互动效(进入视口后自动加载,约 3KB)。
模型压缩:量化剪枝蒸馏 青绿为FP32原始 绿色为INT4量化 橙色为剪枝压缩 FP32 → FP16 → INT8 → INT4 (8x compression) 通过量化、剪枝和知识蒸馏将模型从4.2GB压缩到525MB
移动端挑战
想象你终于摇到一套市中心的小公寓,兴冲冲地把家住址发给了搬家公司,结果对方回了一句:“您定的可是双开门大冰箱和大书柜,这户型进不去啊。”这就是移动端部署的第一课:先认清房子的面积,再谈怎么搬。手机就是那间小公寓,虽然如今的旗舰机拥有 8GB 到 16GB 内存,听着不算小,但系统本身、后台应用、相机缓存早已占了大半江山,真正能分给大模型的常常只剩 2GB 到 4GB。而一个大语言模型在 FP32 格式下动辄几十 GB,连门都进不去。
这引出了端侧 AI 的第一个核心概念——资源约束。移动端不是服务器,没有海量显存、没有液冷散热、没有无限电费,它只有三样东西:有限的存储空间、有限的内存带宽、有限的热设计功耗(TDP)。所谓“移动端部署”,本质上就是在这个物理天花板上做文章,让模型刚好卡在预算线以内运行。这也是为什么真正落地的端侧大模型,参数规模通常控制在 0.5B 到 4B,而不是云端那种动辄 70B 的巨无霸。
部署流程一般分四步:压缩模型到目标体积 → 用推理引擎做性能和精度验证 → 在真机上做内存与功耗调优 → 灰度发布并持续监控。每一步都有专门的工程手段,后面几节会逐一展开。而这一切开始之前,先要回答一个问题:这间小公寓到底有多少可用的“净面积”?这就需要一条计算内存预算的公式:
想通了“净面积”的算法,大象该瘦到多少斤才算合格,心里就有数了。下一节,我们开始给大象做“断舍离”。
- 设备可用内存手机标称的总物理内存,比如 8GB
- 系统占用操作系统、前台 App、后台常驻进程吃掉的内存
- 安全余量为防止极端场景 OOM(内存溢出),必须预留的缓冲空间
- 内存预算上限三者相减,得到模型推理可用的最高内存
模型压缩
搬家日的前一晚,你拿着三个收纳锦囊站在客厅中央。第一个锦囊是“断舍离”——把那些一年都没碰过的旧物果断丢弃;第二个锦囊是“真空压缩袋”——把蓬松的羽绒服抽成薄片;第三个锦囊是“迷你样板间”——照着大别墅的图纸,在桌面搭一个功能齐全的小模型。模型压缩正是这三招的数字化翻版。
第一招是剪枝(Pruning)。神经网络里有大量权重数值趋近于零,它们对输出结果几乎没有贡献,就像储物间里积灰的旧物。剪枝的思想是:把这些“没用的连接”直接移除,网络结构变稀疏,体积自然变小。第二招是量化(Quantization)。原本每个参数用 FP32(32 位浮点,占 4 字节)记录,精度虽高但太“占地”。量化把这套精细的测量工具换成 INT8(8 位整数,占 1 字节),体积直接压到四分之一,代价是读数变粗糙了。第三招是知识蒸馏(Knowledge Distillation):让一个已经训练好的大模型当“老师”,用它的输出作为软标签,教一个参数少得多的小模型“照虎画猫”。
这三招可以单独用,也可以组合用。一个 4B 参数的模型,经过 INT8 量化后大约 4GB——对小公寓来说还是偏大;再叠加剪枝和蒸馏,压到 INT4 甚至更小,就能塞进 1GB 到 2GB 的预算里。当然,压缩不是免费的,精度会有损失。量化误差可以用这样一个公式来度量:
断舍离不是把家搬空,而是去掉冗余、留住灵魂。压缩后的模型依然能打,就像搬家后你留下的每件物品都还能派上用场。行李打包完毕,接下来就该请“搬家公司”出场了。
- 原始权重模型压缩前的精确参数值
- 量化后权重经过量化映射的近似值
- 平方误差把单个参数的偏差放大,避免正负抵消
- 平均所有参数对所有参数的误差取平均,衡量整体损失
推理引擎
行李已经压到了最小体积,可你还不能自己扛着下楼——三十层的电梯、狭窄的过道、要小心避开的承重墙,这些规则你都不熟悉。你需要一家熟悉楼内环境的专业搬家公司。在端侧 AI 世界里,这家公司就是推理引擎。
市场上的“搬家公司”不少:Google 的 TFLite、阿里的 MNN、腾讯的 NCNN、ONNX Runtime、苹果的 Core ML。怎么选?看三点。第一,格式兼容性:你压缩好的模型文件,它能不能一口吃下?第二,算子覆盖度:模型里用到的各种算子(卷积、注意力、归一化……),它是否都有优化过的实现?如果某个算子没覆盖,引擎就只能回退到 CPU 的兜底实现,性能大打折扣。第三,硬件优化深度:MNN 对高通 NPU 做了深度化工,Core ML 天生为 Apple Silicon 设计,同一个模型在不同引擎上的时延可能相差数倍。
引擎内部还有两把提升效率的刷子。第一把是算子融合:把 Conv(卷积)、BN(批归一化)、ReLU(激活函数)这类流水线作业的算子合并成一个,减少中间结果的读写次数,就像搬家时把散件装进同一个抽屉再搬运,少跑几趟。第二把是硬件加速:针对 ARM CPU 的 SIMD 指令、GPU 的矩阵分块、NPU 的自定义指令分别手写底层内核,把每一分算力榨干。这些优化叠加起来,能把单次推理时延从秒级压到百毫秒甚至更低。整个端到端的推理时延可以拆成这样:
好的搬家公司标准很朴素——又快又稳不磕碰。引擎选得对,模型才跑得顺。行李进了电梯,接下来最让人头疼的问题是:到了屋里,东西往哪儿放?
- 模型加载时间从磁盘读取权重到内存并完成初始化
- 层数乘以单算子耗时全部网络层的计算总时间
- 调度开销引擎内部任务派发、内存拷贝等额外开销
- 求和得到总时延三者相加即用户感知的端到端推理耗时
内存控制
小公寓最让收纳师头疼的,不是东西多,而是“有效收纳空间”不足。但高手总有办法:墙体打上顶天立地的柜子、床底做成储物抽屉、沙发拉开就是客床——每一寸空间都被反复复用。端侧推理的内存管理,就是这样的收纳艺术。
推理过程中,每一层网络都会产生中间激活值(Activations),它们像潮水一样涌来又退去。如果一个 4B 参数的 INT8 模型权重占 4GB,推理时中间激活可能再占 1GB 到 2GB,两座大山一起压在手机内存上,极易触发 OOM。内存控制的核心策略有三条。
第一条是内存复用。前一层算完的激活张量,在生命周期结束后就不再被需要,那它的内存块可以立刻分配给下一层使用。这就像你晚上把床铺好,第二天早上把被子收进柜子,同一块空间在不同时间承担不同功能。第二条是按需加载。模型不一定要全部常驻内存,可以让权重分段存放在存储中,推理到哪一层,才把哪一层的权重读入内存。“用到再拿”的策略,能把常驻内存压到很低。第三条是内存对齐。NPU 和 GPU 通常要求内存按 128 字节对齐,分配时对齐规格,能避免碎片化浪费,就像收纳盒的尺寸设计成恰好能塞满抽屉一样。
工程上,内存优化的关键指标是峰值内存——推理过程中某一瞬间的内存占用最高点。它才是决定会不会 OOM 的生死线,可以用下面的公式表示:
内存驯服了,小公寓照样住得宽敞。但另一个问题接踵而至——如果屋里空调一直开到最大,电费单会让你怀疑人生。功耗,是下一个需要面对的硬仗。
- 某一时刻的存活张量总和推理进行到时刻 t 时仍被引用的中间数据
- 复用回收量同一时刻可以被内存池回收并重复利用的部分
- 取最大值在所有时刻里挑出最高的内存占用点
功耗管理
小公寓虽然住得舒服,但房东装的智能电表一响,谁心里都得咯噔一下。手机芯片也是这样:性能拉满意味着大电流、高发热,背面烫得能煎鸡蛋,用户转头就给差评。功耗管理,就是给芯片请一位“智能电表管家”。
这位管家有两件趁手的工具。第一件是DVFS(动态电压频率调节):芯片忙时就全速冲刺,闲时就降频省电,温度逼近阈值时主动降压降温。它并不是一刀切地限制性能,而是像空调的变频压缩机一样,根据室内温度自动调节功率。第二件是大小核调度(big.LITTLE):手机 CPU 由大核(高性能)和小核(低功耗)混合组成。轻量任务调度到小核上,跑得动又省电;只有重负载才启用大核。调度器就像管家分配家务——叠毛巾这种活儿交给小核,搬家具才请大核出手。
为什么降电压的省电效果如此立竿见影?因为动态功耗和电压的平方成正比。这个结论来自经典的功耗公式:
电表管家的艺术是:让房间凉快又不跳闸,让算力释放又不烫手。功耗和性能之间的平衡点,永远在动态调整中。现在,入住最后的考验来了:你的公寓到底是“精装房”还是“毛坯房”?
- 活动因子单位时间内电路翻转的活跃比例,反映工作负载强度
- 负载电容芯片晶体管的物理特性,由制程工艺决定
- 时钟频率芯片每秒运行的指令周期数
- 电压平方核心电压的二次方,是整个公式里最敏感的调控项
平台适配
同样是住进小公寓,iOS 是拎包入住的精装房:插座、灯位、收纳空间都按统一标准设计好了,你照着说明书使用就行。Android 则是千差万别的毛坯房:每家的户型、电路、层高都不一样,你得自己规划水电布线,还得应对不同楼龄的物业限制。这就是两大移动平台适配的真实写照。
在 iOS 上,苹果提供了 Core ML 框架。你只需把模型转换成 .mlmodel 格式,Core ML 会自动调度 CPU、GPU 和神经网络引擎(ANE),开发者几乎不用关心底层硬件。好处是省心、稳定、上限不低;缺点是控制粒度小,如果你想针对特定算子做极致优化,框架反而成了束缚——它是“精装房”的统一规划,不允许你砸承重墙。
在 Android 上,路线的灵活度和复杂度都高得多。标准路线是 TFLite 配合 NNAPI,由系统的驱动程序把计算任务翻译成硬件指令;激进路线是直接对接厂商 SDK,比如高通的 QNN、联发科的 NeuroPilot、华为的 HiAI,把 NPU 的性能榨干,但代价是适配成本高、碎片化严重。跨平台框架 MNN、ONNX Runtime 提出“一次转换、多端运行”来减少工作量,但要清醒认识到:抽象层只能保证“能跑”,不保证“跑得快”。同模型在不同 SoC 上的加速比可能相差数倍,必须真机实测。加速比的定义很简单:
精装房省心但灵活性有限,毛坯房费心但上限更高。平台适配没有银弹,只有在“省心”与“极致”之间反复权衡。终于搬完家,你以为故事结束了?不——物业管家的长期服务,才刚开始。
- CPU 推理时延纯用 CPU 跑完一次推理的耗时,作为基准
- NPU 推理时延调用 NPU 加速后的耗时
- 相除得到加速比衡量硬件加速带来的性能提升倍数
工程实践
搬进新家的第一周,你开始注意各种细节:水龙头滴水、空调制热慢、楼上邻居半夜开趴。居住体验不是交付那一刻决定的,而是靠后续持续的维护和优化。移动端部署也是一样,模型能跑只是起点,稳定地跑、长期地跑,才是真正的挑战。
工程化的第一件事是建立验收指标矩阵。一次合格的端侧部署至少要覆盖六个维度:首帧时延(用户打开 App 后第一次推理的等待时间)、稳态帧率(连续推理下的平均速度)、峰值内存、稳态温度、电池损耗速率、模型精度与云端的对比差值。这六个维度缺一不可,就像入住前要检查水、电、气、采光、噪音和物业费一样。第二件事是灰度发布。先让内部员工机型试跑,再扩大到主流机型,最后覆盖长尾机型。每一步都收集数据,发现劣化就立即回滚。第三件事是监控告警。在端侧埋点采集推理耗时、崩溃率、OOM 率和回退率,这些数据实时上传到监控平台,一旦指标越界就自动告警。
工程上用综合性能得分来评估一次部署的整体水平。把各项指标归一化后按权重加权,再取模长,得到一个综合分数:
好的物业不是交接完就消失,而是住在你隔壁,随时响应。持续守护部署质量,端侧 AI 应用才能长久地活在用户手机里,而不是成为卸载列表里的下一个牺牲品。
- 归一化指标每个原始指标除以目标值,映射到同一量纲
- 权重系数按业务优先级给不同指标加权
- 加权平方和三个方向的加权平方和
- 开根号取模长意义下的综合分数
AI 应用场景
离线翻译 App:随身翻译官
阶段:模型压缩 + 推理引擎部署
解决的问题:传统翻译 App 必须联网,出境旅游遇到弱网或没网就抓瞎,还担心对话内容上传服务器泄露隐私。端侧部署把翻译模型塞进手机,断网也能用,隐私全部留在本地。
具体案例:某旅行类 App 集成 1.3B 参数的多语言翻译模型,采用 INT8 量化压到 800MB,配合 MNN 引擎在主流手机上实现 150ms 的单句翻译时延。用户开启飞行模式,中英互译依然流畅。
智能门锁:家门口的云端大脑
阶段:知识蒸馏 + 平台适配
解决的问题:传统智能门锁依赖云端人脸比对,网络抖动时门开不了,且人脸特征需上传,隐私风险高。端侧人脸模型将识别过程完全本地化,速度更快、数据更安全。
具体案例:某智能门锁厂商用 2B 大模型作为教师,蒸馏出 50M 参数的轻量人脸识别模型,部署在门锁自带的低功耗芯片上。识别速度 200ms,误识率低于百万分之一,断电换电池都不影响使用。
手机语音助手:你的离线小秘书
阶段:内存控制 + 功耗管理
解决的问题:传统语音助手把录音上传云端做语义理解,既费流量又有时延,唤醒词还得常驻后台监听,功耗压力大。端侧部署让语音理解在本地完成,功耗控制成为体验关键。
具体案例:某手机厂商在语音助手中部署 0.5B 参数端侧模型,通过内存复用将常驻内存压到 150MB,配合大小核调度把待机监听功耗控制在 0.5W 以内。用户息屏状态下直接说“帮我定明早闹钟”,响应时间小于 1 秒。
Python 演示
# -*- coding: utf-8 -*-"""端侧模型压缩与推理部署模拟器"""import numpy as np def symmetric_quantize(w, bits=8): """对称量化: 将浮点权重映射到 [-2^(bits-1), 2^(bits-1)-1]""" amax = np.abs(w).max() + 1e-9 qmax = float(2 ** (bits - 1) - 1) scale = amax / qmax wq = np.clip(np.round(w / scale), -qmax, qmax) return wq.astype(np.int32), scale def dequantize(wq, scale): """反量化: 恢复浮点近似值""" return wq * scale def mse_error(w, w_hat): """计算量化误差 MSE""" return float(np.mean((w - w_hat) ** 2)) class ModelCompressor: """端侧模型压缩流水线""" def __init__(self, n_params=1_000_000, bits=32): self.n_params = n_params self.bits = bits self.weights = np.random.randn(n_params).astype(np.float32) self.keep_ratio = 1.0 self.size_mb = self._estimate_size(n_params, bits) def _estimate_size(self, n, bits): return n * bits / 8 / 1024 / 1024 def quantize(self, bits): """对权重做定点量化,返回量化误差""" wq, scale = symmetric_quantize(self.weights, bits) w_hat = dequantize(wq, scale) self.bits = bits self.size_mb = self._estimate_size(self.n_params, bits) return mse_error(self.weights, w_hat) def prune(self, ratio): """按绝对值阈值剪掉最不重要的比例参数""" thr = float(np.percentile(np.abs(self.weights), ratio * 100)) self.weights = np.where(np.abs(self.weights) >= thr, self.weights, 0.0) self.keep_ratio = 1.0 - ratio self.n_params = int(np.count_nonzero(self.weights)) self.size_mb = self._estimate_size(self.n_params, self.bits) return self.keep_ratio def report(self): return { "参数量": self.n_params, "位宽": self.bits, "保留率": round(self.keep_ratio * 100, 1), "体积MB": round(self.size_mb, 2), } def estimate_latency(n_mac, eager_ops, unit_time_us): """估算端侧推理时延: 矩阵乘为主 + 算子调度开销""" mac_time_us = n_mac * unit_time_us return (mac_time_us + eager_ops * 5) / 1000.0 def main(): print("=== 端侧模型压缩模拟 ===") model = ModelCompressor(n_params=2_000_000, bits=32) err_fp32 = model.quantize(32) print("FP32 基线: 体积=%.2fMB 误差=%.6f" % (model.size_mb, err_fp32)) err_int8 = model.quantize(8) print("INT8 量化: 体积=%.2fMB 误差=%.6f" % (model.size_mb, err_int8)) keep = model.prune(0.3) print("剪枝保留=%.1f%% 体积=%.2fMB" % (keep * 100, model.size_mb)) n_mac = model.n_params * 2 latency_cpu = estimate_latency(n_mac, eager_ops=200, unit_time_us=0.05) latency_npu = estimate_latency(n_mac, eager_ops=20, unit_time_us=0.008) print("CPU估算时延=%.2fms NPU估算时延=%.2fms 加速比=%.2fx" % (latency_cpu, latency_npu, latency_cpu / latency_npu)) print("部署核算:", model.report()) if __name__ == "__main__": main()
scale = amax / qmax求出量化步长,把最大绝对值映射到整数上限,这是整个量化的地基wq = np.clip(np.round(w / scale), -qmax, qmax)权重除以步长后四舍五入并截断到整数范围,完成浮点到整数的映射w_hat = wq * scale反量化把整数恢复成浮点近似值,此时信息损失已不可避免thr = float(np.percentile(np.abs(self.weights), ratio * 100))取绝对值分位数作为剪枝阈值,绝对值小的参数被判为“冗余”self.weights = np.where(np.abs(self.weights) >= thr, self.weights, 0.0)用掩码把低于阈值的权重置零,实现连接剪除mac_time_us = n_mac * unit_time_us乘加操作总数乘以单位耗时,估算矩阵运算的纯计算时间latency_cpu / latency_npu计算加速比,直观展示 NPU 相对 CPU 带来的端侧性能收益
常见误区
误区INT4 比 INT8 香,体积直接再小一半,模型越小越快,直接上 INT4 就完事了。
正解量化位宽降低会显著加剧精度损失,尤其在数学推理、长尾知识和多轮对话任务上,模型可能“变笨”得令人措手不及。谨慎的做法是:先在验证集上对比 INT8 与 INT4 的精度差,若落差过大,优先坚持 INT8 或改用量化感知训练(QAT)来补偿损失。这就好比真空袋再能压,羽绒服压到极限也会损伤蓬松度,保暖性能直线下降。
为何常见:看到模型体积大幅缩水就兴奋,忽略了量化误差对真实任务的影响,以为“瘦身”必然无损。
误区用了 MNN 或 ONNX Runtime,就能在 iPhone、骁龙、天玑上跑出一样的效果,不用关心底层硬件。
正解统一引擎保证的是“能跑”,而不是“跑得快”。NPU 算子覆盖不全时,引擎会默默回退到 CPU 执行,时延可能反而更差。真正的工程实践是:按目标机型的算子白名单逐一验证,必要时针对头部芯片走厂商 SDK 定制加速。这就像同一家搬家公司,在精装房和毛坯房里的效率不可能一样,得实地踩点。
为何常见:误以为抽象层等于优化层,忽略了硬件差异这个决定性能的最大变量。
误区模型量化后只有 600MB,手机内存肯定放得下,直接加载就完事了。
正解推理时的内存占用远不止权重本身,还包括中间激活值、输入输出缓存、引擎运行时开销。激活峰值可能达到权重的 30% 到 50%,两者加在一起才是真实的内存账。好比家具本身不占地,但摆进房间后的“通行空间”也得算进生活面积里。
为何常见:把“打包后的行李重量”等同于“入住后的空间占用”,忽略了搬运过程和日常使用所需的额外空间。
误区手机烫是芯片散热能力不行,跟部署的代码和策略没关系,换个散热好的手机就解决了。
正解算法和调度层面大有可为:限制 batch size、控制推理帧率、在 CPU/GPU/NPU 之间错峰调度、根据温度预测提前降频,都能显著改善发热体验。功耗管理和性能优化一样,都是端侧部署工程师的分内事。就像你没法改变房子的朝向,但可以通过调整窗帘、开窗时间和使用风扇来改善闷热。
为何常见:把芯片物理限制当成不可逾越的墙,忽略了软件层动态调度的巨大空间。
面试题
Q1. 大语言模型以 FP32 格式存储时,单个参数占几个字节?
- A.1 字节
- B.2 字节
- C.4 字节← 正确答案
- D.8 字节
答案:C。FP32 表示 32 位浮点数,1 字节等于 8 位,所以单参数占 4 字节。好比行李箱上贴的标签,FP32 是“豪华精装标签”,信息全但占地多。
Q2. 将权重从 FP32 量化到 INT8,模型体积理论上约为原来的多少?
- A.1/2
- B.1/4← 正确答案
- C.1/8
- D.1/16
答案:B。INT8 占 1 字节,FP32 占 4 字节,体积缩小为原来的四分之一。就像把 4 倍厚的精装书压缩成薄薄的口袋本,还是同一本书,但装订薄了。
Q3. 模型剪枝的基本原理是什么?
- A.把大模型的输出拿去训练小模型
- B.将权重从浮点映射到整数
- C.移除对输出影响小的冗余连接← 正确答案
- D.将多个算子融合成一个
答案:C。剪枝的核心是识别并移除权重趋近于零、对结果几乎无贡献的连接,让网络变稀疏。A 是蒸馏,B 是量化,D 是算子融合,三者是不同层面的优化手段。
Q4. 下列哪些属于端侧推理引擎的优化手段?
- A.融合算子减少中间读写开销← 正确答案
- B.使用 SIMD 指令加速矩阵乘← 正确答案
- C.全部改用 C 语言重写引擎
- D.针对 NPU 自定义算子内核← 正确答案
答案:ABD。算子融合、SIMD 加速和 NPU 自定义 kernel 都是常见的引擎优化手段。用 C 语言重写是开发语言选择,不是推理优化手段本身,故 C 不选。
Q5. 知识蒸馏中,“教师模型”扮演什么角色?
- A.为教师网络提供训练数据
- B.输出软标签指导学生模型← 正确答案
- C.压缩学生模型的权重
- D.负责推理阶段的硬件加速
答案:B。教师模型是训练好的大模型,它输出的软标签包含丰富的类间相似度信息,学生模型据此学习。好比老厨师手把手教徒弟“这盘菜的咸淡要适中”,而不只是给一张成品照片。
Q6. 端侧推理内存优化的首选策略是什么?
- A.扩大系统 Swap 分区
- B.内存池复用中间激活← 正确答案
- C.增加推理线程数
- D.强制关闭后台应用
答案:B。内存池复用是端侧最核心的内存优化手段——前后层激活生命周期不重叠时共用内存块,直接压低峰值内存。Swap 分区在手机上不可行,加线程和关后台都不是治理内存的本质手段。
Q7. 关于端侧功耗管理,下列说法正确的有哪些?
- A.电压降低时动态功耗以平方关系下降← 正确答案
- B.温度过高时 App 应该直接闪退
- C.大小核调度能节省整体功耗← 正确答案
- D.DVFS 只影响性能不影响发热
答案:AC。动态功耗与电压平方成正比,所以 A 正确;大小核把轻负载调度到小核,能显著省电,C 正确。温度过高应该降频而不是闪退,DVFS 同时影响性能与发热,所以 B、D 错误。
Q8. CPU 上推理耗时 50ms,同模型在 NPU 上耗时 10ms,加速比是多少?
- A.0.2x
- B.5x← 正确答案
- C.2x
- D.0.5x
答案:B。加速比 = CPU 时延 ÷ NPU 时延 = 50 ÷ 10 = 5。好比坐电梯 10 秒到顶、爬楼梯 50 秒到顶,电梯快了 5 倍。
Q9. 在 Android 端榨干厂商 NPU 性能,通常通过什么路线实现?
- A.Core ML 框架
- B.厂商 SDK(如高通 QNN、华为 HiAI)← 正确答案
- C.Metal 图形接口
- D.CUDA 计算平台
答案:B。Android 端要深入厂商 NPU 需走厂商 SDK,如高通 QNN、华为 HiAI。Core ML 和 Metal 是 iOS 的技术栈,CUDA 是 NVIDIA GPU 的生态,三者都不适用于手机 NPU 的深度适配。
Q10. 移动端大模型上线前的验收指标矩阵应覆盖哪些维度?
- A.首帧时延与稳态帧率← 正确答案
- B.峰值内存与稳态温度← 正确答案
- C.模型精度与云端对比← 正确答案
- D.广告曝光率与用户留存
答案:ABC。验收至少覆盖性能(时延、帧率)、资源(内存、温度)、质量(精度对比)三大类。广告曝光率和用户留存属于产品运营指标,不归属于端侧部署的工程技术验收范围。