课程导入:TinyML多模型调度的背景、挑战与学习目标
边缘人工智能的工程实践正在经历一场深刻的范式转移。早期的TinyML部署通常遵循"单设备、单模型、单任务"的简单模式——一个微控制器上只烧录一个人体感应模型,或者只运行一个关键词唤醒模型。然而,真实的物联网产品几乎从不如此单纯:一台智能家居中控需要同时处理语音唤醒、人脸识别、环境异常检测;一套工业预测性维护系统要在同一颗MCU上运行振动频谱分析、温度趋势预测和电流谐波检测;一副TWS耳机更是要并行处理语音增强、入耳检测、佩戴状态识别和触控指令分类。当多个推理任务共享同一颗算力有限、内存以KB计、功耗预算以mW计的MCU时,一个全新的工程问题浮出水面——多模型调度。本章作为整个课程的开篇,将系统梳理多模型调度的产生背景、核心挑战与学习路径,为后续章节的周期设计、优先级策略和资源编排奠定认知基础。
一、为什么需要多模型调度:从单任务到多任务的必然演进
理解多模型调度的必要性,首先要看清嵌入式AI产品形态的演变逻辑。早期的智能硬件功能单一,例如只做关键词唤醒的语音芯片,或者只做跌倒检测的穿戴设备。这种单模型部署的工程范式相对简单:开发者只需要关注单个模型的推理延迟、内存占用和功耗,通过模型量化、算子优化等手段即可满足需求。然而,市场竞争和用户体验的持续升级,推动产品功能从"单一智能"走向"复合智能"。
以一款现代智能门锁为例,其内部MCU需要同时运行:指纹识别模型(事件触发型)、人脸检测模型(周期性扫描)、防撬震动检测模型(高频采样)、低电量预测模型(低频运行)、以及本地日志分类模型(后台任务)。这五个模型具有完全不同的触发方式、周期要求和优先级属性。如果沿用单模型的串行思维——每次只运行一个模型,其他模型等待——会导致严重的问题:当人脸检测模型占用CPU时,震动检测模型无法及时响应,可能错过撬锁事件;当指纹识别模型加载到内存时,其他模型的权重被挤出SRAM,导致频繁的Flash读取,功耗飙升。
多模型调度的本质,是在一个资源极度受限的MCU上,通过合理的时序安排和资源分配,让多个推理任务在满足各自实时性要求的前提下协同工作。这不再是简单的"把多个模型塞进一颗芯片",而是需要一套系统化的调度策略,类似于RTOS中的任务调度,但又有其独特的约束——每个"任务"是一个完整的神经网络推理过程,具有不可抢占性(推理中途切换代价极高)、内存需求动态变化(中间张量随层变化)、以及执行时间高度不确定(依赖输入数据)等特征。
二、多模型调度的核心挑战:四重资源博弈
在MCU上实现多模型调度,面临的挑战远比服务器端的任务调度更为严峻。我们可以将挑战归纳为四个维度,每个维度都对应着独特的工程难点。
| 挑战维度 | 具体表现 | 典型后果 | 调度应对思路 |
|---|---|---|---|
| 算力竞争 | 多个推理任务争抢CPU周期,推理延迟相互影响 | 高优先级任务被低优先级任务阻塞,错过截止时间 | 周期分配、优先级抢占、时间片轮转 |
| 内存竞争 | 模型权重、中间张量、激活值争抢有限的SRAM | 频繁的Flash读取(权重换入换出),功耗剧增 | 内存分区、权重驻留策略、张量复用 |
| 功耗耦合 | 推理任务的高频执行导致平均功耗超标 | 电池续航缩短,热约束失效 | 动态频率调节、任务合并、低功耗模式切换 |
| 时序不确定性 | 推理时间随输入数据变化(如不同尺寸的目标检测) | 最坏情况执行时间(WCET)难以估算,调度分析失真 | 保守WCET估计、弹性调度、超时保护 |
算力竞争是最直观的挑战。假设一颗Cortex-M4内核运行在200MHz,峰值算力约为200 MOPS(百万次操作/秒)。一个典型的1D卷积语音唤醒模型需要约5 MOPS,一个轻量级人脸检测模型需要约40 MOPS,一个振动频谱分析模型需要约15 MOPS。如果三个模型都以100ms为周期运行,总算力需求为(5+40+15)×10 = 600 MOPS,远超MCU的200 MOPS供给。此时必须通过调整周期(如将人脸检测降到500ms周期)或优化模型结构来平衡负载。
内存竞争则更为隐蔽。一个300KB的模型权重无法全部驻留在256KB的SRAM中,调度器必须决定何时将哪个模型的权重从Flash加载到RAM。每次权重换入换出不仅消耗时间(Flash读取速度远低于SRAM),还消耗能量。如果调度策略不当,频繁的权重交换可能让整体功耗增加3-5倍,直接摧毁产品的续航优势。
三、多模型调度的核心原理:周期、优先级与资源编排
多模型调度的理论根基可以追溯到实时系统的经典调度理论,但需要针对神经网络推理的特性进行适配。其核心原理可以概括为三个层面:时间维度的周期与截止时间管理、空间维度的内存与权重编排、以及能量维度的功耗预算分配。
在时间维度上,每个推理任务被抽象为一个周期性或事件触发的实时任务,具有三个关键参数:周期(Period)、执行时间(Execution Time)和截止时间(Deadline)。调度器的核心任务,是确定每个任务的执行顺序和时机,使得所有任务都能在截止时间前完成。常用的调度算法包括:速率单调调度(RMS,Rate Monotonic Scheduling)——周期越短的任务优先级越高;最早截止时间优先(EDF,Earliest Deadline First)——截止时间越近的任务越先执行;以及固定优先级抢占调度——为每个任务分配固定的优先级,高优先级任务可以抢占低优先级任务。
在空间维度上,调度器需要管理模型权重在SRAM中的驻留策略。由于SRAM容量有限,不可能同时加载所有模型的权重。常见的策略包括:静态分区——为每个模型划分固定的内存区域,互不干扰;动态共享——根据当前执行的任务动态加载权重,执行完毕后释放;混合策略——高频任务权重常驻,低频任务按需加载。内存编排的目标是在满足性能要求的前提下,最小化Flash到SRAM的传输次数。
在能量维度上,调度器需要将功耗预算分配到各个任务。MCU通常支持多种工作频率和低功耗模式。调度器可以根据当前任务负载动态调整CPU频率——当多个高负载任务同时到达时,提升频率以加速处理;当只有低频任务运行时,降低频率或进入深度睡眠。这种动态电压频率调节(DVFS)策略,可以在满足实时性的同时最大化能效。
四、案例拆解:智能家居中控的多模型调度设计
为了将抽象的原理具象化,我们以一个典型的智能家居中控设备为例,完整拆解多模型调度的设计过程。该设备基于STM32H743 MCU(Cortex-M7 @ 480MHz,1MB SRAM),需要运行四个模型:语音唤醒(VWW)、人脸识别(FaceID)、环境异常检测(Anomaly)和用户习惯学习(Habit)。
初始现象与约束:产品原型采用最简单的串行调度——主循环依次执行四个模型,每个模型执行完毕后返回主循环。实测发现三个严重问题:① 语音唤醒延迟高达800ms,用户需要反复喊唤醒词;② 人脸识别时系统功耗飙升至120mW,超过50mW的预算;③ 环境异常检测的响应时间不稳定,有时长达2秒,无法满足安防要求。
关键输入数据:通过性能分析工具(如STM32CubeMonitor)采集各模型的执行时间和内存占用:
模型名称 周期要求 平均执行时间 最大执行时间 权重大小 峰值内存
语音唤醒(VWW) 50ms 8ms 12ms 180KB 45KB
人脸识别(FaceID) 500ms 120ms 180ms 420KB 120KB
异常检测(Anomaly) 200ms 25ms 40ms 95KB 30KB
习惯学习(Habit) 5000ms 60ms 90ms 150KB 50KB
分析判断过程:首先计算CPU利用率。以最大执行时间计算,四个模型在各自周期内的CPU占用率分别为:VWW 24%(12/50)、FaceID 36%(180/500)、Anomaly 20%(40/200)、Habit 1.8%(90/5000)。总利用率为81.8%,看似在可行范围内。但问题在于串行调度没有优先级概念——当FaceID执行时(最长180ms),VWW完全被阻塞,导致唤醒延迟远超50ms的周期要求。同时,FaceID的420KB权重加上120KB中间张量,总计540KB,加上其他模型的内存需求,总内存需求超过1MB SRAM容量,导致频繁的Flash换入换出。
实际操作步骤:
- 优先级分配:根据RMS原则,周期越短优先级越高。VWW周期50ms,分配最高优先级P1;Anomaly周期200ms,分配P2;FaceID周期500ms,分配P3;Habit周期5000ms,分配P4。采用固定优先级抢占调度。
- 内存分区优化:VWW权重180KB常驻SRAM(因为它最高频);Anomaly权重95KB常驻;FaceID权重420KB按需加载——仅在需要执行时从Flash加载,执行完毕后释放;Habit权重150KB同样按需加载。这样常驻内存为180+95+45+30=350KB,加上系统开销约100KB,总计450KB,远低于1MB容量。
- 功耗优化:当只有VWW和Anomaly运行时(无人在场),CPU频率降至240MHz,满足算力需求且功耗降低40%;当FaceID被触发(有人靠近),频率提升至480MHz,确保180ms内完成推理。
- 超时保护:为每个任务设置最大执行时间看门狗,若FaceID执行超过200ms(异常输入),强制终止并降级为"检测失败"处理,避免阻塞后续任务。
结果对比:优化后,VWW唤醒延迟稳定在15ms以内(满足50ms周期);FaceID推理期间,VWW最多被阻塞12ms(可接受);系统平均功耗从120mW降至45mW;Anomaly响应时间稳定在40ms以内。所有指标均满足设计要求。
风险与代价:FaceID的按需加载策略引入了额外的Flash读取延迟(约30ms),导致FaceID的端到端延迟从180ms增加到210ms,但仍在500ms周期内。此外,动态频率切换需要额外的稳压器响应时间(约5μs),在切换瞬间可能有短暂的性能波动。
复盘经验:① 优先级分配必须基于周期而非任务重要性——语音唤醒虽然"简单",但周期短,必须最高优先级;② 内存驻留策略要区分高频和低频任务,不能一刀切;③ 功耗优化要结合任务负载动态调整,而不是固定频率;④ 超时保护是必须的,因为神经网络推理时间具有不确定性。
五、常见误区与总结复盘
在多模型调度的学习与实践中,初学者容易陷入几个典型误区,这里逐一澄清。