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

一、前言思考

1.1 AI 功能"能跑"和"跑得好"是两回事

很多 AI 功能 Demo 阶段很惊艳,上线后口碑崩盘——因为只验证了"能不能跑",没验证"跑得好不好":

  • 离线翻译准,但每次要等 3 秒 → 用户弃用;
  • 图片识别准,但内存暴涨 → 杀后台、重启、闪退;
  • 语音助手灵敏,但手机发烫掉电 → 用户关掉功能。

AI 应用上线前必须建立可量化的评测体系,用数据说话,而不是"我觉得还行"。

1.2 四维评测指标

维度 指标 影响
延迟 首 token 延迟、单次推理延迟、P95 用户体验
内存 峰值内存、驻留内存、碎片 稳定性
功耗 单次推理能耗、温度、待机功耗 续航
准确率 Top1/Top5、CER/WER、F1 核心价值

四维互相制约:提高准确率(更大模型)→ 延迟和内存上升;追求低延迟(量化)→ 准确率微降。评测体系的目的是在四维之间找到业务可接受的平衡点

二、底层原理

2.1 延迟评测

延迟分两类,都要测:

端到端延迟(用户感知):
  输入 → 预处理 → 推理 → 后处理 → UI刷新

细分打点:
  ├─ 预处理耗时 (图像缩放/音频采样)
  ├─ 模型加载耗时 (首次/冷启动)
  ├─ 推理耗时 (NPU/CPU 执行)
  ├─ 后处理耗时 (NMS/解码)
  └─ UI 刷新耗时

统计口径:

  • P50:典型体验;
  • P95/P99:最差体验(卡顿场景);
  • 首次 vs 稳定:冷启动与预热后差异。

2.2 内存评测

模型加载前 基线内存
模型加载后 加载增量 (模型权重驻留)
推理峰值   峰值增量 (中间张量)
推理结束   释放后剩余 (驻留/泄漏判定)

关键指标:峰值内存(决定会不会 OOM)和驻留内存(决定多任务共存)。

2.3 功耗评测

单次推理能耗 = 平均功率 × 耗时
  = (P_end - P_start) × t / 1000 (mW·s)

连续推理温升: 记录推理 10 分钟后的机身温度
待机功耗: 模型驻留但无任务时的功耗

2.4 准确率评测

不同任务的指标不同:

任务 指标
图像分类 Top1 / Top5 准确率
目标检测 mAP(各类别平均精度)
OCR 字符错误率 CER、行准确率
语音识别 词错误率 WER
翻译/生成 BLEU / 人工评估
声纹 等错误率 EER(FAR/FRR 交叉点)

评测数据集必须与线上分布一致,否则测了白测。

三、实战落地

3.1 基准测试框架(Benchmark)

import { performance } from '@kit.PerformanceAnalysisKit';

interface BenchCase {
  name: string;
  input: any;
  expected?: string;
  iterations: number;
}

class AiBenchmark {
  private results: Map<string, BenchResult> = new Map();

  async run(cases: BenchCase[]): Promise<void> {
    for (const c of cases) {
      // 预热
      await this.predictOnce(c.input);
      await sleep(200);

      // 正式测试 N 次
      const latencies: number[] = [];
      let peakMem = 0;
      for (let i = 0; i < c.iterations; i++) {
        const t0 = performance.getTime();
        const out = await this.predictOnce(c.input);
        latencies.push(performance.getTime() - t0);
        peakMem = Math.max(peakMem, getCurrentMemory());
      }
      this.results.set(c.name, this.summarize(latencies, peakMem));
    }
  }

  private summarize(lat: number[], peakMem: number): BenchResult {
    lat.sort((a, b) => a - b);
    return {
      p50: lat[Math.floor(lat.length * 0.5)],
      p95: lat[Math.floor(lat.length * 0.95)],
      avg: lat.reduce((a, b) => a + b, 0) / lat.length,
      peakMemMB: peakMem / 1024 / 1024
    };
  }
}

3.2 A/B 性能对比(模型迭代)

// 新模型 vs 旧模型, 四维对比
interface ModelCompareRow {
  metric: string;
  v1: string;   // 旧模型
  v2: string;   // 新模型
  delta: string;
}

function compareModels(v1: BenchResult, v2: BenchResult): ModelCompareRow[] {
  return [
    { metric: 'P50 延迟(ms)', v1: v1.p50.toFixed(1), v2: v2.p50.toFixed(1),
      delta: deltaPct(v1.p50, v2.p50) },
    { metric: 'P95 延迟(ms)', v1: v1.p95.toFixed(1), v2: v2.p95.toFixed(1),
      delta: deltaPct(v1.p95, v2.p95) },
    { metric: '峰值内存(MB)', v1: v1.peakMemMB.toFixed(1), v2: v2.peakMemMB.toFixed(1),
      delta: deltaPct(v1.peakMemMB, v2.peakMemMB) },
    { metric: '准确率(%)', v1: '92.1', v2: '93.4', delta: '+1.3%' }
  ];
}

function deltaPct(a: number, b: number): string {
  const d = ((b - a) / a * 100).toFixed(1);
  return (parseFloat(d) > 0 ? '+' : '') + d + '%';
}

3.3 功耗评测打点

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

async function measureInferencePower(infer: () => Promise<void>): Promise<number> {
  const start = await powerManager.getBatteryStats();
  const t0 = Date.now();
  await infer();
  const elapsed = Date.now() - t0;
  const end = await powerManager.getBatteryStats();

  // 单次推理能耗 (mW·s)
  return (end.powerMw - start.powerMw) * elapsed / 1000;
}

// 连续推理温升
async function measureThermal(iterations: number): Promise<{ start: number, end: number }> {
  const start = await getCpuTemp();
  for (let i = 0; i < iterations; i++) { await inferOnce(); }
  const end = await getCpuTemp();
  return { start, end };
}

3.4 回归检测(CI 门禁)

// 每次模型发布前自动跑基准, 超阈值拦截
async function regressionGate(): Promise<boolean> {
  const baseline = loadBaseline('latest');    // 上次发布基线
  const current = await runFullBenchmark();   // 本次结果

  const gates = [
    { name: '延迟', cur: current.p95, base: baseline.p95, limit: 1.15 },  // +15% 封顶
    { name: '内存', cur: current.peakMemMB, base: baseline.peakMemMB, limit: 1.10 },
    { name: '准确率', cur: current.accuracy, base: baseline.accuracy, limit: 0.98 }  // -2% 封顶
  ];

  for (const g of gates) {
    const ratio = g.cur / g.base;
    const allowed = g.name === '准确率' ? ratio > g.limit : ratio < g.limit;
    if (!allowed) {
      LoggerUtil.error(TAG, g.name + ' 回归超标: ' + g.cur + ' vs 基线 ' + g.base);
      return false;   // 拦截发布
    }
  }
  return true;
}

四、性能排查与优化

问题 排查 优化
延迟高 分阶段打点找瓶颈 预处理优化、量化、算子融合
内存高 快照对比找峰值 张量复用、分层加载、流式输出
功耗高 功率打点对比 NPU 优先、批处理、缓存
准确率低 误差分析 数据增强、蒸馏、微调
温升快 连续推理监测 间歇推理、降频、散热策略

4.1 延迟瓶颈定位

实测: 总延迟 800ms
  ├─ 预处理 350ms  ← 瓶颈! 图像 1080p 全尺寸缩放
  ├─ 推理 300ms
  ├─ 后处理 100ms
  └─ UI 50ms

优化: 预处理降到 720p + 共享缓存 → 120ms
总延迟: 800ms → 570ms (-29%)

4.2 内存峰值控制

// 复用中间张量缓冲池, 避免每次分配
class TensorPool {
  private pool: any[] = [];
  private readonly maxSize = 8;

  acquire(): any {
    return this.pool.pop() ?? allocateTensor();
  }
  release(t: any): void {
    if (this.pool.length < this.maxSize) {
      this.pool.push(t);      // 复用, 避免 GC
    } else {
      freeTensor(t);
    }
  }
}

4.3 四维平衡调优表

场景 延迟优先 内存优先 功耗优先 准确率优先
实时检测 ✓ 量化+并行
大模型驻留 ✓ 分层加载
穿戴设备 ✓ 批处理+低频
金融风控 ✓ 高精度模型

五、总结

  1. AI 应用评测是四维工程:延迟、内存、功耗、准确率,缺一不可。
  2. 延迟要测 P50/P95 + 分阶段打点,别被平均值骗了;内存要测峰值和驻留;功耗要测单次能耗和温升;准确率要用与线上一致的数据集。
  3. A/B 对比 + 回归门禁:每次模型迭代都有量化结论,超标自动拦截。
  4. 调优是平衡艺术:业务决定优先级,评测体系保证"优化方向正确"。

一句话记住:延迟测分位,内存测峰值,功耗测单次,准确率看分布,四维平衡才算优。


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

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

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

对应页面:entry/src/main/ets/pages/AiBenchmarkDemo.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
  • 演示场景:延迟分析 / 内存占用 / 端侧调优 —— 每个场景绑定不同性能专家 Prompt,返回内容各有差异
  • 交互体验:进入页面自动触发一次真实推理;点场景标签切换并重新请求;按钮手动触发;输出区打字机流式展示
  • 真实标识:卡片右上角 LIVE 徽标 + 端点/模型名水印,保证"所见即所调"
Logo

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

更多推荐