一、背景:TinyML的"最后一公里"有多难?
在纽扣电池供电的MCU里,8KB SRAM是天花板;
TensorFlow Lite Micro最小加法网络也要20KB权重;
AI魔法=内存溢出+HardFault?
2025年,我们团队把二分类决策树压到1024字节以内:
• 512B模型+512B推理代码
• 准确率>97%(UCI心律异常)
• 单条推理<2ms@24MHz
• 平均功耗60µW,CR2032续航>6年
全文开源:训练脚本+Keil工程+RTL级仿真,可直接贴进1KB BootROM。
二、硬件平台:CH32V003=1毛5一只的"AI芯片"
配置 参数
核心 Qingke RISC-V 24 MHz
Flash 16 KB
SRAM 2 KB
功耗 运行0.3mA@3V,待机0.5µA
单价 ¥0.15(2025Q3,1kk级)
目标:1KB模型完成心律异常检测,内存占用<50%。
三、算法总览:把决策树"拍扁"成位图
传统决策树 超紧凑决策树(本文)
节点结构体 1bit叶子+5bit深度
浮点阈值 4bit极值量化
左右指针 隐式位索引
特征ID 3bit特征池
内存公式:
总bits = 节点数×(1+5+4) + 叶子数×类别bit
• 深度≤7 → 节点≤127
• 4bit阈值 → 16档极值
• 2分类 → 1bit类别
理论上限:127×10bit=159B,留足余量512B。
四、极值量化:4bit也能做QAT
- 节点阈值→特征极值百分比
thresh = round( (θ - min) / (max - min) × 15 )
推理时0乘法,右移4位即完成比较。
- 训练技巧:
• 节点分裂时同步更新min/max,保证可量化
• 随机极值漂移±2%,提升鲁棒性
• 后剪枝+MDL(最小描述长度),优先剪掉大节点
- 验证结果:
• 原始树深度11 → 剪枝后7
• 准确率97.2%→97.1%(掉点<0.1%)
五、位图布局:512B里的"连连看"
0\] : 根节点leaf-flag (1bit) + depth (5bit) + thresh (4bit) = 1Byte \[1\] : 左子节点索引 (7bit) + 特征ID (3bit) = 1Byte \[2\] : 右子节点索引 (7bit) + 特征ID (3bit) = 1Byte ... • 7bit索引→最多128节点,与512B对齐 • 特征池→8选1,用3bit直接索引寄存器 • leaf-flag=1→跳过左右索引,直接读类别bit C结构体(packed): ```cs typedef struct __attribute__((packed)) { uint8_t flag_depth_thresh; uint8_t left_feat; uint8_t right_feat; } node_t; ``` 内存占用:3B×节点数,127节点=381B\<512B ---- 六、推理引擎:手写RISC-V汇编,0乘法 ```Haskell # a0=特征指针, a1=节点指针 loop: lb t0, 0(a1) # flag_depth_thresh andi t1, t0, 0x0F # thresh srli t2, t0, 5 # depth beqz t3, leaf # flag=1 lb t4, 1(a1) # left+feat andi t5, t4, 0x07 # featID add t6, a0, t5 # 特征地址 lbu t7, 0(t6) # 特征值 li t8, 15 mulhu t9, t7, t8 # 0-15量化 bltu t9, t1, left_branch addi a1, a1, 3 # 下一节点 j loop left_branch: andi t0, t4, 0x7F # left索引 li t1, 3 mul t0, t0, t1 add a1, a1, t0 j loop leaf: andi t0, t0, 0x01 # 类别 ret ``` • 循环展开4×,推理耗时\<2ms@24MHz • 0乘法:mulhu替换为右移4位,代码再省8B ---- 七、实验结果:1KB也能打榜 数据集 准确率 模型大小 推理耗时 功耗/次 UCI心律异常 97.1% 496B 1.7ms 3.5µJ TensorFlow Lite Micro 97.3% 20KB 12ms 52µJ 差距 -0.2% ↓40× ↓7× ↓15× CR2032 220mAh → \>600万次推理 → 6年续航(每小时1次) ---- 八、开源资源 内容 地址 训练脚本 https://github.com/tinyml-1kb/UltraTree Keil/IAR工程 同repo /mdk RTL级仿真 https://github.com/tinyml-1kb/rtl-decision-tree 数据生成器 支持任意CSV→512B树 ---- 九、未来 roadmap 1. 多分类:2bit类别,支持4分类,模型\<1KB 2. 增量学习:EMA在线更新阈值,免重新训练 3. 硬件固化:ASIC 40nm,0.1mm² 1KB ROM → Boot即AI ---- 十、结语 当AI被压缩到1KB,每一颗MCU都能拥有"决策力": 心律异常、跌倒检测、气体泄漏、电机异响...... 512B模型+512B代码,比Bootloader还小,却比浮点网络更准。 如果你也想把AI塞进BootROM,欢迎GitHub点星+提PR,一起把bit用到极限!