端侧 LLM 产品化
把模型、异构硬件、MCU/Host 边界与运营证据收束为可交付系统
建议阅读:约 20 分钟
学习目标
本章关键词
| 关键词 | 解释 | ESP32 工程类比 |
|---|---|---|
| 安全边界 | 必须由确定性组件强制执行的权限和范围限制。 | 像 GPIO/电机驱动前的硬件互锁与状态机。 |
| Delegate | 接收已分区子图并在 CPU/GPU/NPU 等特定后端编译执行的接口。 | 像把一段受支持的工作交给硬件外设,但入口格式、DMA 和同步都要匹配。 |
| Peak RSS | 进程在测量期间达到的最大常驻物理内存,用于发现加载或 Prefill 峰值。 | 像同时记录 heap 高水位,而不是只看固件镜像大小。 |
| 显式回退 | 在权限、隐私、时限与失败行为已定义的条件下转到另一 backend 或云端。 | 像主链路失败后进入经过验收的备份状态机,而非任意重试。 |
承上:回顾与定位
前十四天已从神经网络基础走到 LLM 结构、运行时、量化、框架和跨尺度性能。本章把全部知识压回一个真实产品:谁有执行权、每个字节和每焦耳花在哪里、失败时如何保持安全、版本如何发布与回滚。
历史发展脉络
端侧 LLM 同样来自两条历史线:芯片从 CPU SIMD 走向移动 GPU、DSP、NPU 与 MCU 加速器,软件则从轻量解释器和图编译器走向量化格式、AOT delegate 与生成式 pipeline。硬件提供可能性,软件决定模型能否跨设备稳定交付。
端侧芯片与异构计算线
CPU SIMD 让多数据并行进入通用处理器
向量指令把量化点积、激活和预处理映射到宽寄存器;今天的端侧 CPU backend 仍依赖正确的数据布局、线程绑定和缓存复用。
Arm SIMD 官方文档 ↗移动 GPU 与 DSP 承担媒体和机器学习数据流
可编程 shader、计算 API 与信号处理器提供比 CPU 更高的并行度,但也引入命令提交、buffer 域和算子覆盖边界。
Khronos OpenCL 官方规范 ↗NPU 把低精度神经网络图变为专用执行路径
移动 SoC 开始加入神经网络引擎;真正收益取决于编译器能覆盖多少图、支持哪些 shape/dtype,以及边界是否需要昂贵转换。
Android NNAPI 官方文档 ↗MCU 级加速器把 TinyML 留在毫瓦级端点
Ethos-U 等设计面向受限 SRAM、低精度算子与实时嵌入式系统,适合小模型,不等同于把通用 LLM 直接塞进微控制器。
Arm Ethos-U55 官方资料 ↗生成式 AI SoC 强化统一内存与异构协同
CPU、GPU、NPU 与共享内存控制器被放在同一封装中,减少某些离散传输,但带宽、缓存一致性、功耗预算和热降频仍限制持续生成。
MLCommons MLPerf Client 基准 ↗端侧软件与模型交付线
TensorFlow Lite 把转换、解释器与 delegate 带到移动端
轻量 runtime、量化与平台 delegate 形成端侧部署基本模式:统一模型语义,按硬件能力分区执行,并保留 CPU 路径。
TensorFlow Lite 原始论文 ↗TVM 把模型图与硬件 schedule 分离
端到端编译器用中间表示、自动/模板化调度和多硬件代码生成,说明 portability 需要显式 lowering,而不是期待同一 kernel 二进制通吃。
TVM 原始论文 ↗llama.cpp 与 GGUF 降低本地量化 LLM 的部署门槛
低依赖 C/C++ runtime、量化工具和多 backend 让普通 PC、Mac、SBC 与移动设备可以在本地运行开放权重模型,并形成可复现实验入口。
llama.cpp 官方仓库 ↗MLC LLM 与 ExecuTorch 强化 AOT、分区和跨平台交付
编译器驱动生成平台代码,或从 PyTorch 导出并把子图交给 delegate,使模型优化与应用 SDK、设备后端连接得更紧。
MLC LLM 原始论文 ↗LiteRT-LM、MNN 等补齐生成式 pipeline 与产品接口
端侧框架开始把 tokenizer、会话、KV、跨语言 API、多模态组件和 CPU/GPU/NPU backend 作为整套生成式交付面,而不再只执行一张静态图。
LiteRT-LM 官方仓库 ↗类比图解
把酒店厨房装进一辆餐车
云端酒店厨房可以同时接很多桌订单,有巨型冷库、成排灶台和专门传菜员;端侧餐车只有有限电池、储藏、炉具与散热。量化模型包像把食材压成适合车载的标准箱,IR 和 delegate 像把菜单步骤分给刀台、炉灶和专用烤箱,CPU/GPU/NPU 各有擅长工序。KV cache 是为当前顾客保留的备菜盒,Prefill 是一次备齐原料,Decode 是一道道流式出餐。若专用烤箱不支持某一步,来回搬到普通炉灶可能更慢;订单过长还会占满备菜空间。ESP32 像车上的安全与传感控制器,LLM 主体运行在更有能力的车载主机。
类比的边界: 餐车类比能说明容量、异构分工和热预算,却不能把 TOPS 换算为 tokens/s,也不能预测量化质量、delegate 覆盖或 OS 调度。真实端到端速度取决于模型、shape、backend、内存路径、软件版本与热状态;所有结论必须在目标设备上复测。
本章讲解
从验收指标反推系统边界
先写产品必须满足的事件、端到端时延、离线时长、误报漏报、安全状态、功耗和成本,再决定模型放在 MCU、Edge Host 或云。若断网后仍须毫秒级停机,判断与执行就不能依赖主机 LLM;若任务需要大上下文,可把解释放主机,但设备保留阈值规则。每项需求都映射到一个责任组件和可测信号,避免架构图只有箭头没有承诺。
把 Host 消息定义为提案而非指令
消息应使用有版本的结构化 schema,包含 device_id、request_id、sequence、deadline、action、typed params 和认证信息。ESP32 收到后验证来源、版本、去重、时效、动作白名单、参数范围与当前状态,全部通过才转成内部事件。自然语言永远不直接驱动 GPIO。对重复帧、乱序、重放、半包和未知字段做协议测试,并让拒绝原因可审计。
正常路径与降级路径必须共享状态机
为在线、主机慢、链路断、模型失败、传感器异常和执行器故障定义显式状态与转换;不要在异常回调里临时拼补动作。超时后取消主机请求并丢弃迟到回复,设备切回本地阈值或安全保持模式;重连需重新握手和同步序号。通过断网、重启、包丢失、Host 满载与 watchdog 复位做故障注入,确认每条路径都能回到已知状态。
端侧芯片是异构内存系统,不是一串 TOPS
CPU 负责控制流、tokenizer、采样与不被 delegate 支持的算子;GPU 适合规则的大规模并行,但命令提交、shader 编译、buffer 转换和共享资源争用会进入延迟;DSP/NPU 在受支持的 dtype、shape 与图模式上能以较低能耗运行,却可能要求静态维度、特定量化或厂商编译器。统一内存减少显式 PCIe 复制,不等于数据免费移动:缓存一致性、页面迁移、带宽争用和布局转换仍消耗时间与能量。宣称的 TOPS 通常是特定低精度算术峰值,既不包括 tokenizer、KV 管理和 sampling,也不说明模型有多少算子 fallback 到 CPU。应从 runtime trace 查每个子图落在哪个 backend、边界复制多少字节、首次编译多长、并发 UI/相机是否抢资源,再解释端到端 TTFT 与 ITL。
模型文件只是交付契约的一部分
GGUF 把张量、量化类型和推理元数据打包,适合 llama.cpp 的低依赖多后端生态;ExecuTorch 把 PyTorch 模型 AOT 导出为 .pte,并通过 partitioner/delegate 把子图交给目标后端;MLC LLM 从模型表示经编译器生成平台代码与参数;LiteRT-LM 在 LiteRT 之上组合 tokenizer、解码器与跨平台 API;MNN-LLM 把移动 runtime、多 backend 与应用集成连接起来。格式名不能保证语义相同:tokenizer 文件、chat template、RoPE 参数、special token、量化尺度、KV dtype 和采样默认值都属于模型包契约。发布时要记录原 checkpoint、转换工具 commit、命令、hash、license、支持的 context 与验证 prompt;加载前验证 schema 和兼容矩阵,避免 runtime 静默采用错误默认值。模型可加载只证明字节能解析,不证明输出、速度或权限符合产品要求。
把 lowering、分区与 fallback 当作可观测编译过程
端侧部署通常先捕获或导出计算图,再规范化算子、融合 pattern、插入量化/反量化,最后由 partitioner 将支持的子图交给 CPU、GPU、NPU delegate。边界两侧可能需要 layout、dtype 或内存域转换;一个孤立的不支持算子会把图切碎,导致多次同步与复制,甚至让“启用 NPU”比纯 CPU 更慢。正确做法是保存编译报告:哪些节点被委派、哪些 fallback、每个子图的输入契约、workspace 和首次编译缓存。对动态序列长度,可使用 shape bucket、chunked prefill 或专用 decode 图,但要验证边界值。若 delegate 失败,fallback 必须是受测路径而非“理论上能跑”;它需要容量上限、超时、日志和可恢复的模型版本。编译器日志、runtime trace 和系统功耗采样必须用同一 request id 对齐。
以质量、体验、能量、温度和可恢复性共同验收
端侧 benchmark 必须固定 checkpoint、量化、prompt 集、backend、线程、功耗模式、环境温度和软件版本。分别报告加载冷启动与缓存暖启动、Prefill tokens/s 与 TTFT、Decode tokens/s 与 ITL、峰值 RSS、J/token 或平均功率、设备温度与持续运行后的频率变化;生成速度还要与任务质量、格式遵循和拒答策略一起看。观测数据带模型 hash、delegate 分区摘要与 trace id,便于在设备群中比较版本。发布采用签名模型包、兼容矩阵、灰度比例、健康门槛与回滚;离线、delegate 初始化失败、温度过高、内存不足和云回退超时都要演练。最终交付不是某台凉爽样机的一次最高 tokens/s,而是目标设备分布在真实热状态、网络和前台负载下仍满足体验与安全边界的证据。
基础设施项目图谱与跨尺度启示
技术状态核验日期:
项目图谱按交付路线而非榜单排列。支持的模型、backend、量化和 CLI 会快速变化;以下边界用于决定从哪里验证,不构成跨厂商性能结论。
低依赖量化 Runtime
-
llama.cpp / GGUF ↗
- 解决的问题
- 在桌面、SBC 与移动平台低依赖运行量化开放权重 LLM。
- 核心机制
- GGUF 打包张量和元数据,ggml kernel 配合 CPU、Metal、CUDA、Vulkan 等 backend,并提供转换与 llama-bench。
- 适用边界
- backend 与 CLI 快速变化;GGUF 能加载不等于 chat template、质量、功耗和设备兼容性已验证。
-
bitnet.cpp ↗
- 解决的问题
- 探索 1-bit/低比特模型与专用 kernel 的协同推理。
- 核心机制
- 围绕 BitNet 模型结构、权重表示和 CPU kernel 联合优化。
- 适用边界
- 不是任意 checkpoint 的无损压缩器;收益依赖模型从训练到 kernel 的共同设计。
编译器与 AOT 部署
-
MLC LLM ↗
- 解决的问题
- 把 LLM 编译并部署到多类 GPU/CPU 平台与应用 API。
- 核心机制
- 基于机器学习编译器生成目标代码、量化模型库和平台绑定。
- 适用边界
- 模型支持和目标工具链有明确版本矩阵;编译产物不是跨设备通用二进制。
-
ExecuTorch ↗
- 解决的问题
- 把 PyTorch 模型 AOT 导出到移动/嵌入式 runtime。
- 核心机制
- 导出 .pte,使用 partitioner 将子图交给 XNNPACK、Core ML、Qualcomm 等 delegate,并通过 C++/Swift/Java 运行。
- 适用边界
- delegate 覆盖与动态 shape 决定边界成本;PyTorch 中能运行的模型不自动满足端侧内存。
生成式端侧 Pipeline
-
LiteRT-LM ↗
- 解决的问题
- 提供跨平台端侧生成式推理 pipeline 与应用 SDK。
- 核心机制
- 在 LiteRT 之上组合 tokenizer、模型组件、会话与 CPU/GPU/NPU backend。
- 适用边界
- 平台和 NPU 支持状态随版本变化;应以目标 release 的官方矩阵为准。
-
MNN-LLM ↗
- 解决的问题
- 在手机、PC 和 IoT 上集成轻量多 backend LLM 与多模态应用。
- 核心机制
- MNN runtime 连接 CPU、Metal、OpenCL/Vulkan 等后端、模型转换和移动应用接口。
- 适用边界
- 仓库 benchmark 不能脱离设备、模型、线程和热条件与其他 runtime 排名。
平台专用路线
-
MLX-LM ↗
- 解决的问题
- 在 Apple silicon 统一内存平台运行和微调 LLM。
- 核心机制
- 基于 MLX 数组框架、Metal 后端与平台内存模型提供量化、生成和训练工具。
- 适用边界
- 平台专用优化不可直接外推到 Android、离散 GPU 或 MCU;仍要测内存压力和热稳态。
来源机制—工程启示—适用边界
| 来源机制 | 工程启示 | 适用边界 |
|---|---|---|
| I/O-aware kernel、融合、少复制 | 直接迁移;端侧带宽和电池使每次中间物化更昂贵。 | 必须针对目标 shape/backend 生成或选择 kernel,不能只看算法名。 |
| Paged KV、prefix reuse、chunked prefill | 按 batch=1 与受控 context 改造,可降低碎片、重复计算和峰值阻塞。 | 分页元数据与调度也有成本;prefix 必须版本化并隔离隐私域。 |
| Continuous batching、跨节点 TP/PP | 默认不迁移;先证明设备上确有并发队列或可获益的异构分区。 | CPU/GPU/NPU 不是低成本同质 rank,边界复制可能超过计算收益。 |
| 数据中心拓扑意识 | 映射为 delegate 覆盖、共享内存、缓存一致性和 CPU/GPU/NPU 边界。 | 统一内存减少显式复制,不等于无限带宽或零同步。 |
| SLO、版本化、回滚、可观测性 | 完整迁移,并增加 J/token、peak RSS、温度与热降频。 | 实验室凉机均值不能代表设备群中的持续体验和电池寿命。 |
动态过程演示
一个端侧 Token 从预算到遥测的生命周期
动画把离线转换、首次加载与每次请求放在同一链路,展示端侧性能为何不只属于模型 kernel。
预算门 · device tier + privacy + context + deadline
根据设备能力、权限、温度和网络策略选择本地模型、降级任务或显式云回退
路由首先是产品与安全决策,其次才是性能决策
循环 / 返回条件: 多轮会话回到预算门:根据剩余 context、KV 驻留、温度、电量与隐私策略继续、压缩、卸载或明确请求云端。取消和切换模型时先停止生成,再回收 KV 与 delegate 资源。
查看静态全景图
sensor/actuator ↔ MCU deterministic gate ↔ Edge Host LLM
│ validate tool proposal │
└── explicit cloud fallback
model package → runtime/backend → telemetry → staged OTA/rollback代码或命令示例
proposal = edge_llm(request)
validated = policy_and_schema_check(proposal)
if validated:
mcu_execute(validated)
else:
enter_safe_degraded_state()
record(version_set, latency, energy, thermal, failures)动手实验
实验记录与导出
工程陷阱
核心测试
完成 3 道单选题后提交;提交前不会显示答案。
在 GitHub 上讨论本章
登录 GitHub 后提问、补充实测或分享你的实现;评论会保存在本课程的 GitHub Discussions 中。
评论区需要 JavaScript;也可以直接打开 GitHub 讨论区: 打开 GitHub 讨论区 ↗
延伸阅读
启下:下一章如何使用本章能力
15 天路线已经完成。下一次项目从目标设备和真实工作负载开始:先写安全与验收边界,再选择模型与 runtime,并让每次优化都留下可复现证据。