想象你是一名“搬家大师”,面前的任务,是把一座拥有数十亿册藏书的“云端大图书馆”(一个 7B 参数的大模型),搬进用户口袋里一间巴掌大的“手机小书房”。直接原封不动地搬?书架装不下、走廊进不去、翻书还特别费电——这就是大模型上手机的第一道难关。MLC-LLM 就是这位见多识广的搬家大师:它先拆掉笨重的“书架”(把权重按新的位宽重新编码,这叫量化),再重新设计整个“房间动线”(用 TVM 编译器把模型编译成手机 CPU/GPU/NPU 都能读懂的指令),最后给 iOS 和 Android 这两套完全不同的“装修标准”分别配上现成的“家具零件”(Swift 包与 JNI 接口)。你不需要自己从零搭房子,只需按说明书把零件装好,手机上就能跑起流畅的大模型对话。本文会把这座“图书馆搬迁工程”的每一步拆开讲透:内存怎么省、速度怎么测、发热怎么管,以及手机里的那颗 NPU 芯片又是如何化身“自动翻书机器人”帮你省电提速的。
掌握端侧大模型部署,意味着你能在无网、隐私敏感、低延迟的场景中独立交付 AI 能力,这是边缘计算与移动端 AI 工程师的核心竞争力。
目录
可视化演示
展示大模型在手机端的推理过程与量化策略对比:端侧推理模式下可视化Token生成流和KV缓存占用,量化对比模式下展示FP16/INT8/INT4三种精度下的速度与内存权衡。
本节配有交互动效(进入视口后自动加载,约 3KB)。
端侧推理模式 Token逐个生成并流入手机屏幕区域 KV缓存随Token增长占用设备内存 Mem≈L×d×layers×2×bytes_per_param 端侧推理受设备内存和散热双重约束
认识 MLC-LLM:图书馆里的搬家大师
把云端那座占地 100 平米的“大图书馆”搬进手机书架,光靠蛮力是行不通的。MLC-LLM 就是那位经验丰富的“搬家大师”。它的全称是 Machine Learning Compilation for Large Language Models,是一套把大语言模型“重新设计”的编译与运行时方案。它不像传统 API 那样把模型放在云端,而是亲手画好图纸、定制零件,让模型最终以手机硬件能理解的形式落地运行。换句话说,MLC-LLM 是“施工队长 + 图纸引擎(Apache TVM)”的组合体:TVM 负责把模型的每一层计算翻译成 CPU、GPU、NPU 的底层指令,MLC-LLM 则负责把整个推理流程封装成你随手可用的端侧服务。
搬家大师出手前,心里要有一本账:这座图书馆到底有多少书?换成手机场景,第一笔账就是“模型占多大内存”:
其中 N 是模型的参数量,b 是每个参数占用的内存字节数。
1. 参数量 N:N 表示模型拥有的参数个数。以 7B 模型为例,B 代表 billion(十亿),也就是大约 70 亿个可调参数,相当于图书馆里 70 亿本书。
2. 每参数字节数 b:b 是存一个参数需要的字节数。常用档位里,FP32 占 4 字节(原版精装书),FP16 占 2 字节(简装书),INT4 只占 0.5 字节(微缩胶片)。
有了这把“秤”,搬家大师就能算出:7B 模型用 FP16 装要 14GB(手机显然背不动),而用 INT4 量化后只要 3.5GB——小书房终于有戏了。这就是 MLC-LLM 整套“搬运术”的起点:先秤重,再决定怎么压缩、怎么布置,最后把书房安排得明明白白。
iOS 集成:精装房的 Swift 包
iPhone 是一间“精装房”,苹果对入住有严格的装修规范——不允许你随便打孔布线,只能使用预先设计好的“标准零件”。MLC-LLM 为 iOS 准备的“标准零件”就是 Swift Package(Swift 包)。作为搬家大师,你不需要改动承重墙(系统内核),只需把 MLCEngine 这个零件通过 Xcode 的包管理器挂进工程,再给它指明模型文件的位置,一套能在本地跑大模型的“精装书房”就落成了。
精装房里的使用体验也有讲究:用户发来一句话,模型要先把这句话“读进去”(预填充),再一个字一个字“吐出来”(解码)。整段回复的等待时间由这两段组成:
其中 t_prefill 是处理用户输入 Prompt 的时间,L 是回复长度,t_decode 是生成单个 token(一个词元)的时间。
1. 预填充阶段 t_prefill:模型一次性读取用户输入的整段 Prompt,把所有输入 token 的信息并行算好,相当于翻书机器人先扫一眼目录。
2. 单字生成 t_decode:生成每个 token 时,模型都要参考之前的所有内容,只能串行地“一个字一个字写”,所以每个 token 都要花一份固定时间。
3. 总时长合成:回复 L 个 token,就要串行解码 L 次,所以总时间等于预填充一次加上解码 L 次。
在 Xcode 中,你通过 Swift Package 拿到的是整套编译好的 C++ 推理引擎封装。MLCEngine 加载模型目录后调用 generate 接口,就能拿到流式输出。真机调试时可在 Instruments 里观察内存与能耗,看看这间“精装书房”住得舒不舒服——这就是 iOS 端搬家的全部流程。
Android 集成:传菜口 JNI
Android 这间“老房子”的装修就自由得多,但也更考验手艺:Java/Kotlin 是客厅里的“前台服务员”,负责接待 UI 交互;C++ 是地下室的“后厨大厨”,真正负责烧菜(跑模型)。两者语言不通,中间必须有一个传菜口——JNI(Java Native Interface)。MLC-LLM 的 Android 模板正是通过 JNI 把 C++ 推理引擎封装给 Kotlin 调用,你只需要把它当作一个传菜口,把“用户输入”这道菜单递进去,再把“生成结果”这道菜端出来。
传菜口的效率直接决定上菜速度。服务员每传一次菜都有固定开销,如果每个 token 都来回传一次,时间全浪费在走路上:
其中 n_调用 是 JNI 跨语言调用的次数,S_单次传输 是每次调用在 Java 与 C++ 之间拷贝的数据量。
1. 调用次数 n_调用:JNI 每次从 Java 进入 C++ 都有固定开销(找函数、切上下文),调用越频繁,浪费越大。
2. 单次传输 S_单次传输:一次调用中要拷贝的字节数。如果反复把大数组从 Java 复制到 C++,内存带宽会被白白吃掉。
MLC-LLM 的做法是:把整段对话输入一次性通过 JNI 传给 Native 引擎,引擎持续生成 token 并通过回调批量返回,尽量避免逐字跨界。工程上配合 Gradle 配置 NDK 与 ABi 过滤,把 APK 体积控制在合理范围。CPU 是大厨自己动手,而 GPU 就像请来的“帮工”,能并行做很多杂活——这就是 Android 端“老房改造”的精髓。
内存优化:目录卡片大瘦身
图书馆里有一个特殊角落——“目录卡片柜”。每当读者(模型)读完一段内容,就会手写一张卡片记录要点,供后面写文章时引用。这张卡片就是 KV 缓存:K(Key)和 V(Value)两个矩阵,记录着对话历史里每个 token 的“关键词”和“含义”。对话越长,卡片柜越满,内存占用随之线性增长:
其中 2 表示 K、V 各一份,L 是 Transformer 层数,H 是隐藏维度,T 是序列长度(历史 token 数),s 是每个元素占用的字节数。
1. 系数 2(K 和 V 两份):每个历史 token 都要同时保存 Key 和 Value 两种卡片,所以内存先乘 2。
2. 层数 L:模型有 L 层,每一层都有自己独立的目录卡片柜,互相不能共用。
3. 隐藏维度 H:每张卡片上记录的特征数。H 越大,单张卡片越“详细”,占的内存越多。
4. 序列长度 T:已经写过的卡片总数,也就是对话历史里的 token 数量。T 越大,柜子越满。
5. 每元素字节数 s:卡片上的每个数字用多少字节存。FP16 用 2 字节,INT8 用 1 字节,s 是 KV 量化的关键旋钮。
以 32 层、隐藏维度 4096 的 7B 模型为例,2048 个 token 的会话在 FP16 下要占约 1GB 内存,而 MLC-LLM 支持把 KV 缓存量化到 INT8,立刻砍半到约 512MB。再配合控制序列长度上限、复用显存缓冲等策略,整个内存预算就压进了手机的可承受范围。目录卡片瘦了身,小书房才有空间摆下更多书。
量化配置:压缩袋的选择艺术
搬家装箱时,不同的书会用不同的“压缩袋”:舍不得原封搬运的精装书,就保持原样(FP16);普通小说则抽真空压缩(INT4)。MLC-LLM 的量化格式命名规则看后缀就知道用了哪种袋子:q0f16 表示权重不量化、特征保持 16 位;q4f16 表示权重压缩成 4 位、特征仍用 16 位。这个“q 数字”就是权重位宽,决定了模型体积与效果的天平。
量化背后的数学其实是一道“四舍五入”的算术题——把原来连续的浮点数,映射到几个离散的整数台阶上:
决定台阶宽窄的 Δ 和偏移量 z,就是这袋“压缩袋”的松紧带。
1. 原始浮点值 x:压缩前每个权重参数的真实数值,通常是 FP16 甚至更高精度的浮点数。
2. 缩放尺度 Δ:把连续的数值范围均匀切成 2^b 份(b 是量化位数),Δ 就是每份的宽度,决定了压缩袋的“网格密度”。
3. 零点 z:浮点最小值对应的整数偏移,用来纠正分布不完全对称的权重(比如图书馆里大多数书偏薄,分布不均)。
4. 取整 round:把连续值 x 落在哪个台阶上,四舍五入到最近的整数,这一步会丢失信息,也是精度损失的来源。
那是不是位宽越低越好?并不是。2bit 的“压缩袋”虽然最省空间,但解压后书页模糊得没法读,模型生成质量明显下降。业界与 MLC-LLM 社区的共识是:7B 量级的模型选 q4f16,是“装得下”与“读得懂”之间的黄金平衡点。实际部署时还可以进一步采用分组量化(按小块分别计算 Δ 与 z),让压缩更精细、误差更小。
NPU 协同:请来翻书机器人
小书房里只有 CPU 这位“人肉翻书员”,翻一本书要一页页过目,费时费力;GPU 是“多位翻书工”,能同时翻很多页,但功耗不低。而现在手机里多了一位专用“翻书机器人”——NPU(神经网络处理单元)。它天生擅长矩阵乘加这类神经网络的基础动作,翻起书来又快又省电。MLC-LLM 的“搬家图纸”(TVM 编译)之所以强大,就在于它能把算子级别的任务指派给最合适的“工人”,完成 CPU、GPU、NPU 的异构分工。
不过,翻书机器人有个怪脾气:它只认固定格式的书页(已适配的算子)。矩阵乘法、常见激活函数这些“标准书页”它能高效处理,但遇到它没见过的算子,就只好交回给人肉翻书员(回退到 CPU/GPU)。所以 NPU 加速的效果,用下面的比值来衡量:
其中 T_CPU 是纯 CPU 推理耗时,T_NPU 是 NPU 协同推理耗时。
1. CPU 基准耗时 T_CPU:所有算子都跑在 CPU 上的总推理时间,这是“人肉翻书”的基准速度。
2. NPU 协同耗时 T_NPU:部分算子被调度到 NPU 执行后的总时间,等于 NPU 算子时间加回退算子的 CPU 时间。
3. 加速比:两者相除,得到 NPU 带来的整体收益。算子覆盖越全,回退越少,加速比越高。
在 MLC-LLM 中,NPU 加速不是一劳永逸的:每款手机 NPU 的指令集都不同,需要针对具体芯片做算子适配。适配完成后收益很可观——社区实测中,部分算子调度到 NPU 后功耗显著下降,这正是“翻书机器人”省电的体现。对于每天要充电的手机而言,NPU 协同不是锦上添花,而是端侧大模型能否长期使用的关键拼图。
性能基准与功耗:搬家验收报告
工程做完,搬家大师要出一份“验收报告”:在 iPhone 15 Pro 和 Pixel 8 这两套“样板房”里,分别计时翻书速度、记录电量消耗和机身温度。衡量翻书速度的指标是 tokens/s——每秒生成的 token 数。参考社区公开实测(版本与工况不同会有波动),7B 模型在 q4f16 量化下,iPhone 15 Pro 大约能跑到 5~12 tokens/s,Pixel 8 则在 4~9 tokens/s 区间;日常聊天能读,长文生成则需要稍等。真正的体验瓶颈往往不是算得快不快,而是“烫不烫、电够不够”——连续推理时手机温度会明显上升,电池消耗速度也远高于刷视频。
这份验收报告的核心公式很朴素:
每秒吐出的 token 数,就是用户感知到的“快慢”。
1. 生成 token 数 N_tokens:从模型开始回复到结束,一共生成的词元个数,相当于回复的总字数。
2. 耗时 t_秒:从输入 Prompt 到完整回复输出的总秒数,包含预填充与全部解码时间。
3. 速度合成:两者相除,得到每秒生成速度。这个值越高,用户体验越接近“实时对话”。
搬家验收的结论很清晰:q4f16 的 7B 模型在旗舰手机上已经达到“可用的日常交互”水准,再加上 KV 量化省下的内存与 NPU 分担的功耗,这间“手机小书房”从“能住”进化到了“住得舒服”。所谓端侧 AI 的梦想,不过是让模型安安静静地住在你的口袋里,不联网、不泄露隐私、随叫随到。
AI 应用场景
离线移动助手:飞行模式也能对话
阶段:端侧推理部署
解决的问题:传统云端 API 在无网、弱网、漫游场景下完全不可用,且敏感对话经过云端存在隐私泄露风险。MLC-LLM 部署后,模型和推理全部在手机本地完成,离线可用,隐私不出设备。
具体案例:面向野外勘探与远洋航运人员的离线问答 App 内置 7B q4f16 模型,支持安全规程查询、设备故障排查问答。实测在 iPhone 15 Pro 上约 8 tokens/s,“今天能出海吗?”这类短指令几乎秒回,全程无联网权限。
端侧智能笔记:会议纪要不出手机
阶段:模型压缩与集成
解决的问题:会议纪要、私人日记等文本高度敏感,用户不愿上传云端做摘要。借助 MLC-LLM 的量化和内存优化,把 3B~7B 模型嵌入笔记 App,让摘要、关键词提取、情绪标签全部发生在设备本地。
具体案例:某日记 App 集成 MLC-LLM,夜间在充电状态离线批量处理当天语音转写的日记,生成情绪曲线与话题标签,仅消耗少量电量,且所有数据不出手机。
穿戴设备语音助手:NPU 省电长续航
阶段:NPU 协同与功耗调优
解决的问题:智能手表电池极小,用 CPU 跑模型会迅速耗尽电量。通过 MLC-LLM 将已适配的算子调度到 NPU,以极低功耗完成唤醒词识别与短指令意图分类。
具体案例:某智能手表集成 MLC-LLM 驱动的语音助手,NPU 上跑通“设定闹钟”“今日步数”等固定指令识别,整体推理功耗比纯 CPU 方案降低约 60%,一次充电待机从 1 天提升到 2 天。
Python 演示
# 模拟 MLC-LLM 移动端部署:量化档位选择与内存预算估算import math def format_size(size_bytes): if size_bytes >= 1e9: return "{:.2f} GB".format(size_bytes / 1e9) return "{:.1f} MB".format(size_bytes / 1e6) def model_size_bytes(num_params, weight_bits): return num_params * weight_bits / 8.0 def kv_cache_bytes(layers, hidden_dim, seq_len, elem_bytes): return 2 * layers * hidden_dim * seq_len * elem_bytes def deployment_plan(): num_params = 7_000_000_000 layers, hidden_dim = 32, 4096 seq_len = 2048 phone_ram = 8e9 print("=== MLC-LLM 7B 移动端部署方案评估 ===") print("序列长度: {} tokens | 手机内存: {}\n".format(seq_len, format_size(phone_ram))) options = [ ("q0f16 (FP16)", 16), ("q4f16 (4bit)", 4), ("q3f16 (3bit)", 3), ] for name, bits in options: weights = model_size_bytes(num_params, bits) kv = kv_cache_bytes(layers, hidden_dim, seq_len, 1) # INT8 KV total = weights + kv fits = total <= phone_ram * 0.8 print("[{}] 权重: {} | KV: {}".format( name, format_size(weights), format_size(kv))) print(" 合计: {} => {}\n".format( format_size(total), "可以装载" if fits else "内存超限")) if __name__ == "__main__": deployment_plan()
def model_size_bytes(num_params, weight_bits):定义权重体积计算函数,把参数量与位宽换算成字节。return num_params * weight_bits / 8.0位转字节要除以 8(1 字节 = 8 bit),这是全书“秤重”公式的代码化身。def kv_cache_bytes(layers, hidden_dim, seq_len, elem_bytes):对应 KV 缓存公式 M = 2×L×H×T×s,四要素齐全。kv = kv_cache_bytes(layers, hidden_dim, seq_len, 1)假设 KV 量化到 INT8,每元素只占 1 字节。total = weights + kv部署总占用等于权重与 KV 缓存之和,两者缺一不可。fits = total <= phone_ram * 0.8给系统和其他 App 预留 20% 内存,避免手机卡死。options = [("q0f16 (FP16)", 16), ...]候选的三种“压缩袋”,对应正文量化配置档位。print("[{}] ...".format(name, ...))输出每档方案的评估结论,辅助开发决策。
常见误区
误区“7B 就是 70 亿个参数,这数字听着就吓人,手机那点内存肯定连模型文件都放不下,跑大模型只能老老实实调云端 API。”
正解模型占用的内存并不是只看参数量,而是“参数量 × 每参数字节数”。7B 模型在 q4f16(权重 4bit)下只有约 3.5GB,加上 KV 缓存和 App 开销,完全落在 8GB RAM 手机的预算内。MLC-LLM 的量化与编译优化,正是让“装得下”从不可能变成可能的关键。
为何常见:大家平时接触的是云端 70B+ 大模型的体积印象,忽略了量化和编译这两步能砍掉 75% 以上的体积,也低估了现代手机 8~16GB 内存的实际容纳能力。
误区“4bit 量化就是把模型里的信息扔掉了四分之三,生成质量肯定糊成一团,这 App 没法用。”
正解量化确实会损失部分精度,但 q4f16 在 7B 量级常见任务上与 FP16 的差距很小——困惑度仅略微上升,日常问答、摘要、分类的体验几乎无差别。真正明显退化通常出现在 3bit 甚至更低位宽。业界大量端侧产品默认 4bit,就是因为它处在“体积小”与“质量可接受”的最佳平衡点。
为何常见:看到“丢精度”三个字就直觉认为效果差,却没意识到大模型本身有冗余,且量化误差可以通过分组量化、校准等手段进一步压低。
误区“我就和模型随便聊几句,上下文又不长,KV 缓存能占多少内存?根本不用管。”
正解KV 缓存随对话 token 数线性增长,几轮闲聊累积到 500~1000 tokens 时,FP16 的 KV 就已经占掉几百 MB;序列达到 2048 时更可能突破 1GB。若不规划好序列长度上限或 KV 量化,App 会随对话变长而迅速内存吃紧,甚至被系统杀掉。
为何常见:演示 Demo 通常只问一句话就结束,用户看不到长对话下的内存攀升;而云 API 自动管理上下文,让人误以为 KV 缓存不存在。
误区“手机发布会都吹 NPU 算力几十 TOPS,跑大模型肯定快得飞起,买台带 NPU 的手机就一劳永逸了。”
正解NPU 只加速已适配的算子(如矩阵乘、常见激活函数),模型里那些未适配的算子会回退到 CPU/GPU。回退频繁时,数据来回搬运的额外开销甚至可能让整体比纯 CPU 更慢。MLC-LLM 通过 TVM 做算子映射,必须针对具体芯片做适配才能真正吃到 NPU 的能效红利。
为何常见:厂商宣传强调硬件峰值算力,刻意淡化了“软件适配”这一决定性环节,让大众误以为硬件堆料等于体验提升。
误区“Swift 和 Kotlin 语言完全不同,MLC-LLM 在两端接入方式也不一样,等于要维护两套 AI 代码,工作量直接翻倍。”
正解MLC-LLM 的核心 C++ 引擎通过 TVM 编译一次后多端复用,iOS 用 Swift Package、Android 用 JNI 都只是薄薄的“外壳适配层”。模型文件、推理逻辑、量化配置在两端完全共享,真正要维护的差异只在 UI 层与构建脚本,远没有想象中那么可怕。
为何常见:看到两端集成方式不同就误以为核心逻辑要各写一套,忽略了跨平台编译框架正是 MLC-LLM 的核心价值之一。
面试题
Q1. MLC-LLM 的底层编译器基础是什么?
- A.深度学习框架 PyTorch
- B.端侧编译器 Apache TVM← 正确答案
- C.图形渲染接口 OpenGL
- D.安卓构建工具 Gradle
答案:B。MLC-LLM 名字里的 “MLC“ 指机器学习编译,核心依赖 Apache TVM 把模型计算翻译成各硬件指令。PyTorch 是训练框架,OpenGL 是图形接口,Gradle 是 Android 构建工具,都和”编译器”这一角色无关。
Q2. 在手机上部署 7B 模型时,为什么 q4f16 比 q0f16 更常用?
- A.体积缩小且精度损失少← 正确答案
- B.模型运行速度没有区别
- C.只能减少磁盘占用
- D.完全不影响模型效果
答案:A。q4f16 把权重压成 4bit,体积降为原来的四分之一,同时精度损失在可接受范围,因此成为黄金档位。B 错误,体积变小、访存变少通常也会带来速度提升;C 说法过于片面,它同时减少内存占用;D 说“完全不影响”太绝对,量化一定带来轻微损失。
Q3. Android 端 Java/Kotlin 调用 C++ 引擎的桥接机制是什么?
- A.TypeScript 类型与标注
- B.JNI 原生接口的桥接← 正确答案
- C.HTTP 网络传输的协议
- D.数据库 SQL 查询的语句
答案:B。JNI 是 Java Native Interface,专门负责 Java/Kotlin 与 C++ 等原生代码互调,就像传菜口一样连接前后台。TypeScript 是前端语言,HTTP 是网络协议,SQL 是数据库查询语言,都不承担跨语言桥接职责。
Q4. 长对话时 KV 缓存内存随序列如何变化?
- A.固定不变,与对话长度无关
- B.与对话 token 数成正比增长← 正确答案
- C.先增后减,周期性波动
- D.仅首轮占据固定内存
答案:B。KV 缓存为每个历史 token 保存 K、V 两份矩阵,所以内存与序列长度 T 成正比。A 错在忽视缓存累积;C 没有先增后减的机制;D 错,首轮之后每轮对话都会追加新 token 的缓存,内存持续增长。
Q5. 公式 M=2×L×H×T×s 中符号 s 表示什么?
- A.权重参数的隐藏维度大小
- B.对话序列长度的平方
- C.每元素占用的内存字节← 正确答案
- D.量化分组包含的数量
答案:C。s 是每个缓存元素的内存字节数,FP16 为 2 字节,INT8 为 1 字节,是 KV 量化的关键旋钮。H 是隐藏维度,T 是序列长度,都不是 s;量化分组数也不在公式中。
Q6. 端侧推理中 t_prefill 与 t_decode 分别指什么?
- A.模型的下载和安装阶段
- B.编码输入和输出解码阶段
- C.预填充和逐词生成阶段← 正确答案
- D.权重压缩和释放内存阶段
答案:C。t_prefill 是预填充阶段,一次性读入用户 Prompt 并计算其状态;t_decode 是解码阶段,逐个生成输出 token。A 是部署行为,B 容易混淆但字幕并非“编码/解码”的对称关系,D 是优化行为,三者均非两阶段本意。
Q7. 均匀量化中参数 z(零点)的本质是什么?
- A.零点即最小值的补偿偏置← 正确答案
- B.量化后残差误差的调节项
- C.缩放尺度与动态范围的对应
- D.反量化时浮点系数的表达
答案:A。z 用来纠正数据分布不对称:量化公式中先减 z 再缩放,等价于把浮点最小值对齐到整数 0,所以它是“最小值的补偿偏置”。Δ 才是缩放尺度,残差误差与反量化系数都不是 z 的本职。
Q8. MLC-LLM 移动端可用的内存优化策略包括哪些?
- A.对 KV 缓存做量化压缩← 正确答案
- B.控制对话序列长度上限← 正确答案
- C.使用 q4f16 量化权重← 正确答案
- D.关闭模型离线缓存文件
答案:ABC。KV 缓存量化直接降低公式中的 s,控制序列长度降低 T,q4f16 量化权重降低模型体积,三者都是有效策略。D 关闭离线缓存文件对应磁盘空间管理,与推理期内存优化无关。
Q9. 影响端侧 tokens/s 吞吐的因素包括哪些?
- A.权重量化位宽的选择← 正确答案
- B.手机 CPU 和 GPU 频率← 正确答案
- C.NPU 算子覆盖的程度← 正确答案
- D.屏幕分辨率的大小
答案:ABC。位宽决定访存量,CPU/GPU 频率决定算力天花板,NPU 算子覆盖决定异构加速收益,三者共同影响生成速度。屏幕分辨率只影响渲染开销,与模型推理的 token 吞吐没有直接关系。
Q10. 关于 MLC-LLM 与 NPU 协同的说法,正确的是哪些?
- A.算子适配后 NPU 能效更高← 正确答案
- B.未适配算子会回退到 CPU← 正确答案
- C.NPU 总能让模型百倍提速
- D.TVM 负责算子的调度映射← 正确答案
答案:ABD。适配后的算子跑在 NPU 上能效显著提升,未适配算子回退 CPU 是真实机制,TVM 正是负责把算子映射到不同硬件的编译器。C 错在“总是”与“百倍”的绝对化表述,实际收益取决于算子覆盖比例与数据搬运开销,并不总是大幅提速。