maximum timeflow轻量平台跑分结果:使用stm与ws63芯片实体硬件测试结果
maximum timeflow轻量平台跑分结果:使用stm与ws63芯片实体硬件测试结果
一、测试基本信息
| 项目 | 详情 |
|---|---|
| 仓库 | maximum_timeflow(https://atomgit.com/Harmony_timeflow/maximum_timeflow.git) |
| 分支 / 提交 | main @ 45fdd1c(完整哈希 45fdd1caa17fbb99395ccfe2e0aae94949c8e2ac) |
| 日期 | 2026-09-22 |
| 执行环境 | WSL2 Ubuntu 24.04 LTS(内核 5.15.167.4-microsoft-standard-WSL2) |
| 软件版本 | Python 3.12.3、onnx 1.23.0、onnxruntime 1.30.0、numpy 2.5.3(pip --user 安装) |
二. STM平台测试的模型来源
| 文件 | 生成方式 |
|---|---|
real_model_mlp_128_32_16_1_fp32.onnx |
仓库新增脚本 tools/export_onnx_mlp.py 直接生成 |
real_model_mlp_128_32_16_1_int8.onnx |
对上一文件使用 onnxruntime 静态量化(QDQ)生成 |
README_平台提交说明.md |
人工编写(操作指南),不含生成逻辑 |
数据来源:
生成过程说明_从maximum_timeflow到ONNX.md
三、模型原始数据来源(“原料”)
模型权重与输入全部来自仓库源码,未使用任何外部模型。
3.1 权重数据
来源文件:platform/liteos_m/float_weights_output.c
权重数组(const float NAME[] = {...} 形式):
| 数组名 | 元素数 | 对应层 |
|---|---|---|
g_sequential_dense_MatMul |
4096(128×32) | 第一层权重 |
g_sequential_dense_BiasAdd_ReadVariableOp |
32 | 第一层偏置 |
g_sequential_dense_1_MatMul |
512(32×16) | 第二层权重 |
g_sequential_dense_1_BiasAdd_ReadVariableOp |
16 | 第二层偏置 |
g_sequential_dense_2_MatMul |
16(16×1) | 第三层权重 |
g_sequential_dense_2_BiasAdd_ReadVariableOp |
1 | 第三层偏置 |
- 权重合计:4624 个 float = 18496 B(FP32)
- 另记录输入向量
g_serving_default_dense_input_0(128 个 float)
3.2 层语义规格
来源文件:tools/check_real_model.py
- 权重按
[in][out]行主序存储 - 前向计算:
out = in @ W + b - 三层规格:
- 第一层:128 → 32,ReLU 激活
- 第二层:32 → 16,ReLU 激活
- 第三层:16 → 1,末层无激活
3.3 黄金校验常量
来源文件:tests/golden/liteos_m_real_model.h
| 常量 | 值 |
|---|---|
HTF_GOLDEN_LOGIT |
-0.113044904 |
HTF_GOLDEN_SIGMOID |
0.471768832 |
HTF_GOLDEN_TOL |
0.001 |
由 tools/gen_liteos_golden.py 用 numpy 独立算出。
3.4 重要取舍说明
(1)弃用坏记录值
float_weights_output.c 中的记录输出数组 g_StatefulPartitionedCall_0 值为 4631576035757424490934435840.0(4.6e27)。tools/check_real_model.py 已明确指出这是 INT8→float32 反量化脚本的产物,不可作为黄金数据。因此导出脚本的校验基准改用上述 golden 头文件的 logit/sigmoid 常量对。
(2)补 Sigmoid 末层
仓库 LiteOS-M 核心在末层 dense 之后施加 sigmoid epilogue(golden 对中的 sigmoid 项即设备上报的异常概率)。原始记录只到 logit。为了让平台基准测试"完整训练模型"而非裸 logit 头,导出图在最后加 Sigmoid 节点;同时保留一个 Identity 节点把裸 logit 暴露为命名张量,供校验用。
四、FP32 ONNX 模型生成过程
4.1 脚本信息
- 脚本位置:
tools/export_onnx_mlp.py(本次会话新增,已同步进 WSL 工作副本)
4.2 生成流程
- 解析:正则
(?:static\s+|extern\s+)?const\s+float\s+(\w+)\s*$$\s*$$\s*=\s*\{(.*?)\}\s*;提取全部 float 数组,去掉 C 的 f/F 后缀转 float32。 - 建图:按层规格依次 MatMul → Add →(前两层)Relu;末层 MatMul → Add → Identity(logit) → Sigmoid(output)。权重以 initializer 注入,形状
[in][out]。 - 双图策略:
- 校验图:声明output与logit两个输出,便于同时核对黄金 logit 与 sigmoid
- 交付图:只声明output一个输出(平台只消费单一声明输出)
- 两图节点相同,仅输出声明不同 - 校验门槛(不达标即退出码 1、不写文件):
-onnx.checker.check_model通过
- onnxruntime 前向:logit 与GOLDEN_LOGIT误差 < 1e-6,且 sigmoid 与GOLDEN_SIGMOID误差 < 1e-6 - 保存:
onnx.save交付图,opset 13,ir_version 8
4.3 校验结果
| 指标 | onnxruntime 值 | Golden 值 | 误差 |
|---|---|---|---|
| Logit | -0.1130451038 | -0.113044904 | 1.998e-07 |
| Sigmoid | 0.4717687964 | 0.471768832 | 3.556e-08 |
校验结论:VERIFY: PASS,写出 19202 字节
4.4 执行命令
python3 tools/export_onnx_mlp.py "/mnt/c/.../st平台导入项目/real_model_mlp_128_32_16_1_fp32.onnx"
4.5 交付图结构(onnx.checker 复核)
| 项目 | 详情 |
|---|---|
| 输入 | input[1,128] |
| 输出 | output[1,1] |
| 节点 | MatMul ×3 + Add ×3 + Relu ×2 + Identity ×1 + Sigmoid ×1 |
| Initializer | 6 个 |
五、INT8 ONNX 模型生成过程(静态量化 QDQ)
5.1 脚本信息
- 脚本位置:
_bench/s7_quant.py(未入库)
5.2 校准数据
共 64 个样本,input 形状 [1,128]:
| 样本 | 来源 |
|---|---|
| 第 1 个 | 仓库记录输入 g_serving_default_dense_input_0 |
| 其余 63 个 | np.random.default_rng(0x5eed1234).uniform(-1, 1, (1,128)),与仓库跑分套件同一种输入分布(HTF_BENCH_SEED = 0x5eed1234) |
5.3 量化参数
quantize_static(
model_input = FP32 onnx,
model_output = INT8 onnx,
calibration_data_reader = Reader(),
quant_format = QuantFormat.QDQ,
per_channel = True,
weight_type = QuantType.QInt8,
)
5.4 量化校验结果
| 指标 | 值 |
|---|---|
| 量化后 sigmoid | 0.473916322 |
| Golden sigmoid | 0.471768832 |
| 绝对误差 | 2.147e-03 |
| 相对误差 | 4.552e-03 |
| 接受界限 | 5e-03(脚本内常量 ACCEPT_ERR) |
校验结论:VERIFY: PASS
5.5 体积对比
| 口径 | FP32 | INT8 | 压缩比 |
|---|---|---|---|
| 文件级 | 19202 B | 9624 B | 2.00× |
| 纯权重数组 | 18496 B | 4624 B | 4.00× |
5.6 交付图结构
| 项目 | 详情 |
|---|---|
| 输入/输出 | 同 FP32 |
| 节点 | 在 FP32 基础上增加 QuantizeLinear ×9、DequantizeLinear ×15(QDQ 形式) |
| Initializer | 36 个(含 scale/zero_point) |
5.7 选择 QDQ INT8 的原因
- 平台 Model Zoo 原生提供大量
*_qdq_int8.onnx模型,证明该格式是平台一等公民 - 整数权重与整数 MAC 在 Cortex-M(CMSIS-NN)上是快路径
- Flash 占用更小
5.8 执行命令
python3 <量化脚本> <FP32 路径> <输出路径>/real_model_mlp_128_32_16_1_int8.onnx
数据来源:
生成过程说明_从maximum_timeflow到ONNX.md
六、ST Edge AI Developer Cloud 基准测试结果
以下三组基准测试数据均在 STM 芯片官方(意法半导体)的 ST Edge AI Developer Cloud 网站上通过连接远程的真实实体硬件开发板测试跑分的。
6.1 第一次基准测试(FP32 模型)
数据来源:
2026-09-22T12_12_53.985Z-benchmark-results.csv模型 SHA256:
3840f9dfcf3991f9828ae6d80f67c9aef3f653478df1e69493b1a8d02f9a586f模型 MD5:
94b3315a891f159c2ad9d33adffc9ce1优化策略:balanced
| 开发板 | 状态 | 周期数 (cycles) | 推理耗时 (ms) | 总 Flash (B) | 总 RAM (B) | 内部 Flash (B) | 外部 Flash (B) | 内部 RAM (B) | 外部 RAM (B) | 激活值 (B) | 权重 (B) | 内核 Flash (B) | 内核 RAM (B) | I/O (B) | 使用外部 Flash | 使用外部 RAM |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| STM32H7S78-DK | done | 68,071 | 0.113453 | 17,660 | 2,560 | 12,788 | 0 | 2,560 | 0 | 736 | 4,872 | 12,788 | 1,824 | 0/0 | ✅ true | ❌ false |
| STM32H735G-DK | done | 17,314 | 0.031480 | 17,660 | 2,560 | 17,660 | 0 | 2,560 | 0 | 736 | 4,872 | 12,788 | 1,824 | 0/0 | ❌ false | ❌ false |
| NUCLEO-H743ZI2 | done | 18,508 | 0.038558 | 17,660 | 2,560 | 17,660 | 0 | 2,560 | 0 | 736 | 4,872 | 12,788 | 1,824 | 0/0 | ❌ false | ❌ false |
| STM32H747I-DISCO | done | 17,100 | 0.042750 | 17,660 | 2,560 | 17,660 | 0 | 2,560 | 0 | 736 | 4,872 | 12,788 | 1,824 | 0/0 | ❌ false | ❌ false |
| STM32H7B3I-DK | done | 19,149 | 0.068389 | 17,660 | 2,560 | 17,660 | 0 | 2,560 | 0 | 736 | 4,872 | 12,788 | 1,824 | 0/0 | ❌ false | ❌ false |
| STM32H573I-DK | done | 24,053 | 0.096212 | 19,756 | 2,560 | 19,756 | 0 | 2,560 | 0 | 736 | 4,872 | 14,884 | 1,824 | 0/0 | ❌ false | ❌ false |
第一次基准测试关键发现
- 推理最快:STM32H735G-DK(17,314 cycles / 0.031480 ms)
- 推理最慢:STM32H7S78-DK(68,071 cycles / 0.113453 ms),且该板使用了外部 Flash(
useExternalFlash=true),内部 Flash 仅 12,788 B - STM32H573I-DK 的 Flash 占用最大(19,756 B),内核 Flash 为 14,884 B,高于其他板子的 12,788 B
- 所有板子 RAM 占用统一为 2,560 B,权重均为 4,872 B,激活值均为 736 B
- 所有测试均未使用外部 RAM(
useExternalRam=false)
6.2 第二次基准测试(FP32 模型,重复验证)
数据来源:
2026-09-22T12_22_15.513Z-benchmark-results.csv模型 SHA256:
3840f9dfcf3991f9828ae6d80f67c9aef3f653478df1e69493b1a8d02f9a586f(与第一次相同)模型 MD5:
94b3315a891f159c2ad9d33adffc9ce1(与第一次相同)优化策略:balanced
| 开发板 | 状态 | 周期数 (cycles) | 推理耗时 (ms) | 总 Flash (B) | 总 RAM (B) | 内部 Flash (B) | 外部 Flash (B) | 内部 RAM (B) | 外部 RAM (B) | 激活值 (B) | 权重 (B) | 内核 Flash (B) | 内核 RAM (B) | I/O (B) | 使用外部 Flash | 使用外部 RAM |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| STM32H7S78-DK | done | 68,071 | 0.113453 | 17,660 | 2,560 | 12,788 | 0 | 2,560 | 0 | 736 | 4,872 | 12,788 | 1,824 | 0/0 | ✅ true | ❌ false |
| STM32H735G-DK | done | 17,314 | 0.031480 | 17,660 | 2,560 | 17,660 | 0 | 2,560 | 0 | 736 | 4,872 | 12,788 | 1,824 | 0/0 | ❌ false | ❌ false |
| NUCLEO-H743ZI2 | done | 18,508 | 0.038558 | 17,660 | 2,560 | 17,660 | 0 | 2,560 | 0 | 736 | 4,872 | 12,788 | 1,824 | 0/0 | ❌ false | ❌ false |
| STM32H747I-DISCO | done | 17,100 | 0.042750 | 17,660 | 2,560 | 17,660 | 0 | 2,560 | 0 | 736 | 4,872 | 12,788 | 1,824 | 0/0 | ❌ false | ❌ false |
| STM32H7B3I-DK | done | 19,149 | 0.068389 | 17,660 | 2,560 | 17,660 | 0 | 2,560 | 0 | 736 | 4,872 | 12,788 | 1,824 | 0/0 | ❌ false | ❌ false |
| STM32H573I-DK | done | 24,053 | 0.096212 | 19,756 | 2,560 | 19,756 | 0 | 2,560 | 0 | 736 | 4,872 | 14,884 | 1,824 | 0/0 | ❌ false | ❌ false |
第二次基准测试说明
本次测试结果与第一次完全一致(相同的 SHA256/MD5、相同的 benchmarkId、相同的 cycles 和 duration_ms),属于对同一模型的重复提交验证,确认了结果的可复现性。
6.3 第三次基准测试(INT8 QDQ 量化模型)
数据来源:
2026-09-22T12_43_34.929Z-benchmark-results.csv模型 SHA256:
9836e730455a300711142e6a67d1bf076b1ffb07f3b072180dbbd209ad276c6e(与 FP32 不同)模型 MD5:
0ea0678903c8b3a999b18215bb72d271(与 FP32 不同)优化策略:balanced
| 开发板 | 状态 | 周期数 (cycles) | 推理耗时 (ms) | 总 Flash (B) | 总 RAM (B) | 内部 Flash (B) | 外部 Flash (B) | 内部 RAM (B) | 外部 RAM (B) | 激活值 (B) | 权重 (B) | 内核 Flash (B) | 内核 RAM (B) | I/O (B) | 使用外部 Flash | 使用外部 RAM |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| STM32H7S78-DK | done | 45,806 | 0.076343 | 21,320 | 640 | 2,628 | 0 | 640 | 0 | 640 | 18,692 | 2,628 | — | 0/0 | ✅ true | ❌ false |
| STM32H735G-DK | done | 29,065 | 0.052847 | 21,320 | 640 | 21,320 | 0 | 640 | 0 | 640 | 18,692 | 2,628 | — | 0/0 | ❌ false | ❌ false |
| NUCLEO-H743ZI2 | done | 30,510 | 0.063565 | 21,320 | 640 | 21,320 | 0 | 640 | 0 | 640 | 18,692 | 2,628 | — | 0/0 | ❌ false | ❌ false |
| STM32H747I-DISCO | done | 28,121 | 0.070305 | 21,320 | 640 | 21,320 | 0 | 640 | 0 | 640 | 18,692 | 2,628 | — | 0/0 | ❌ false | ❌ false |
| STM32H7B3I-DK | done | 30,089 | 0.107461 | 21,320 | 640 | 21,320 | 0 | 640 | 0 | 640 | 18,692 | 2,628 | — | 0/0 | ❌ false | ❌ false |
| STM32H573I-DK | done | 39,889 | 0.159556 | 21,408 | 640 | 21,408 | 0 | 640 | 0 | 640 | 18,692 | 2,716 | — | 0/0 | ❌ false | ❌ false |
第三次基准测试关键发现
- 推理最快:STM32H735G-DK(29,065 cycles / 0.052847 ms)
- 推理最慢:STM32H7S78-DK(45,806 cycles / 0.076343 ms),同样使用了外部 Flash
- STM32H573I-DK 的总 Flash 占用为 21,408 B(高于其他板的 21,320 B),内核 Flash 为 2,716 B(高于其他板的 2,628 B)
- RAM 占用大幅降低:所有板子 RAM 统一降至 640 B(FP32 为 2,560 B),降幅 75%
- 权重占用增大:INT8 模型在平台上的权重为 18,692 B(含 QDQ 节点的 scale/zero_point 等开销),大于 FP32 的 4,872 B
- 激活值略降:从 736 B 降至 640 B
- 所有测试均未使用外部 RAM
七、FP32 与 INT8 模型基准测试对比
7.1 推理性能对比(按开发板)
| 开发板 | FP32 周期数 | INT8 周期数 | 周期数变化 | FP32 耗时 (ms) | INT8 耗时 (ms) | 耗时变化 |
|---|---|---|---|---|---|---|
| STM32H735G-DK | 17,314 | 29,065 | +67.9% | 0.031480 | 0.052847 | +67.9% |
| NUCLEO-H743ZI2 | 18,508 | 30,510 | +64.8% | 0.038558 | 0.063565 | +64.9% |
| STM32H747I-DISCO | 17,100 | 28,121 | +64.5% | 0.042750 | 0.070305 | +64.5% |
| STM32H7B3I-DK | 19,149 | 30,089 | +57.1% | 0.068389 | 0.107461 | +57.1% |
| STM32H7S78-DK | 68,071 | 45,806 | -32.7% | 0.113453 | 0.076343 | -32.7% |
| STM32H573I-DK | 24,053 | 39,889 | +65.8% | 0.096212 | 0.159556 | +65.8% |
注:FP32 数据取自第一次基准测试(
2026-09-22T12_12_53.985Z-benchmark-results.csv),INT8 数据取自第三次基准测试(2026-09-22T12_43_34.929Z-benchmark-results.csv)
对比分析
- 大多数开发板上,INT8 模型的推理周期数和耗时反而高于 FP32 模型(增幅约 57%~68%)。这可能因为:
- QDQ 模型在平台上引入了额外的 QuantizeLinear/DequantizeLinear 节点开销
- 该 MLP 模型规模较小(仅 3 层),量化带来的计算量节省不足以抵消 QDQ 节点开销 - 唯一例外:STM32H7S78-DK 上 INT8 模型耗时降低了 32.7%(从 0.113 ms 降至 0.076 ms),可能因为该板上 FP32 模型使用了外部 Flash(
useExternalFlash=true),而 INT8 虽然也使用了外部 Flash,但内部 Flash 占用从 12,788 B 降至 2,628 B,大幅减少了外部 Flash 读取延迟
7.2 资源占用对比(以典型板为例,排除 H7S78-DK 和 H573I-DK 特殊情况)
| 指标 | FP32 | INT8 | 变化 |
|---|---|---|---|
| 总 Flash | 17,660 B | 21,320 B | +20.7% |
| 总 RAM | 2,560 B | 640 B | -75.0% |
| 激活值 | 736 B | 640 B | -13.0% |
| 权重 | 4,872 B | 18,692 B | +283.7% |
| 内核 Flash | 12,788 B | 2,628 B | -79.4% |
资源分析
- RAM 大幅降低是 INT8 量化最显著的优势(2,560 → 640 B),对 RAM 极为紧张的 Cortex-M 场景意义重大
- Flash 总量增大是因为 QDQ 格式引入了大量 scale/zero_point 参数(initializer 从 6 个增至 36 个)
- 内核 Flash 大幅降低(12,788 → 2,628 B),说明量化后实际计算内核更精简
- 权重在平台上的表现增大,可能因为平台对 QDQ 节点的权重管理方式不同于纯 INT8 权重
八、开发板性能排名
8.1 FP32 模型推理速度排名
数据取自
2026-09-22T12_12_53.985Z-benchmark-results.csv
| 排名 | 开发板 | 推理耗时 (ms) | 周期数 |
|---|---|---|---|
| 🥇 1 | STM32H735G-DK | 0.031480 | 17,314 |
| 🥈 2 | NUCLEO-H743ZI2 | 0.038558 | 18,508 |
| 🥉 3 | STM32H747I-DISCO | 0.042750 | 17,100 |
| 4 | STM32H7B3I-DK | 0.068389 | 19,149 |
| 5 | STM32H573I-DK | 0.096212 | 24,053 |
| 6 | STM32H7S78-DK | 0.113453 | 68,071 |
8.2 INT8 模型推理速度排名
数据取自
2026-09-22T12_43_34.929Z-benchmark-results.csv
| 排名 | 开发板 | 推理耗时 (ms) | 周期数 |
|---|---|---|---|
| 🥇 1 | STM32H735G-DK | 0.052847 | 29,065 |
| 🥈 2 | NUCLEO-H743ZI2 | 0.063565 | 30,510 |
| 🥉 3 | STM32H747I-DISCO | 0.070305 | 28,121 |
| 4 | STM32H7S78-DK | 0.076343 | 45,806 |
| 5 | STM32H7B3I-DK | 0.107461 | 30,089 |
| 6 | STM32H573I-DK | 0.159556 | 39,889 |
九、环境准备中遇到的问题记录
| 问题 | 原因 | 解决方案 |
|---|---|---|
| WSL 内仓库副本与 Windows 编辑不同步 | 编辑在 Windows 侧进行、执行在 WSL 侧,首次运行报 “No such file” | tr -d '\r' < 源 > 副本 逐文件同步并统一 LF |
| checker 报 “Graph output ‘output’ is not an output of any node” | 末层张量名与图输出名不一致 | 加 Identity/Sigmoid 节点把末张量命名为 output |
| 首次校验失败 | 拿坏记录值 4.6e27 当基准必然失败 | 改为 golden 常量对 |
| onnxruntime 取不到中间张量 logit | onnxruntime 只能取图声明的输出张量 | 校验用双输出图、交付用单输出图 |
数据来源:
生成过程说明_从maximum_timeflow到ONNX.md
十、复现命令汇总与真实性声明
# 0) 环境准备
sudo apt install python3-pip && python3 -m pip install --user onnx onnxruntime numpy
# 1) 生成 FP32 ONNX
cd <maximum_timeflow 仓库>
python3 tools/export_onnx_mlp.py <输出路径>/real_model_mlp_128_32_16_1_fp32.onnx
# 2) 生成 INT8 ONNX(QDQ 量化)
python3 <量化脚本> <FP32 路径> <输出路径>/real_model_mlp_128_32_16_1_int8.onnx
# 3) 结构复核
python3 -c "import onnx; m=onnx.load('<文件>'); onnx.checker.check_model(m); print([n.op_type for n in m.graph.node])"
- 全部数字(误差、大小、节点清单、基准测试结果)均为实测输出,未估算未外推
- INT8 的精度损失(绝对 2.147e-3)与文件级 2.00× / 纯权重 4.00× 两种体积口径均如实标注
- 模型来源仅为仓库源码权重,未引入任何第三方预训练模型
- 所有基准测试数据均来源于 ST Edge AI Developer Cloud 平台的实际测试输出
十一、OpenHarmony(liteos-m)平台使用实体ws63开发板的跑分
WS63 芯片的硬件能力不如 STM 系列板子的芯片能力,因此测试内容做了相应简化——只做了这款芯片力所能及的事情。具体而言:
- WS63 板子上运行的是 FP32 精度的模型推理(未进行 INT8 量化测试);
- 测试程序为仓库中的
htf_bench_constrained,专为资源受限目标设备设计; - 模型权重以编译时常量形式嵌入固件(built-in weights, no file I/O),不依赖外部存储读取;
- 测试在设备端直接完成计时与数值校验,不依赖宿主机参与。
数据来源:
WS63_device_benchmark_report.html、WS63_Device_Benchmark-JSON_artifact.json、WS63_Device_Benchmark-Raw_UART_Log.log
测试环境:
| 项目 | 详情 |
|---|---|
| 目标设备 | WS63 开发板 |
| 架构 | RISC-V(riscv32) |
| 操作系统/内核 | LiteOS-M core(无运行时分发) |
软件环境:
| 项目 | 详情 |
|---|---|
| 基准测试程序 | htf_bench_constrained |
| 库版本 | 0.1.0 |
| Git 提交哈希 | a9e735a |
| 测试时间戳 (UTC) | 1970-01-01T00:00:52Z |
| 迭代次数 | 300 次 |
| 时钟源 | LOS_GetCpuCycle |
| 时钟分辨率 | 2 ns(一个计数器步长) |
| 计时模式 | per_iteration(每次推理独立计时) |
| Batch Size | 1 |
数据来源:
WS63_Device_Benchmark-JSON_artifact.json(JSON artifact 中的 env 字段)
时钟频率测量:
WS63 板子的时钟频率不是从数据手册假设的,而是在启动时实际测量得到:
| 项目 | 值 |
|---|---|
| 实测时钟频率 | 400015 counts/ms(通过对 1000 Hz tick 测量得出) |
数据来源:
WS63_device_benchmark_report.html(Portable facts 表格中 “measured clock rate” 行)、WS63_Device_Benchmark-JSON_artifact.json(clock_rate 条目)
模型规格:
WS63 板上运行的模型与 ST 平台测试使用的是同一个 MLP 模型(3 层全连接网络),模型规格如下:
网络结构:
| 层 | 形状 | 权重地址 | 偏置 |
|---|---|---|---|
| Layer 0 | 128×32 | 0x375e94 | 有 |
| Layer 1 | 32×16 | 0x3755d0 | 有 |
| Layer 2 | 16×1 | 0x375dd4 | 有 |
- 输入维度:128
- 输出维度:1
- 层数:3
内存与储存占用
| 项目 | 详情 | 值 |
|---|---|---|
| 权重表 | 存放在 Flash (.rodata) 中,无文件 I/O | 4624 个权重 = 18496 B(FP32) |
| 推理scratch RAM | 静态 BSS,链接时一次性分配 | 1024 B = 1.0 KB(2 × 128 floats) |
| 静态缓冲区 | ping-pong scratch,最宽层 128 | 静态缓冲区 = 128 floats(适配) |
数据来源:
WS63_device_benchmark_report.html(Portable facts 表格)、WS63_Device_Benchmark-JSON_artifact.json(entries 中 kind=metric 的条目)
模型精度声明
WS63 测试中使用的模型为 FP32 精度,INT8 量化模型未在 WS63 板上测试:
| 模型类型 | WS63 测试状态 |
|---|---|
| FP32 模型 | 未单独加载(权重编译在固件中) |
| INT8 模型 | 未单独加载(权重编译在固件中) |
数据来源:
WS63_device_benchmark_report.html(Provenance 表格中 FP32 model / INT8 model 行)、WS63_Device_Benchmark-JSON_artifact.json(model_fp32 / model_int8 字段均为 null)
数值正确性验证
在 WS63 板子上运行推理后,benchmark 程序自动将设备计算结果与宿主机上 numpy 计算的黄金值进行比对:
| 校验项 | 设备输出值 | 黄金值(numpy) | 误差 | 容忍阈值 | 结果 |
|---|---|---|---|---|---|
| 异常概率(sigmoid 输出) | 0.471768856 | 0.471768826 | 2.98e-08 | 0.001 | 通过 |
| Softmax 常量回归 | 未触发(输出不为 1.0) | — | — | — | 通过 |
数值误差(2.98e-08)远小于容忍阈值(0.001),说明 WS63 板上的 FP32 推理结果与宿主机计算结果高度一致。
数据来源:
WS63_device_benchmark_report.html(Numerical correctness 表格)、WS63_Device_Benchmark-JSON_artifact.json(metric 条目中 anomaly probability 和 softmax-constant regression)
推理性能测试结果
完成前向传播计时
在 WS63 板上对 300 次推理进行逐次计时,统计结果如下:
| 统计指标 | 值 |
|---|---|
| 最小耗时 | 0 ns |
| 平均耗时 | 533.33 μs |
| 中位数 (p50) | 1.00 ms |
| 95 百分位 (p95) | 1.00 ms |
| 最大耗时 | 1.00 ms |
| 样本数 | 300 |
| 吞吐量 | 1.88 k/s(即每秒约 1875 次推理) |
注:最小耗时为 0 ns 表明部分推理在单个时钟tick 内完成(计时分辨率限制),实际耗时被量化为 0。p50/p95/max 均为 1.00 ms,说明在 1 ms 的系统 tick 分辨率下,大部分推理耗时落在 1 个 tick 区间内。
性能图表描述
Benchmark 报告生成了横向柱状图,展示"Constrained target: inference timing (THIS machine)“,单位为 μs/call。柱状图显示 full forward pass [128→1, 3 layers] 的平均耗时为 533.33 μs,颜色标记为"measured on target”(绿色),表示该数据为设备端实测值。
数据来源:
WS63_device_benchmark_report.html(Timing section 中的表格和 SVG 图表)、WS63_Device_Benchmark-JSON_artifact.json(entries 中 kind=timing 的条目)
推导指标
| 指标 | 值 |
|---|---|
| 单次推理延迟(本设备) | 533.333 μs 平均,1000.000 μs p95 |
数据来源:
WS63_device_benchmark_report.html(Comparisons and derived figures 表格)、WS63_Device_Benchmark-JSON_artifact.json(per-inference latency 条目)
UART通信接口
WS63 开发板通过 UART 串口与宿主机通信,使用 AT 指令集触发 benchmark 运行。原始串口日志如下:
AT+HTFBENCH
[HTF AI] native engine ready: 3 layers, in=128 out=1, buffer=128 floats
[HTF AI] native engine ready: 3 layers, in=128 out=1, buffer=128 floats
=====HTF_BENCH_JSON_BEGIN=====
{ ... JSON artifact ... }
=====HTF_BENCH_JSON_END=====
OK
通信流程说明:
- 宿主机通过串口发送
AT+HTFBENCH指令启动 benchmark; - WS63 板子初始化 native engine,打印两条就绪日志(引擎启动两次,可能为日志重复打印);
- 板子执行推理测试,将 JSON 格式的 benchmark 结果通过串口输出,用
=====HTF_BENCH_JSON_BEGIN=====和=====HTF_BENCH_JSON_END=====标记包裹; - 测试完成后返回
OK表示执行完毕。
数据来源:
WS63_Device_Benchmark-Raw_UART_Log.log
结果判定
Benchmark 程序内置了自动验证机制,对所有测试用例进行正确性校验:
| 程序 | 判定 | 详情 |
|---|---|---|
| htf_bench_constrained | PASS | 0 个失败项;正确性已验证 |
报告顶部的总体验证结论为:“All runs validated their own results.”(所有运行均通过了自身结果验证。)
数据来源:
WS63_device_benchmark_report.html(顶部 verdict 区块)、WS63_Device_Benchmark-JSON_artifact.json(Run verdict 条目)
附录:原始 Benchmark ID 索引
FP32 模型(第一次/第二次测试共用)
| 开发板 | Benchmark ID |
|---|---|
| STM32H7S78-DK | 82a8cc4a-300f-4433-87d4-60a93cc51a9e |
| STM32H735G-DK | b6cd6504-3761-46e5-be29-bc3390c53f50 |
| NUCLEO-H743ZI2 | 24564011-48b0-4e88-bcdb-ecd9cc6d4330 |
| STM32H747I-DISCO | 11ca7fc0-95c7-4290-9637-a5a773f407b1 |
| STM32H7B3I-DK | fe6b471c-0b4c-4185-9daa-05fa23d25b6d |
| STM32H573I-DK | 95f74793-203d-4135-94b7-bc924dff2dc1 |
数据来源:
2026-09-22T12_12_53.985Z-benchmark-results.csv/2026-09-22T12_22_15.513Z-benchmark-results.csv
INT8 模型(第三次测试)
| 开发板 | Benchmark ID |
|---|---|
| STM32H7S78-DK | 24826630-0975-462f-bbbf-f42ec0d6b2e0 |
| STM32H735G-DK | 42b97bed-a53e-4bd4-8ef8-f45aa34b2f7f |
| NUCLEO-H743ZI2 | 0bd56ba0-d340-4288-9b8b-7ed63280cf5b |
| STM32H747I-DISCO | af7fc519-a275-4cc8-82e0-688907e022a7 |
| STM32H7B3I-DK | 0ee4e078-8fc9-4d5a-9207-7f12239fdb34 |
| STM32H573I-DK | 6d52d391-f82a-43a8-af59-bc09ebae84da |
数据来源:
2026-09-22T12_43_34.929Z-benchmark-results.csv
注:截图与机器输出的文档不会放在此文档里,请移步相关文件夹查看。
- 点赞
- 收藏
- 关注作者
评论(0)