12 推理运行时洞察
- 章节编号:12
- 所属层:R 运行时层(与 13 章实时调度强耦合;承接 04/08 系统接口)
- 关联 ADR:ADR-034(运行时框架)、ADR-035(异构调度/异步)、ADR-036(内存管理)、ADR-037(多模型/footprint)
- 上游依赖:01(多频率/batch≈1)、03(内存/KV)、04(统一内存/NoC)、07/08(ISA/同步/显式 DMA)、15(IREE/编译产物)
学习目标
- 前置知识:读过 01 章负载画像(知道 batch≈1、多频率、chunk 延迟这些具身特有约束)与 15 章编译器基础(知道 AOT 会把整张图编译成
.vmfb类字节码);了解 π0 类模型「VLM 前缀 + 动作专家多步迭代」的部署结构(见 M 层 21 章);对「编译态静态图 vs eager 逐算子解释」有直觉即可,不需要写过 IREE/TensorRT。 - 学完产出:① 能说清「运行时」在整条栈中的职责边界——它不做算子实现(那是 16 章 kernel),也不做时间片抢占裁决(那是 13 章实时),而是负责加载编译产物、编排异构设备、管理内存、驱动执行循环;② 能画出 IREE 三层(HAL/VM/后端)如何把一张编译图落到自研 DSA 上,并解释为什么它与我们的 MLIR 编译栈「同源」是 决定性优势;③ 能用「编译态静态图消除了逐算子调度抖动」一句话讲清为什么确定性延迟必须走 AOT 而非 eager,并算一遍两者的调度开销差;④ 能说清 KV-cache / 前缀复用如何把 π0 的 chunk 延迟从「每步重算全序列」降到「prefill 一次 + suffix 增量」,并算一遍一个 chunk 的延迟账;⑤ 能解释「双缓冲(double buffering)」如何在 RTC 异步 chunk 场景下把「生成下一 chunk 的耗时」藏进「执行当前 chunk 的时间」里,消除 chunk 边界停顿。
- 阅读姿势:盯住一条主线——「运行时的一切设计,都是为了让加速单元在 batch≈1 的低延迟约束下永不空等」。云端 serving 靠堆 batch 提吞吐,而具身端侧只有一个请求、一个本体、一条实时控制回路;运行时能做的不是「攒批」,而是用异步异构掩盖设备间等待、用 KV-cache 消除重复计算、用双缓冲掩盖 chunk 边界、用编译态静态图消除调度抖动——四把武器都指向同一个敌人:延迟的不确定性。
1. 范围与目标
运行时负责把编译产物(.vmfb 类)在芯片上加载、调度、执行:内存管理、异构(NPU+CPU+DSP+ISP)调度、多模型并发、与 Driver/HAL 对接。实时确定性保证见 13 章。
核心问题
- 业界主流运行时有哪些?各大厂用什么?复用哪种(IREE / ONNX Runtime / TVM / 厂商式自研…)还是自研?
- 异构多设备如何异步并发调度(不让设备轮流等待)?
- 内存如何管理(统一内存/零拷贝/KV-cache)?
- 多模型并发与端侧极小 footprint 如何兼顾?
- 具身特有的 chunk 执行语义(π0 流匹配、RTC 异步)对运行时执行循环提出哪些超出通用推理的诉求?
2. 需求洞察(承接上游)
- batch≈1 低延迟(01)⇒ 低调度开销、流水化执行。
- 多频率并发(01:认知/感知/控制)⇒ 异构设备异步并发(NPU 算时 CPU/DSP 不空等)。
- 统一内存 + 零拷贝(04)⇒ NPU↔CPU 数据免拷贝(VLA 前后处理)。
- 软件管理内存 + 显式 DMA + 弱序同步(08)⇒ 运行时与编译器协同编排,而非依赖硬件 cache 一致。
- KV-cache/动态 shape/多模型(03)⇒ 灵活内存分配 + 隔离。
- 端侧 footprint 小、可离线(01)⇒ AOT、轻量运行时、可裁剪。
- 确定性(→13)⇒ 运行时须支持优先级/抢占接口。
- chunk 语义 + 双缓冲(21/RTC)⇒ 运行时执行循环须能「执行当前 chunk 的同时生成下一 chunk」,把生成延迟藏进执行窗口。