4. 边缘AI功耗测量方法与工具

在STM32N6这类带NPU的边缘AI芯片上,功耗不是一个静态数字,而是随推理阶段剧烈波动的曲线。一次YOLO类模型推理可能包含权重加载、卷积密集计算、NPU与CPU协同、DMA搬运、外设唤醒等多个阶段,电流在几十微秒内就能从十几毫安跳到几百毫安。因此,功耗优化的第一步不是改代码,而是建立一套可重复、可对齐、可积分的测量环境。本节围绕四类工具和一条GPIO打点信号链,说明如何把“电流波形”与“代码阶段”对应起来,并最终算出每次推理的能耗。

一、四类测量手段的定位与选择

边缘AI功耗测量工具可以按“测什么、精度、带宽、是否与代码对齐”四个维度区分。电流探头配合示波器,带宽可达MHz级,适合观察NPU突发电流的瞬态形状;功耗分析仪(如Otii、Joulescope、Nordic PPK2等)内置高精度ADC和积分功能,适合长时间记录与自动算能耗;STM32CubeMonitor-Power通过STM32的片上电流测量电路或外部板,把电流、电压、功耗实时可视化,并与MCU运行状态关联;GPIO打点则是在代码关键位置翻转一个空闲引脚,用示波器或逻辑分析仪记录时间戳,把软件阶段“翻译”成硬件可测的电平跳变。

实际工程中通常组合使用:GPIO打点提供时间基准,电流探头或功耗分析仪提供电流波形,STM32CubeMonitor-Power提供长时间趋势与平均功耗,最后用能耗积分把两者合成“每次推理消耗多少毫焦”。

STM32N6 边缘AI功耗测量信号链 被测对象 STM32N6 + NPU VDD / VDDIO 供电轨 推理任务循环运行 GPIO 打点引脚 PA0 电流采集 分流电阻 10 mΩ 或 电流探头钳位 带宽 ≥ 1 MHz 量程覆盖 1 mA~500 mA 采集与分析 示波器 / 功耗分析仪 采样率 ≥ 100 kS/s 同步记录 GPIO 电平 CubeMonitor-Power 趋势 能耗结果 I(t) 波形 阶段时间戳 E = ∫U·I dt mJ / 次推理 GPIO 打点信号链(软件阶段 → 硬件时间戳) 推理开始 PA0 = 1 NPU 计算 PA1 = 1 DMA 搬运 PA2 = 1 后处理 PA3 = 1 推理结束 PA0 = 0 能耗积分与阶段归属 E_total = Σ U × I(t) × Δt 按采样点累加,单位 mJ E_NPU = ∫ I(t) dt(PA1 高电平区间) 阶段能耗 = 区间积分 对比不同模型 / 频率 / 电压 同一打点框架下可重复

二、GPIO打点:把代码阶段变成可测时间戳

GPIO打点的核心是“进入阶段拉高、离开阶段拉低”,并且所有打点引脚尽量在同一GPIO端口,便于一次性读取。以STM32N6为例,可选PA0~PA3作为四个阶段的标记。打点代码要尽量短,避免引入额外开销:

// 阶段打点宏:直接操作 BSRR,避免读改写
#define MARK_NPU_ON()   (GPIOA->BSRR = GPIO_BSRR_BS0)
#define MARK_NPU_OFF()  (GPIOA->BSRR = GPIO_BSRR_BR0)
#define MARK_DMA_ON()   (GPIOA->BSRR = GPIO_BSRR_BS1)
#define MARK_DMA_OFF()  (GPIOA->BSRR = GPIO_BSRR_BR1)

void run_inference_once(void) {
    MARK_NPU_ON();
    npu_infer();          // NPU 计算阶段
    MARK_NPU_OFF();

    MARK_DMA_ON();
    dma_copy_output();    // 输出搬运阶段
    MARK_DMA_OFF();
}

打点后,用示波器同时观察PA0和电流波形。若PA0上升沿与电流上升沿之间存在固定延迟,说明探头或线路存在传播延迟,需要在时间轴上做补偿。判断打点是否有效的标准是:同一阶段重复运行100次,打点脉宽的标准差应小于平均脉宽的5%;若抖动过大,通常是中断抢占或Cache未命中导致,需要先稳定执行环境再测功耗。

三、电流探头与功耗分析仪的接线要点

用电流探头测量时,探头钳在VDD供电线上,注意钳口方向要与电流流向一致,否则波形会反相。若使用分流电阻,建议选10 mΩ、1%精度、低温漂的金属膜电阻,并在其两端用差分探头测量,避免地线环路引入噪声。功耗分析仪通常串联在电源与目标板之间,其内部采样率决定了能捕捉到的最短脉冲:若NPU突发只有20 μs,采样率至少需要100 kS/s以上,否则峰值会被平均掉。

STM32CubeMonitor-Power适合做长时间趋势观察。它可以通过STM32的片上电流测量电路读取电流,也可以配合外部板卡。使用时先设置采样周期,例如1 ms,再运行推理循环,观察平均电流和峰值电流。它的优势是能直接显示“运行—空闲—低功耗”三种状态的比例,但时间分辨率不如示波器,因此适合做宏观功耗画像,而不是瞬态分析。

四、能耗积分:从波形到mJ

能耗积分的基本公式是 E = ∫U·I(t)dt。在数字采集系统中,离散化为 E ≈ Σ U × I(k) × Δt。若供电电压稳定在3.3 V,可简化为 E ≈ 3.3 × Σ I(k) × Δt。以一次推理为例,假设采样间隔Δt = 10 μs,NPU阶段持续2 ms,该阶段平均电流120 mA,则E_NPU ≈ 3.3 × 0.12 × 0.002 = 0.792 mJ。若DMA阶段持续0.5 ms、平均电流40 mA,则E_DMA ≈ 3.3 × 0.04 × 0.0005 = 0.066 mJ。整次推理能耗约为0.858 mJ(示例计算,非实测值)。

为了让测量可重复,需要固定以下条件:供电电压与温度、系统时钟与NPU频率、模型与输入张量、Cache与内存布局、打点引脚与探头位置。每次测量前先跑10次预热,再连续采集100次取平均,同时记录最大值和最小值。若最大值与平均值偏差超过20%,说明存在偶发中断或DMA冲突,应先排查再用于优化对比。

建议把“打点引脚定义、探头型号、分流电阻值、采样率、电压、温度、模型版本”记录成一张测量配置表,每次优化前后都按同一张表执行,否则功耗数据无法横向比较。

五、可重复测量环境的搭建清单

  • 硬件:STM32N6板、可调直流电源、10 mΩ分流电阻或电流探头、示波器(≥100 MHz,≥100 kS/s)、功耗分析仪、逻辑分析仪。
  • 软件:STM32CubeIDE工程、GPIO打点宏、推理循环、CubeMonitor-Power配置、示波器截图与CSV导出。
  • 对齐:PA0标记推理开始,PA1标记NPU,PA2标记DMA,PA3标记后处理;所有打点在同一端口,便于逻辑分析仪一次抓取。
  • 积分:用示波器CSV或功耗分析仪导出I(t),在脚本中按阶段区间做Σ I·Δt,输出每次推理的mJ值。
  • 复现:固定电压3.3 V、室温25 ℃、NPU频率400 MHz、模型与输入不变,预热10次后采集100次。

当这套环境稳定后,后续的功耗优化才有可信的“尺子”。无论是降低NPU频率、调整DMA突发长度,还是让CPU在NPU计算时进入WFI,都可以用同一套打点与积分流程量化收益。测量本身不产生优化,但它决定了优化是否可验证、可复现、可比较。