最近关注到不少小伙伴在折腾 ESP32-S3尤其是 N16R8 这种带 8MB PSRAM 的高配版本。更有人在讨论一个挺有冲击力的话题能不能在 8 美元级别的 ESP32-S3 上训练一个小型语言模型SLM。这个标题确实吸引人但“训练”这个词放到单片机场景里跟服务器上跑 PyTorch 完全是两码事。本文就围绕这个主题展开先帮大家把硬件能力、SLM 概念、内存算力账本理清楚再给出一条完整可复现的实战路径从 PC 端训练一个字符级 SLM到把权重导出为 C 头文件最后部署到 ESP32-S3 上做文本生成。顺便也会聊一聊板端训练的实验思路和限制。无论你是刚开始接触嵌入式 AI还是手头正好有一块 ESP32-S3-N16R8 开发板想利用起来这篇文章都能直接照着做。1. 为什么是 8 美元的 ESP32-S31.1 ESP32-S3 和 N16R8 到底是什么ESP32-S3 是乐鑫推出的一款双核 MCU核心是 Xtensa LX7主频最高 240MHz。它和普通单片机最大的区别在于三点带向量数学指令、支持 8MB PSRAM 外扩、同时集成 Wi-Fi 与 BLE。N16R8 是这个系列里非常常见的一个模组型号名字本身就是规格表N16板载 16MB Flash用于存放固件、模型权重和文件系统。R8板载 8MB Octal PSRAM这是能跑 AI 模型的关键普通的 SRAM 只有 512KB根本放不下模型参数。市面上常见的 ESP32-S3 开发板比如乐鑫官方 DevKitC、立创实战派等很多都采用 N16R8 配置。价格在不同渠道波动不小但网上确实能看到 8 美元折合人民币 50 元上下级别的板子这也是为什么大家对它跑 SLM 这么感兴趣。1.2 为什么 ESP32-S3 适合跑 SLM以前想在单片机上跑人工智能基本只能做非常小的 CNN 图像分类或者关键词唤醒。原因是内存太小一个几 MB 的模型就放不下了。ESP32-S3 借助 PSRAM 把可用内存扩大到 8MB这使得一些小型语言模型可以在板端完成推理。除了内存软件生态也很关键ESP-IDF 官方框架支持组件丰富。Arduino-ESP32 对 S3 支持成熟开发门槛低。乐鑫提供了 ESP-DL、ESP-NN 等神经网络加速库。TensorFlow Lite Micro 也有对应的 ESP32-S3 移植。再加上它自带 Wi-Fi 和 BLE模型训练所需的数据采集、结果回传、远程调试都能通过无线链路完成。这也是“无线 AI 调试器”这类玩法的硬件基础。1.3 一个容易被误读的标题“An SLM trained on $8 ESP32-S3”这个标题很多人第一反应是像 ChatGPT 那样的大模型在单片机上训练。这其实是不可能的后面会详细算账。更合理的理解是SLM 指的是小型语言模型Small Language Model不是动辄几十亿参数的大模型。训练的完整过程可能发生在 PC/云端ESP32-S3 负责推理和交互。如果一定要在板端做训练那只能是几万参数级别的玩具模型或者用在线学习思路做局部微调。搞清楚这个边界后面看代码就不会困惑了。2. SLM 概念从大模型到微型模型2.1 LLM、SLM、微型模型的区别先统一一下术语。LLMLarge Language Model参数量通常在几十亿到几千亿比如 GPT、Llama 系列。训练需要成千上万张 GPU。SLMSmall Language Model参数量在几亿到几十亿之间比如 Phi-2、TinyLlama 这类单张工业级显卡甚至高端消费级显卡可以微调推理可以上手机。微型模型Tiny Model / Micro Model参数量从几千到几百万运行在 MCU 级别硬件上比如我们用 ESP32-S3 跑的字符级模型。换句话说本文里说的 SLM是“微型模型”这个级别。它做不了复杂对话但可以完成一些受限任务比如字符级文本生成、命令词预测、传感器时序建模等。2.2 语言模型的基本工作流程几乎所有语言模型的核心思路都一样给定前面的 token字或词预测下一个 token。以字符级模型为例输入一句话的前 N 个字符。模型把字符转成数字经过若干层计算。输出每个候选字符的概率分布。生成按概率采样一个字符拼到句子末尾再继续预测下一个。整个过程在 ESP32-S3 上就是矩阵乘法和激活函数的计算这也是为什么模型足够小之后单片机可以实时跑。2.3 模型是怎么被“训练”出来的训练的本质是让模型输出的概率分布尽量接近真实数据。做法是拿大量文本样本计算模型预测和真实下一个字符之间的差距这个差距叫损失loss然后通过反向传播求出每个参数的梯度再用梯度下降更新参数。训练比推理贵在哪推理只需要做一次前向计算而训练要先前向、再反向反向传播的计算量大约是前向的两到三倍还要额外保存中间激活值。对于嵌入式设备来说内存和算力都是硬约束。3. 在 ESP32-S3 上训练模型到底行不行3.1 内存账本512KB SRAM 8MB PSRAM先把内存账算清楚。数据项大小估算说明SRAM512KB实际可用约 300-400KB用于堆栈、运行时变量PSRAM8MB模型权重、训练激活值、缓存都可放这里100 万参数模型 float324MB8MB PSRAM 可以放下100 万参数模型 int81MB量化后体积降为 1/4训练反向传播额外开销2-3 倍权重体积梯度、优化器状态、激活值一个 Transformer 层的激活值与序列长度成正相关序列越长越吃内存从内存角度看如果模型只有几万参数float32 也不过几百 KB板端训练是放得下的。但如果模型到百万参数训练时的梯度加上优化器状态就会逼近甚至超过 8MB非常紧张。3.2 算力账本240MHz 双核能做多少事算力方面ESP32-S3 虽然有向量指令但它不是专门的 NPU。对于几万参数的全连接模型单步训练也就是几万次乘加运算放在 240MHz 主频上可以跑几千步训练虽然慢但作为实验可以等待。可如果换成真正的 Transformer计算量会放大几个数量级。哪怕只是 100 万参数的模型一次前向加反向也要上百万次乘加迭代几千步之后等待时间会从分钟级变成小时级甚至更长。所以现实项目里没有人会真的在板端从零训练一个像样的语言模型。3.3 三条可行技术路线结合内存和算力限制实际可行的路线有三条路线 APC 训练 板端推理推荐在 PC 上用 Python 完成模型训练把训练好的权重导出成 C 头文件或二进制文件烧录到 ESP32-S3 里只做推理。这是目前最成熟、最实用的方案也是下文实战部分重点演示的路线。路线 B板端在线学习/微调实验性质把前向、反向、参数更新全部写成 C 代码烧进板子用板端采集的数据做单样本 SGD随机梯度下降。适合展示“边缘学习”的概念不建议生产使用。路线 C板端采集 云端/PC 训练 OTA 回传混合架构ESP32-S3 负责采集传感器或交互数据通过 Wi-Fi 或 BLE 回传到 PC/服务器PC 完成训练后把新权重通过 OTA 下发。这样既利用板子的无线能力又避开算力瓶颈是 IoT 设备做模型更新的主流思路。三条路线中本文会重点实现路线 A然后给出路线 B 的核心代码思路。4. 环境准备与开发板选择4.1 硬件清单ESP32-S3-N16R8 开发板一块推荐常见 DevKitC 或立创实战派。USB-C 数据线一根注意要支持数据不要用只能充电的线。电脑一台Windows / Linux / macOS 均可。4.2 软件环境本文的完整链路涉及两端PC 端Python 3.10 或更高版本。numpy 库用于训练小型模型不依赖 PyTorch 也能跑通。ESP32-S3 端Arduino IDE 2.x安装 esp32 开发板支持包。esp32 支持包建议使用 2.0.14 或更新的稳定版本不同主版本在编译选项上略有差异。如果你更习惯职业化开发