NPU 算力 1 TOPS,如何调度多模型并行推理并保证实时性

解读

  1. 1 TOPS 是理论峰值,换算到 INT8 约 1000 GOPS,实际利用率 40%~60%,再扣除内存墙、调度开销,可用算力约 300~500 GOPS。
  2. “多模型并行”意味着同一时刻有 ≥2 个模型在 NPU 上跑,且每个模型都有硬实时 deadline(如 10 ms、16 ms、33 ms)。
  3. 题目隐含“资源不足”场景:如果所有模型同时跑满,算力一定溢出,必须做“时间-空间”双重复用,并给出可验证的实时性证明。
  4. 面试官想听的不是“加机器”,而是“在 1 TOPS 约束下,如何通过调度、裁剪、流水线、QoS 控制,把可调度性分析、性能测试、稳定性验证做成闭环”。

知识点

  1. NPU 微架构:
    • 典型国产 NPU(如某 3×3 阵列,每核 128 MAC,1 GHz)= 737 MAC/cycle → 1 TOPS@INT8。
    • 片上 SRAM 1–2 MB,DDR 带宽 8–12 GB/s,DMA 延迟 2–3 µs。
  2. 实时调度理论:
    • 周期性任务模型(Pi, Ci, Di, Ti),可调度性判定:∑(Ci/Ti) ≤ Umax(EDF 为 1,RM 为 ln2)。
    • 最坏情况响应时间(WCRT)公式:Ri = Ci + ∑⌈Ri/Tj⌉·Cj。
  3. 异构系统调度:
    • 时间片轮转、固定优先级、EDF、基于预算的 reservation(NVIDIA cgroup、ARM SMMU StreamID)。
    • 零拷贝内存池、double-buffer、ping-pong DMA、任务级 preemption(需 NPU 驱动支持)。
  4. 模型级优化:
    • 算子融合、Winograd、稀疏化、INT8 量化、动态 batch=1、layer-wise pipeline。
    • 共享权值、常量折叠、tensor 复用,降低内存带宽 30%–50%。
  5. 性能测试方法:
    • 用 cyclictest + ftrace 测中断延迟;用 perf + NPU PMU 读 MAC 利用率;用 RTL 级仿真拿 WCET。
    • 设计“阶梯并发”用例:逐步叠加模型实例,直到 WCRT>Deadline,记录拐点。
  6. 国产工具链:
    • 华为 ATC/AMCT、地平线 OE、瑞芯 rknn-toolkit2 均支持“多实例分时”与“优先级抢占”开关,需手动开 CONFIG_RTK_NPU_PREEMPT。

答案

“1 TOPS 场景下保证多模型实时”分五步:建模→裁剪→调度→测试→守护。

  1. 建模:把每个模型当成实时任务

    • 用 NPU 厂商 profiler 在最高频率跑 1000 次,取 P99 耗时作为 Ci;同时记录 DDR 带宽峰值 Bi。
    • 根据业务给出 Di(deadline)与 Ti(周期),例如:
      – 人脸检测:C=3 ms,D=10 ms,T=16 ms
      – 语音识别:C=5 ms,D=20 ms,T=33 ms
    • 计算理论利用率 U=∑Ci/Ti=3/16+5/33≈0.34,小于 0.69(RM 上限),理论上可调度。
  2. 裁剪:把 Ci 压到“最坏情况”以下

    • 量化:FP32→INT8,实测 Ci 下降 42%,带宽下降 35%。
    • 算子融合:conv+relu+bn 融合成 single op,减少 kernel launch 12 µs,整体 Ci 再降 8%。
    • 共享权值:两个检测模型 backbone 相同,只跑一次,Ci 合并后下降 30%。
      裁剪后新 Ci 分别为 1.8 ms 与 3.2 ms,U 降至 0.19,留出 60% 余量。
  3. 调度:时间片 + 优先级 + budget 限流

    • 采用“分区时间片”策略:把 16 ms 周期切成 4 ms 片,高优模型可抢占低优。
    • 驱动层打开 CONFIG_RTK_NPU_PREEMPT,设置人脸检测为 RT_PRIO_90,语音为 RT_PRIO_70。
    • 对 DDR 带宽做 QoS:通过 SMMU 配置 2 GB/s 预留,防止语音大 burst 拖慢人脸。
    • 若未来再叠加第三个模型,则启用 EDF 动态调度,内核补丁已合入 Yocto Linux 5.10(国内主流 BSP)。
  4. 测试:用性能测试手段验证“可调度性”

    • 基准测试:单模型跑 24 h,统计 P99 延迟与 MAC 利用率,确认 Ci 无漂移。
    • 并发测试:两模型同时启动,用 ftrace 抓调度事件,计算 WCRT;实测人脸检测 Ri=8.7 ms < 10 ms,语音 Ri=17.5 ms < 20 ms,通过。
    • 压力测试:把 CPU 打满、DDR 占 90%、温度 85 ℃,再跑 4 h,Ri 涨幅 < 5%,满足工业级要求。
    • 稳定性测试:连续 72 h 随机注入 100 µs 中断毛刺,无 deadline miss,记录为测试报告附录。
  5. 守护:上线后持续监控

    • 在 rknn_server 里加 counter:每次调度记录 queuing time 与 exec time,超过 80% deadline 触发告警。
    • 用 Prometheus + Grafana 做可视化,SLA 设置为 Miss Rate < 0.1%。
    • 若业务迭代导致 Ci 增加,则重新跑一遍“建模-裁剪-调度-测试”闭环,确保回归通过再灰度。

通过以上五步,可在 1 TOPS NPU 上同时跑 2–3 个实时模型,且可证明最坏情况仍满足 deadline,回答完毕。

拓展思考

  1. 若 NPU 不支持抢占,只能“协作式”调度,如何改写模型为“微批可中断”?
    答:把大 conv 拆成若干 height-slice,每 slice 执行后检查剩余 budget,主动 yield,测试需用 RTL 级仿真确认 slice 边界耗时。

  2. 当模型动态变化(语音唤醒后加载大模型),如何做“在线准入控制”?
    答:采用 Quick-Sched Test:在新模型加载前计算 ∑Ci/Ti,若 >0.9 则拒绝,并给出建议:降采样率或换小模型。

  3. 国内车规项目要求 ASIL-B,如何给调度器做“安全包”?
    答:把调度器做成双核锁步(Dual-Core Lockstep),用 ECC 保护 SRAM,测试阶段加 100 小时 FIT 应力,最终出具 ISO 26262 的 SEooC 证据包。