3、调度器概述:调度器功能、调度策略(静态/动态)、与CPU/GPU调度的区别

Edge AI NPU(神经网络处理单元)的调度器是连接上层AI应用框架(如TensorFlow Lite、ONNX Runtime、自研推理引擎)与底层NPU硬件执行单元之间的核心软件组件。在边缘计算场景中,NPU不仅要处理来自单个模型的推理请求,还要应对多模型并发、多路视频流分析、传感器数据融合等复杂负载。调度器的设计质量直接决定了NPU的利用率、推理延迟的稳定性以及多任务切换时的系统开销。本章将深入剖析NPU调度器的功能边界、静态与动态调度策略的适用场景,并通过与CPU、GPU调度机制的对比,帮助学员建立对NPU调度器在异构计算体系中独特定位的清晰认知。

Edge AI NPU 调度器功能与策略全景 AI推理框架 (TFLite/ONNX/自研) NPU 调度器 任务队列管理 | 资源分配 优先级决策 | 上下文切换 静态调度 编译期决定 动态调度 运行时决策 NPU 硬件执行资源 MAC阵列 (乘累加单元) 片上SRAM (权重/激活缓存) DMA引擎 (数据搬运) 向量单元 (激活/池化) 控制核 (同步/中断) 静态: 离线分析模型图,固定执行顺序 动态: 在线感知负载,实时调整分配

上图展示了NPU调度器在系统软件栈中的核心位置及其与上下层模块的关系。调度器接收来自AI框架的推理任务,根据预设策略将任务映射到MAC阵列、SRAM、DMA引擎等硬件资源上。静态调度在编译期完成资源分配,动态调度则在运行时根据实时负载进行调整。下面我们将从调度器的功能定义出发,逐步深入策略细节与对比分析。

3.1 调度器功能:不仅仅是任务排队

NPU调度器的功能远不止维护一个先进先出(FIFO)的任务队列。在边缘AI场景中,调度器需要承担以下五项核心职责:

  • 任务接纳与控制:判断新到达的推理请求是否可以被NPU接受,拒绝或延迟超出处理能力的请求,防止系统过载。
  • 资源分配与映射:将计算图(Graph)中的算子(Op)映射到具体的硬件单元。例如,决定卷积操作由MAC阵列执行还是由向量单元执行,以及权重数据在SRAM中的摆放位置。
  • 执行顺序优化:确定多个就绪算子或任务的执行顺序,以最大化数据复用率,减少DMA搬运次数。
  • 优先级管理:支持不同优先级队列,确保实时性要求高的任务(如自动驾驶的障碍物检测)优先获得计算资源。
  • 上下文切换与同步:在多任务交替执行时,保存和恢复硬件状态(如寄存器配置、DMA描述符),并处理任务间的依赖同步。

以一个典型的视频结构化分析场景为例,假设NPU需要同时处理人脸检测(每帧5ms)、车牌识别(每帧8ms)和行人追踪(每帧12ms)三个模型。调度器需要根据帧率要求动态调整三个任务的执行频率,并在SRAM空间不足时,决定哪个模型的权重被换出到外部DDR。这种资源编排能力是调度器价值的直接体现。

3.2 调度策略:静态与动态的权衡

调度策略决定了“何时做决策”以及“决策依据是什么”。在NPU领域,静态调度与动态调度有着明确的适用边界。

3.2.1 静态调度:编译期的全局优化

静态调度发生在模型编译阶段。编译器分析整个计算图,根据算子类型、数据依赖关系、硬件资源容量,预先规划出每个算子的执行时间片、内存地址和DMA传输计划。这种策略的优势在于:

  • 可预测性强:执行路径固定,便于进行最坏情况执行时间(WCET)分析,适合功能安全要求高的场景。
  • 运行时开销低:无需在运行时进行决策,调度器逻辑简单,功耗更低。
  • 全局优化能力:可以跨算子进行内存复用规划,例如将两个连续算子的中间结果存放在同一块SRAM区域。

然而,静态调度的缺点同样明显:它无法应对运行时的负载变化。如果两个模型同时被加载,静态调度器无法动态调整其中一个模型的执行频率,只能按照编译时的固定时间片轮转,可能导致低优先级任务占用过多资源。

3.2.2 动态调度:运行时的实时响应

动态调度器在推理请求到达时,根据当前NPU的负载状态、任务优先级、剩余资源量等因素,实时决定任务的执行顺序和资源分配。其核心机制包括:

  • 事件驱动:当DMA传输完成或算子执行完毕时,触发调度器重新评估就绪队列。
  • 优先级抢占:高优先级任务可以中断低优先级任务的执行,保存现场后优先处理紧急请求。
  • 负载感知:监控MAC阵列利用率、SRAM占用率,动态调整批处理大小(Batch Size)以平衡吞吐与延迟。

动态调度的代价是运行时开销增加。每次调度决策都需要消耗几十到几百个时钟周期,且需要额外的硬件支持(如中断控制器、任务状态寄存器)。在极端情况下,频繁的上下文切换可能导致性能反而低于静态调度。

对比维度 静态调度 动态调度
决策时机 编译期 运行时
运行时开销 极低(几乎为零) 较高(每次决策需数十周期)
负载适应性 差,无法应对突发负载 强,可实时调整资源分配
可预测性 高,适合安全关键系统 低,存在抖动风险
典型应用 固定模型、固定输入尺寸的工业检测 多模型并发、输入动态变化的智能摄像头
工程经验:在实际Edge AI产品中,常采用“静态为主、动态为辅”的混合策略。例如,对于主模型使用静态调度保证基础帧率,对于偶发的辅助模型(如语音唤醒)使用动态调度按需插入。这种设计既保证了核心任务的稳定性,又保留了灵活性。

3.3 与CPU/GPU调度的本质区别

理解NPU调度器与CPU、GPU调度器的区别,有助于避免将通用操作系统的调度经验错误地套用到NPU上。三者的核心差异体现在任务粒度、同步机制和资源模型三个方面。

3.3.1 任务粒度:从微秒到毫秒的跨度

CPU调度器管理的是线程或进程,时间片通常在1-10毫秒级别,切换开销约几微秒。GPU调度器管理的是线程块(Thread Block)或波前(Wavefront),粒度在微秒级,但依赖硬件调度器进行快速切换。NPU调度器管理的则是完整的算子或子图,单个算子的执行时间从几十微秒到几毫秒不等。NPU调度器无法像CPU那样频繁抢占,因为NPU的MAC阵列一旦开始计算,中断当前操作需要排空流水线,代价极高。

3.3.2 同步机制:隐式依赖与显式屏障

CPU和GPU通过锁、原子操作或内存屏障进行同步。NPU则更依赖数据流依赖关系。调度器通过分析计算图的有向无环图(DAG),确定哪些算子可以并行执行,哪些必须等待前驱算子完成。NPU通常没有复杂的缓存一致性协议,同步主要依靠DMA完成中断和硬件信号量。

3.3.3 资源模型:通用计算单元与专用加速器

CPU和GPU的资源是同构的(多个相同核心),调度器只需决定任务分配到哪个核心。NPU的资源是异构的:MAC阵列擅长矩阵乘法,向量单元擅长激活函数,DMA引擎负责数据搬运。调度器必须考虑数据在SRAM中的布局,避免MAC阵列等待数据而空闲。这种“数据搬运与计算重叠”的优化是NPU调度器独有的挑战。

案例拆解:智能相机的多任务调度困境
某智能相机需要同时运行1080p@30fps的物体检测模型(模型A)和720p@15fps的人脸识别模型(模型B)。NPU的SRAM容量为2MB,模型A需要1.5MB权重,模型B需要0.8MB权重,无法同时驻留。
初始方案:采用静态调度,将两个模型按时间片交替执行。每个时间片切换时,需要将当前模型的权重换出,加载另一个模型的权重。实测发现,DMA换入换出耗时约3ms,导致模型A的帧率从30fps降至22fps。
优化过程:调度器改为动态策略,检测到模型A的输入帧率稳定在30fps,而模型B的请求是突发性的(平均每秒仅5次)。调度器将模型A设为常驻SRAM,模型B的权重压缩后存放在外部DDR。当人脸识别请求到达时,动态调度器暂停模型A的执行,仅加载模型B的0.8MB权重(耗时1.2ms),执行完毕后立即恢复模型A。通过这种“按需加载”策略,模型A的帧率恢复至28fps,模型B的响应时间从原来的15ms降至8ms。
复盘要点:静态调度适合资源充足且负载稳定的场景;当资源紧张且负载波动明显时,动态调度虽然增加了决策开销,但通过避免不必要的权重换入换出,反而提升了整体效率。关键教训是:调度策略的选择必须基于实际负载特征,而非理论上的优劣。

3.4 常见误区与设计建议

在NPU调度器的设计与使用中,以下误区值得警惕:

  • 误区一:认为动态调度总是优于静态调度。实际上,动态调度的决策开销和不可预测性在实时性要求极高的场景中可能是致命的。
  • 误区二:忽略数据搬运的调度。很多初学者只关注计算单元的分配,却忽视了DMA传输的调度。实际上,NPU的瓶颈往往在数据搬运而非计算。
  • 误区三:将CPU的优先级抢占机制直接移植到NPU。NPU的上下文切换代价远高于CPU,频繁抢占可能导致流水线排空,性能断崖式下降。
风险提示:在安全关键领域(如医疗设备、自动驾驶)使用动态调度时,必须提供形式化验证或至少进行充分的压力测试,证明在所有可能的输入序列下,调度器都不会产生死锁或优先级反转。否则,建议采用静态调度并辅以离线WCET分析。