一、简介:为什么 AI 也要算 WCET?

  • 场景:自动驾驶、工业质检、机器人控制中的 CNN/Transformer 模型,必须在 deadline 前输出结果

  • 传统方式:示波器 + 逻辑分析仪,单次测量,无法覆盖长尾

  • 统计方式:极值理论(EVT)用“日常数据”外推“百万年一遇”最坏情况,成本低、可复现、能过审

掌握本文方法,即可在 PREEMPT_RT 平台提交符合 ISO 26262 / IEC 61508 的 P99.9999 WCET 证据


二、核心概念:5 个关键词先搞懂

名词 一句话 本文符号
WCET 最坏执行时间 单位 μs
EVT 极值理论,用 GPD(广义帕累托分布)拟合尾部 -
超越阈值 仅分析 > μ + κσ 的样本,减少核内数据 threshold
重现期 1/(1-CDF),P99.9999≈1e6 次出现 1 次 return period
尾重指数 ξ GPD 形状参数,ξ<0 表示“有界尾”→ WCET 存在 xi

三、环境准备:10 分钟搭好“WCET 实验室”

1. 硬件

  • x86_64 多核,支持 RDTSC 时钟(≥2 GHz)

  • 建议开启 BIOS 禁用 Turbo/超线程,降低 jitter

2. 软件

组件 版本 安装
Ubuntu Server 22.04 -
PREEMPT_RT 内核 5.15-rt 见附录脚本
Python 3.9+ sudo apt install python3-pip
py-evt 0.2 pip3 install py-evt matplotlib seaborn
AI 框架 ONNX Runtime 1.15 pip3 install onnxruntime

3. 一键装 RT 内核(可复制)

#!/bin/bash
# install_rt.sh
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.15.71/linux-image-5.15.71-rt53-generic_amd64.deb
sudo dpkg -i linux*.deb && sudo update-grub && sudo reboot

四、应用场景(300 字)

自动驾驶 ECU 搭载实时 Linux + PREEMPT_RT,运行 YOLOv5n 进行 30 fps 行人检测。硬件为 ARM Cortex-A78 四核,GPU 仅 256 CUDA Core,单帧推理必须 < 33 ms(含图像预处理)。传统测量 1000 次后取 max=28 ms,但审计要求 P99.9999 WCET ≤ 33 ms。本文方法:在真实道路采集 2 小时视频(7.2 万次推理),记录每帧耗时,用 EVT 外推 P99.9999,得到 WCET=31.7 ms,满足安全目标;同时给出 95% 置信区间 [30.9, 32.5] ms,一次性通过 TÜV 审核


五、实际案例与步骤:从“裸数据”到“P99.9999”

5.1 步骤总览

  1. 采集推理耗时 → raw.csv

  2. 数据清洗 → 剔除冷启动异常

  3. 选择阈值 → 均值+3σ 起步

  4. 拟合 GPD → 得 ξ, σ, μ

  5. 计算重现期 → P99.9999

  6. 可视化 → 对比经验 CDF vs GPD

5.2 采集耗时(可插拔任意模型)

# collect.py
import time, onnxruntime as rt, numpy as np, csv

model = rt.InferenceSession("yolov5n.onnx", providers=['CPUExecutionProvider'])
input_name = model.get_inputs()[0].name
dummy = np.random.randn(1,3,640,640).astype(np.float32)

with open('raw.csv','w',newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['idx','us'])
    for i in range(100000):          # 10 万次
        t0 = time.perf_counter_ns()
        _ = model.run([input_name], {input_name: dummy})
        t1 = time.perf_counter_ns()
        writer.writerow([i, (t1-t0)/1000])  # μs

运行(绑定到隔离核 + 最高优先级):

sudo chrt -f 99 python3 collect.py   # 约 20 min 完成

5.3 数据清洗 & 阈值选择

# clean.py
import pandas as pd, numpy as np
df = pd.read_csv('raw.csv')
# 剔除 warmup (前 100) 与 3σ 异常
df = df[100:]
mean, sigma = df.us.mean(), df.us.std()
threshold = mean + 3*sigma
tail = df[df.us > threshold]
tail.to_csv('tail.csv', index=False)
print(f"阈值={threshold:.1f} μs, 尾样本={len(tail)}")

5.4 EVT 拟合与 WCET 计算

# evt_wcet.py
import numpy as np
from pyevt import GPD
tail = np.loadtxt('tail.csv', delimiter=',', skiprows=1, usecols=1)
gpd = GPD()
gpd.fit(tail)
xi, sigma, mu = gpd.params
print("GPD 参数: xi=%.4f sigma=%.2f mu=%.2f" % (xi, sigma, mu))
# P99.9999 重现期 = 1e6
return_period = 1e6
wcet = gpd.isf(1/return_period)   # inverse survival function
print("P99.9999 WCET = %.2f μs" % wcet)

5.5 结果可视化

# plot.py
import seaborn as sns, matplotlib.pyplot as plt
sns.set_style("whitegrid")
df = pd.read_csv('raw.csv')
# 经验 CDF
sns.ecdfplot(df.us/1000, label='Empirical')
# GPD 外推
x = np.linspace(df.us.max()/1000, wcet/1000, 300)
y = 1 - gpd.sf(x*1000)
plt.plot(x, y, '--', label='GPD Extrapolation')
plt.axvline(wcet/1000, color='r', ls=':', label='P99.9999 WCET')
plt.xlabel('Latency (ms)')
plt.ylabel('CDF')
plt.title('YOLOv5n WCET via EVT')
plt.legend(); plt.savefig('wcet.png', dpi=300)

输出示例:
https://user-images.githubusercontent.com/xxx/wcet.png
WCET = 31.7 ms,与实测 max 28 ms 相比,EVT 给出更悲观、更可信的上界


六、常见问题与解答(FAQ)

问题 现象 解决
xi > 0 无界尾 WCET 无限大 增加样本或提高阈值,若仍 >0 → 需硬件限速/算法优化
阈值选多少? 尾部样本 < 50 从 mean+2σ 开始逐步下调,直到 tail≥150
采集时被抢占 原始 max 飙到 50 ms 用 chrt -f 99 + taskset -c 1 绑定隔离核
GPU 推理异步 事件不完整 用 cudaEvent_t 记录内核结束时间,再读回 Host
需要置信区间? auditor 问不确定性 gpd.bootstrap(n=1000, alpha=0.05) 输出区间

七、实践建议与最佳实践

  1. 样本量 ≥ 10 万次 → 重现期 1e6 才可靠;GPU 可用循环跑 2 小时视频。

  2. 冷启动单独测量,不计入 EVT,避免“头部”污染“尾部”。

  3. 结合硬件 PMU
    perf stat -e cache-misses 验证 tail 是否与 cache 抖动相关,指导优化。

  4. 自动化 Gate
    在 CI 中加 pytest test_wcet.py,若 WCET > deadline 则流水线失败。

  5. 与静态分析互补
    EVT 给出“实测天花板”,静态 WCET 工具(如 Otawa、aiT)给出“理论天花板”,二者取 max 写入安全报告。

  6. 版本锁定
    模型、驱动、RT 内核、BIOS 设置任何变动 → 重新跑 EVT,保持追溯链。


八、总结:一张脑图带走全部要点

AI-WCET 统计学方法
├─ 采集:chrt + taskset 跑 10 万次推理
├─ 清洗:去 warmup + 3σ 异常
├─ 拟合:GPD 求 xi σ μ
├─ 外推:isf(1e-6) → P99.9999
├─ 可视化:Empirical vs GPD
└─ 门禁:CI 自动判 deadline

实时 Linux + EVT 让你无需昂贵示波器,就能向 auditor 交出 “百万分之一概率”最坏执行时间 的量化证据

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐