)
00 · 在 ESP32-P4 上跑通 LLM从 0.61 到 4.31 tok/s 的 7 倍优化全复盘系列总览本篇对应源码仓库根目录 ——README.md·main/kmcu.c·tools/convert_minueza.py·docs/milestones.md在ESP32-P4RISC-V上跑通一个 0.032B22.8M 参数Mistral 家族小模型并用私有 PIE 向量指令把 decode 加速 7× 的完整复盘。一、这套文章解决什么问题这是一份可复现的系列手记覆盖从「零环境」到「0.032B 模型在 MCU 上 20/20 正确解码」的完整路径尤其把过程中踩过的每一个坑和每一个 bug都记录了下来。适合读者想在 ESP32-P4 上跑 LLM 推理的嵌入式工程师想了解「MCU 上量化 手写 SIMD」全流程的算法/性能工程师想复现本项目、或移植到其他 RISC-V MCU 的人。二、最终成果先看结果里程碑速度说明M2标量起点1.63 s/token0.61 tok/sq4 逐元素反量化正确但慢M3-1q4→int8 展开1.11 s/token0.90 tok/s装载期展开M3-2行对齐 -O20.511 s/token1.96 tok/s修正了 -Og 的隐蔽压制M3-3fp16→fp320.489 s/token2.04 tok/s无损4%M3-4PIE 定点 GEMV0.232 s/token4.31 tok/s累计 7.0×正确性20/20 token 与 PC 的 fp32 NumPy 参考完全一致int16 激活量化对 argmax 零影响。硬件Waveshare ESP32-P4-WIFI6-DEV-KITSKU 32054—— RISC-V 双核 400 MHz、32 MB PSRAM、16 MB NOR Flash。对拍金标准速览复现时用来核对single-token[1] argmax 684 PC 参考 logit5.350636 4-token prompt 末位 top1 23624 PC 参考 logit4.978983 20-token 贪心序列 1,450,2217,4996,23624,1199,8752,23624,1199,1199,8752,23624,1199,10436,23624,1199,3065,3161,4865,442PIE 单算子 bench板端dotprod N4096 match1 speedup20.97x纯计算 gemv_row diff0.000000e00分块 GEMV 逐位一致实跑复现2026-09-28ESP32-P4 rev v3.1dotprod match1与gemv_row diff0.000000e00可逐位复现speedup随运行浮动重跑得20.83x。同理 M3-4 的 decode 速率在0.226–0.232 s/token4.33–4.42 tok/s间浮动表中 0.232 s/token 是其中一次读数。完整 top-8 logits 见 02 篇「完整基准输出」。三、模型Felladrin/Minueza-32M-BaseMistral 家族layers10, dim312, heads12, kv_heads4, head_dim26, ffn1092, vocab32002 参数量 22.81M--force-tie 强制权重共享Q4_0 量化后 12.58 MB四、快速开始最小命令集如果你只想最快跑起来按顺序执行# 1) 环境详见 01-环境搭建与构建.mdsubst X:%USERPROFILE%\.espressif$env:IDF_TOOLS_PATH X:\$env:IDF_SKIP_CHECK_SUBMODULES 1.E:\esp-idf\export.ps1$env:PATH X:\python_env\idf6.0_py3.12_env\Scripts;$env:PATH# 2) 转换模型详见 02-模型量化与KMCU格式.md# 在仓库根目录执行模型与产物统一放 models\ 子目录cd kestrel_mcu python tools\convert_minueza.py--src models\model_dir--out models\model.kmcu--force-tie python tools\ref_forward.py--km models\model.kmcu--ref_out models\ref_out.txt# 3) 构建 烧录构建副本必须在纯 ASCII 路径 C:\kmcu例如 C:\kmcucd C:\kmcu idf.py build idf.py-p COM5 flash# 4) 烧录模型分区一次性python-m esptool--chip esp32p4-p COM5-b 921600--before default-reset--after hard-resetwrite-flash0x210000 models\model.kmcu# 5) 监视输出idf.py-p COM5 monitor五、文章导航篇内容适合01-环境搭建与构建ESP-IDF v6.0.2 从零搭建 全部环境坑复现第一步必读02-模型量化与KMCU格式q4_0 量化、行对齐、KMCU v1 二进制格式想改模型/格式的人03-标量推理内核kmcu.c 的 decode 实现 TF 卡 M2想改推理逻辑的人04-性能优化全历程M3-1→M3-4 每次优化的动机与实测想做性能的人05-PIE汇编实战手写 xespv 汇编 两个致命 bug想用 PIE 的人06-踩坑速查表所有坑的汇总速查遇到问题先查这里07-训练流程总览与结论训练侧全地图 各技术点闸门判定想知道模型怎么训出来的人08-经典全量预训练失败归因 阶段 0 全量训练突破 ppl 8.73想复现训练的人09-公理库底座与λ过渡路由SHS-2/3/T LambdaMoE λ 退火想懂框架特色的人10-MoE稀疏化实战结构蒸馏失败 → 全量 MoE ffn_e 扫描想训 MoE 的人11-量化感知QAT vs PTQPTQ 0.9% 足够想做量化的人12-逐层适配优化逐层量化的公理底座与落地路径想跑大模型的人13-MoE部署衔接缺口convert 内核的 MoE 支持缺口想打通端到端的人14-架构寻路与PLE12 个优化判否全历程 → 发现并验证 PLE 正解想做「更大模型」的人15-三值量化变种全模型三值判否 → 局部三值PLE table成立 → ReLU² 判否想做极致压缩的人16-PLE落地验证dim 312 真实配置下 PLE 成立 三值几乎无损想落地 PLE 的人17-MoE框架下的PLE实现MoEFFN 实现 MoE 与 PLE 正交共存 完整配方验证想做完整配方的人18-对标PFor与esp32-ai与 PFor / esp32-ai 的技术级横向对比 借鉴与独有差异想外部校准配方的人19-PLE部署落地PLE 三值查表 tied head 上板DT_TERNARY 格式 内核 堆溢出 bug想打通 PLE 部署的人20-PLE为什么不加速PLE 收益在容量不在速度读量归因 tied 只省存储不省读量想知道速度真相的人21-PFor选择速度我们选择质量速度 vs 质量零和博弈PFor 三值换速度、我们 q4 换质量想懂设计取舍的人22-正式训练与端到端闭环FineWeb-Edu 正式训练ppl 37.13 部署对拍 20/20想复现完整配方的人23-规模线与PLE-table本质更大模型「大」在哪 PLE table 到底是不是知识库想懂规模线本质的人24-决策头vs生成头Jev/Laya 启示决策任务用「决策头」而非「生成头」读量省 16000×想做 MCU 决策的人25-双头融合-该判断时判断该输出时输出决策头生成头融合框架三种形态 元决策 agent 循环想建统一模型的人26-观察回接-Agent循环观察回接核心机制λ 框架 截断观察回接 增量 KV 位级一致性想做 MCU agent 循环的人27-map直挂缓存判否mmap 直挂 flash 带宽基准14MB/s 是 PSRAM 1/7.6大模型直挂判否想省 PSRAM 装更大模型的人六、关键结论提炼PIE 是纯定点 SIMD没有 fp32 向量指令乐鑫源码铁证。要加速int8 权重 × fp32 激活的 GEMV唯一路径是激活定点化w8a16。实测胜于推论纯计算加速 21×但接入后被 PSRAM 带宽墙~84–106 MB/s压到2.11×。-Og是隐形杀手ESP-IDF 默认 debug 优化级会系统性压低性能读数M1/M2/M3-1 的数据都被它污染过。两个 PIE 硬约束标量操作数不能用 t0-t2 寄存器、向量加载需 16 字节对齐——不满足会得到「随机数据对拍正确、真实数据全错」的诡异现象。七、项目文件索引kestrel-llm-mcu/ # https://gitee.com/pei-xiaoguang/kestrel-llm-mcu ├── main/ 固件 │ ├── main.c # 入口SHS 自检 PSRAM/TF 探针 模型加载 decode PIE bench 三模式 │ ├── kmcu.c / kmcu.h # KMCU 权重读取 标量/PIE Transformer decode 决策头 agent 循环 │ ├── pie_dotprod.S # PIExespv定点 GEMV 汇编 │ └── CMakeLists.txt ├── tools/ 宿主侧工具链详见 tools/README.md │ ├── mistral_ple.py # 架构唯一权威源MistralPLE │ ├── convert_minueza.py# HF safetensors → KMCU 量化权重 │ ├── ref_forward.py # PC 端 fp32 NumPy 参考唯一对拍基准 │ ├── train_moe_ple.py # 训练 │ ├── watch_boot.py # 复位 boot 日志监视 │ ├── upload_uart.py # UART 上传experimental │ └── legacy/ # 归档的历史研究脚本含本文系列早期用到的 train_moe*.py 等 ├── docs/ 设计文档 开发日志中英双版 ├── host_verify.c # PC 侧对拍程序编译同一份 kmcu.c ├── partitions.csv # Flash 布局app 2 MB / model 13.87 MB ├── sdkconfig.defaults # 关键配置-O2、Newlib、PSRAM hex、关 WDT └── LICENSE / NOTICE # Apache-2.0 第三方声明注GitHupSRC/vLLM-Kestrel 引擎与kestrel_mcu/是两个独立项目本系列只讲kestrel_mcu/这一条独立 determinism line不涉及引擎源码。对应源码全系列总表每篇文末都有一节「对应源码」给出该篇的符号级映射文件 函数/宏 它支撑文中的哪部分结论。下表是系列导航级的速查想直接读代码从这里进。篇主要源码00 总览与阅读指南README.md·docs/milestones.md01 环境搭建与构建sdkconfig.defaults·partitions.csv·main/main.c·CMakeLists.txt02 模型量化与 KMCU 格式tools/convert_minueza.py·main/kmcu.h·tools/ref_forward.py03 标量推理内核main/kmcu.c·main/kmcu.h·host_verify.c04 性能优化全历程main/main.c·main/kmcu.c·main/pie_dotprod.S05 PIE 汇编实战main/pie_dotprod.S·main/main.c06 踩坑速查表main/kmcu.c·main/main.c·sdkconfig.defaults07 训练流程总览与结论tools/mistral_ple.py·tools/train_moe_ple.py·docs/lambda_transition_framework.md08 经典全量预训练tools/legacy/full_finetune.py·tools/mistral_ple.py09 公理库底座与 λ 过渡路由docs/lambda_transition_framework.md·tools/legacy/train_moe.py·tools/legacy/train_lambda.py10 MoE 稀疏化实战tools/legacy/train_moe.py·tools/legacy/train_lambda.py·docs/moe_framework.md11 量化感知tools/legacy/train_moe_qat.py·tools/legacy/verify_q2.py·tools/convert_minueza.py12 逐层适配优化docs/layerwise_adaptation.md·tools/legacy/train_moe_qat.py13 MoE 部署衔接缺口main/kmcu.c·main/kmcu.h·docs/moe_framework.md14 架构寻路与 PLEtools/mistral_ple.py·tools/legacy/dense_baseline.py15 三值量化变种tools/mistral_ple.py·tools/convert_minueza.py·main/kmcu.c16 PLE 落地验证tools/mistral_ple.py·tools/train_moe_ple.py17 MoE 框架下的 PLE 实现tools/mistral_ple.py·tools/train_moe_ple.py·docs/moe_framework.md18 对标 PFor 与 esp32-aiREADME.md·docs/milestones.md19 PLE 部署落地tools/convert_minueza.py·main/kmcu.c·host_verify.c20 PLE 为什么不加速main/kmcu.c·docs/milestones.md21 PFor 选择速度我们选择质量docs/milestones.md·README.md22 正式训练与端到端闭环tools/train_moe_ple.py·tools/convert_minueza.py·tools/ref_forward.py·host_verify.c23 规模线与 PLE-table 本质tools/mistral_ple.py·docs/milestones.md24 决策头 vs 生成头main/kmcu.c·main/main.c·docs/agent_loop_router.md25 双头融合main/main.c·main/kmcu.c·docs/agent_loop_router.md26 观察回接-Agent 循环main/kmcu.c·main/kmcu.h·docs/agent_loop_router.md27 map 直挂缓存判否main/main.c·main/kmcu.h·docs/milestones.md注09 与 15 篇引用的axiom_registry.json为内部文件未随本仓库发布。对应源码文件关键符号 / 位置支撑本文哪部分README.mdHighlights (measured)、Repository layout§二 最终成果、§四 快速开始docs/milestones.mdM1 / M2 / M3-x 全部小节§二 M2→M3-4 各档实测数据main/main.cshs_selftest()、probe_psram()、probe_sdcard()、model_test()§四 第 3/4/5 步的板端自检与模型加载tools/convert_minueza.pySRC_DIR/OUT_PATHKMCU_SRC/KMCU_OUT环境变量§四 第 2 步转换命令仓库https://gitee.com/pei-xiaoguang/kestrel-llm-mcu