乐于分享
好东西不私藏

端侧 AI 的不可能三角:延迟、内存、精度

端侧 AI 的不可能三角:延迟、内存、精度
一、前言
端侧设备,如手机、笔记本、嵌入式板子,有内存上限、功耗上限、散热上限。在这些约束下,部署 AI 模型时不可能同时:低延迟、小内存与高精度。这就是目前端侧AI部署的不可能三角问题。
这篇文章拆解端侧部署的核心矛盾和优化手段:量化、推测解码、KV Cache 管理。每种方案的本质是什么,代价是什么,什么时候该用,什么时候不该用。
二、端侧部署的不可能三角
这不是某个模型或某个芯片的局限,是物理规律——端侧设备的内存带宽、算力和功耗上限决定了这一点。云端服务器可以靠堆 A100 和 NVLink 回避问题,但端侧不行。
这个不可能三角是:
• 低延迟:推理速度快,用户感觉流畅(首 token < 100ms,生成 > 20 tok/s)
• 小内存:模型能装进有限的 RAM/VRAM(比如手机上 2~4GB)
• 高精度:模型输出质量好,不会胡言乱语
保住任意两个,第三个就必然受损。所有的边缘 AI 优化技术:量化、剪枝、推测解码、KV Cache 压缩——本质上都是在三角的三个顶点之间移动你的位置。
三、先搞清瓶颈在哪
很多人一上来就想"我的 GPU 算力够不够"。其实LLM 推理的瓶颈几乎从来不 FLOPS(浮点运算),而是内存带宽。
为什么?因为自回归生成每一步都要把整个模型权重从内存搬到计算单元。7B 模型,BF16 精度,14GB 权重。每生成一个 token,这 14GB 就要读一遍。你的 GPU 算力再强,如果内存带宽只有 100GB/s,那理论上限就是 100/14 ≈ 7 tok/s。
这个叫 Memory-Bound 问题。公式很简单:最大吞吐 = 内存带宽 / 模型权重大小
四、量化:牺牲精度换内存和速度

量化是最直接的优化——把权重的数值精度降低。BF16(16-bit)→ INT8(8-bit)→ INT4(4-bit),模型大小直接按比例缩小。

直观感受:
• 7B 模型 BF16:14GB
• 7B 模型 INT8:7GB(减半)
• 7B 模型 INT4:3.5GB(减到 1/4)
内存省了,带宽需求也降了,生成速度自然上去。但代价是什么?精度损失。
损失的量级取决于量化方法和模型本身:
• INT8:通常损失 1~3 个百分点(MMLU 等基准),很多场景可接受
• INT4:损失 3~8 个百分点,部分复杂推理任务明显退化
• INT3/INT2:损失开始非线性增长,模型"变笨"的速度超过预期
这里有个容易被忽略的事实:不同模型对量化的敏感度天差地别。MoE 架构(比如 Mixtral、Qwen MoE)通常比 Dense 模型更抗量化,因为每个 token 只激活部分专家,单条路径的精度损失被稀释了。
所以量化不是"无脑 INT4 就行"——你得知道你的任务对精度的容忍度。对话场景可以接受 INT4,代码生成可能 INT8 是底线。
五、推测解码:用额外内存换延迟

量化是"把模型缩小",推测解码(Speculative Decoding)是完全不同的思路:保留原模型精度不变,用小模型"预猜"来加速。

核心思想:让一个小模型(draft model)先快速生成 N 个 token,然后用大模型(target model)一次性验证这些 token。猜对的直接接受,猜错的回退重算。
这就像你让实习生先写草稿,你最后审一遍。实习生写得快但可能出错,你审得慢但保证质量。两者配合,总体比你自己从头写要快。
代价是什么?内存。
你需要同时加载两个模型。7B 大模型 + 1B 小模型,BF16 下需要 14 + 2 = 16GB。量化可以缓解这个问题(比如小模型 INT4,大模型 INT8),但总体内存占用还是比单模型高。
加速效果取决于大小模型之间的"相似度"——如果小模型经常猜对,加速比可以到 2~3x;如果猜不对,反而更慢。
六、KV Cache:被忽视的内存黑洞

很多人量化完模型,发现内存还是不够——因为忘了算 KV Cache。

KV Cache 是自回归推理的"工作记忆"。每生成一个 token,之前所有 token 的 K 和 V 矩阵都要缓存起来。上下文越长,KV Cache 越大。
7B 模型,BF16,8K 上下文,KV Cache 大约 2~3GB。32K 上下文,直接涨到 8~10GB。在端侧设备上,这完全可以吃掉你剩下的所有内存。
KV Cache 优化的几个方向:
• KV Cache 量化:把 K 和 V 也量化到 INT8/INT4,省 50~75% 内存,精度影响通常很小
• 分页注意力(PagedAttention):像 OS 分页一样管理 KV Cache,避免碎片浪费
• 滑动窗口注意力(Sliding Window):只保留最近 N 个 token 的 KV,长文本有损但省大量内存
• KV Cache Offload:把部分 KV 搬到 CPU 内存,GPU 显存不够时自动降级
最后一种在端侧特别实用——GPU 显存只有 4GB,但系统内存有 16GB。把 KV Cache 部分 offload 到 CPU 上,虽然访问慢一些,但至少能跑完。
七、决策框架

回到不可能三角。实际部署时,先问自己一个问题:

哪个顶点是你绝对不能妥协的?
然后剩下的就是你的优化空间:
场景 A:延迟优先(实时对话、语音助手)
保住延迟,牺牲精度或内存。推荐:
• 模型选小一点(3~7B)
• INT8 量化起步
• KV Cache 量化 + 分页管理
• 如果有额外内存预算,上推测解码
场景 B:内存优先(嵌入式设备、IoT)
保住内存,牺牲精度或延迟。推荐:
• INT4 量化(甚至 INT3)
• KV Cache INT4 或滑动窗口
• 模型选 MoE 架构(推理时只激活部分参数)
延迟会比较慢,但在 IoT 场景下通常可以接受——没人要求智能音箱 100ms 内响应。
场景 C:精度优先(代码生成、医疗、法律)
保住精度,牺牲内存或延迟。推荐:
• 尽量用 BF16 或 FP16,不量化或只量化 KV Cache
• 模型选大一点(13B+)
• 内存不够就 offload 到 CPU,慢就慢点,不能出错
• 可以接受 1~2 tok/s 的速度,但输出质量不能打折
八、现实中的部署策略

实际工作中,你不会只选一种技术。通常是组合使用。一个典型的端侧部署方案:

# 典型边缘部署配置model = "Qwen2.5-7B-Instruct"quantization = "INT4"           # 精度换内存kv_cache_quant = "INT8"         # KV Cache 额外压缩max_context = 4096             # 限制上下文长度speculative = True             # 开启推测解码draft_model = "Qwen2.5-1.5B"offload_to_cpu = True          # 溢出时 offload# 结果:# 模型权重: ~3.5GB (INT4)# KV Cache: ~1GB (INT8, 4K ctx)# Draft model: ~1GB (INT4)# 总内存: ~5.5GB# 速度: ~15 tok/s (推测解码命中时)
这个配置在 8GB 内存的设备上可以跑 7B 模型,速度 15 tok/s 左右——虽然不是极快,但对大多数对话场景足够了。
九、总结

端侧 AI 没有银弹。不可能三角是物理规律,不是工程缺陷。每一个优化方案都是在三个顶点之间做 tradeoff。但实际应用中,大多数场景不需要三个顶点都保住。搞清楚使用场景里哪个最重要,然后有选择地牺牲另外两个,部署方案就清晰了。

【参考文献】
[1] https://fireworks.ai/blog/frontier-rl-is-cheaper-than-you-think
[2] https://huggingface.co/papers/2603.24477
[3] https://github.com/huggingface/trl/pull/5417
[4] Kwon et al. vLLM: PagedAttention. https://arxiv.org/abs/2309.06180

相关学习资料