在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、前言思考

1.1 AI 与续航的矛盾

端侧 AI 是"常驻型"能力:语音助手随时待命、健康监测 7×24 采样、AR 场景持续推理。AI 功能用得越深,手机掉电越快。据实测,一次 13B 大模型推理可让机身温度上升 5℃、掉电 2%。

AI 功耗优化不是"关掉 AI",而是用最少的能耗完成同样的智能

  • NPU 比 CPU 能效高 10~50 倍,但调用不当也会空耗;
  • 推理频率不匹配业务需求,就是浪费;
  • 模型反复加载、反复预热,都是隐性耗电。

1.2 功耗优化的核心指标

指标 含义 优化方向
单次推理能耗 一次推理消耗的毫瓦秒 异构调度、量化、批处理
待机功耗 无任务时的驻留功耗 模型缓存、唤醒控制、DSP 常驻
峰值功耗 推理瞬间最大功率 频率调节、任务错峰
温度 连续推理的温升 降频、间歇推理

二、底层原理

2.1 NPU/CPU 异构调度的功耗模型

不同硬件执行同一模型,能效差异巨大:

硬件 能效比(推理同等任务) 特点
NPU 10~50× 矩阵计算极高效,动态形状差
GPU 3~8× 并行度高,内存占用大
CPU 通用,动态算子支持好

调度策略:能上 NPU 的算子全上 NPU,NPU 消化不了的(动态形状、控制流)再给 CPU。异构调度的另一层含义是频率协同:NPU 满负荷时 CPU 降频,避免两路同时全速导致峰值功耗爆炸。

2.2 DVFS 动态频率调节

DVFS(Dynamic Voltage and Frequency Scaling):根据负载动态调整处理器频率。

推理开始 → 负载评估 → 频率档位选择 → 执行 → 完成后降回低档
负载类型 频率策略
突发单次推理 中频即可,避免升频开销
持续流式推理 升到目标频率并锁定,避免频繁升降
待机监听 最低频,唤醒词模型在 DSP
后台预加载 最低频慢慢算,不抢前台资源

2.3 推理批处理

把多个小任务合并为一次推理,减少模型启动/预热开销:

单条处理: 预热(50ms) + 推理(10ms) + 清理(30ms) = 90ms/task × N
批量处理: 预热(50ms) + 推理(10ms×N 共享权重) + 清理(30ms) ≈ 10ms/task

适合批处理的场景:相册人脸分组(几百张一次)、批量 OCR、批量分类。

2.4 模型缓存低功耗

缓存维度 做法 省电效果
权重驻留 高频模型常驻内存,不反复加载 省加载功耗
预热结果 冷启动预热一次,后续直接用 省首推功耗
结果缓存 相同输入直接返回缓存结果 零推理功耗
模型休眠 长时间未用 → 卸载/进入休眠 省驻留功耗

三、实战落地

3.1 NPU 优先 + 频率控制

import { mindSporeLite } from '@kit.MindSporeLite';
import { powerManager } from '@kit.PowerManagerKit';

// 1. 推理前锁定 NPU 优先
const context = new mindSporeLite.Context();
context.arch = mindSporeLite.ARCH_TYPE.NPU;
context.deviceList = [mindSporeLite.DeviceType.NPU];

// 2. 长任务前申请高负载模式(短任务不要申请!)
if (taskIsHeavy) {
  powerManager.applyLoadMode({ mode: powerManager.LoadMode.HIGH, timeoutMs: 5000 });
}

// 3. 推理
const model = await loadModel(context);
const output = model.predict([input]);

// 4. 完成后立即释放(重要!)
powerManager.resetLoadMode();
model.free();

3.2 推理批处理队列

// 批处理队列:合并 200ms 内的任务
class BatchInferQueue {
  private queue: any[] = [];
  private timer: number = 0;

  push(task: any): void {
    this.queue.push(task);
    if (this.timer === 0) {
      this.timer = setTimeout(() => this.flush(), 200);
    }
  }

  private async flush(): Promise<void> {
    const batch = this.queue;
    this.queue = [];
    this.timer = 0;
    if (batch.length === 0) return;

    // 一次推理处理整批
    const inputs = batch.map(t => preprocess(t.data));
    const outputs = await model.predictBatch(inputs);  // 共享权重
    for (let i = 0; i < batch.length; i++) {
      batch[i].resolve(outputs[i]);
    }
  }
}

3.3 结果缓存(零功耗命中)

// 相同输入直接命中缓存,不做推理
const cache = new LRUCache<string, string>({ capacity: 100 });

function inferWithCache(input: string): string {
  const hash = sha256(input);
  if (cache.has(hash)) {
    return cache.get(hash);   // 零推理功耗
  }
  const result = model.predict([input]);
  cache.set(hash, result);
  return result;
}

适合缓存:翻译相同句子、文档分类相同段落、图片缩略图识别。

3.4 模型驻留与休眠策略

// 引用计数管理驻留
let refCount = 0;
const idleTimer = { timeout: 0 };

function acquireModel() {
  refCount++;
  if (refCount === 1) {
    // 首次使用才真正加载
    model.load();
  }
}

function releaseModel() {
  refCount--;
  if (refCount === 0) {
    // 30分钟未使用进入休眠(释放NPU内存)
    idleTimer.timeout = setTimeout(() => {
      if (refCount === 0) model.sleep();  // 休眠而非直接卸载,保留热启动能力
    }, 30 * 60 * 1000);
  }
}

四、性能排查与优化

问题 表现 优化手段
推理发热 连续推理温升快 间歇推理、频率上限、批处理降低总时长
待机耗电 不用 AI 也掉电 检查模型是否常驻、监听是否过度
峰值过高 触发系统限流 错峰调度(避开其他高负载任务)
空转浪费 NPU 利用率低 检查算子是否回退、批处理不足
反复预热 每次首推慢 启动预热、结果缓存

4.1 功耗监测方法

import { powerManager } from '@kit.PowerManagerKit';

// 推理前后功耗对比
const before = await powerManager.getBatteryStats();
const t0 = Date.now();
await model.predict([input]);
const elapsed = Date.now() - t0;
const after = await powerManager.getBatteryStats();

const energyMwS = (after.powerMw - before.powerMw) * elapsed / 1000;
LoggerUtil.info(TAG, '单次推理能耗: ' + energyMwS.toFixed(2) + ' mW·s');

4.2 温度感知降频

// 温度超过阈值自动降级(量化模型或降低帧率)
function onTemperatureRise(temp: number) {
  if (temp > 42) {
    setInferMode('int8');       // 切量化模型
    reduceFrameRate(15);        // 降推理频率
  } else if (temp < 38) {
    setInferMode('fp16');       // 恢复精度
  }
}

五、总结

  1. AI 功耗优化的总原则:用最少的能耗完成同样的智能,不是关掉 AI。
  2. 异构调度 + DVFS 是硬件层手段:NPU 优先、频率跟随负载。
  3. 批处理 + 缓存是软件层手段:合并任务、命中缓存,直接从源头消灭能耗。
  4. 工程落地要监测闭环:推理前后功耗对比、温度感知降频、驻留引用计数。

一句话记住:NPU 优先省能耗,批处理缓存灭空闲,温度感知保体验。


🚀 演示功能优化(随项目同步更新)

本文对应的 ArkTS 演示页面已随项目整体优化,主要改进:

  1. 独立主题风格:节能深绿 · 暗色面板数据条,与其余章节演示页明显区分,不再千篇一律。
  2. 步骤回放动画:点击演示按钮后,结果行按 260~320ms/步 逐步展示,模拟真实推理过程。
  3. 运行态保护:演示过程中按钮置灰防重复触发,页面退出自动清理定时器。
  4. 结果摘要:演示结束后自动给出「一句话结论」,并 Toast 提示完成。
  5. AI 对话演示:新增 AiChatDemo(根目录 main.py 的 ArkTS 移植),真实 SSE 流式大模型请求,首页「★ AI Chat 流式对话演示」可进入。

对应页面:entry/src/main/ets/pages/AiPowerDemo.ets


🧪 演示优化:真实 AI 推理接入(v3)

本演示页顶部新增 AI 功耗医生主卡,点击即真实调用云端大模型(SSE 流式),不再是纯模拟回放:

  • 请求链路utils/AiClient.ets(ArkTS 封装 OpenAI 兼容接口)→ POST https://api-ai.gitcode.com/v1/chat/completions,模型 deepseek-ai/DeepSeek-V4-Flash,流式 stream: true
  • 演示场景:耗电分析 / CPU/NPU 协同 / 低功耗模式 —— 每个场景绑定不同功耗专家 Prompt,返回内容各有差异
  • 交互体验:进入页面自动触发一次真实推理;点场景标签切换并重新请求;按钮手动触发;输出区打字机流式展示
  • 真实标识:卡片右上角 LIVE 徽标 + 端点/模型名水印,保证"所见即所调"
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐