19.8MB的LLM:44M参数模型如何在CPU上跑出1900 tok/s

44M参数、19.8MB的SHADOW-50M用三元权重与固定电路记忆验证"分工优于堆参数"的端侧AI路线。
SHADOW-50M是Reddit开发者QLNI从零训练的44M参数语言模型,完整权重仅19.8MB,CPU上以约1900 tok/s运行。它通过两项核心设计实现极致压缩:将所有参数约束为{-1,0,+1}的三元权重,以及用512-bit固定指纹替代可训练词嵌入。更关键的是其设计哲学——计算交给确定性电路(通过特殊标记触发算术、日期、单位换算等模块),记忆交给磁盘注意力状态索引(1-bit精度存储,1微秒定位,无需向量数据库)。在标准benchmark上它不敌同量级的Supra-50M,但在精确计算和记录检索任务上表现出色,而同级模型则频繁产生幻觉。项目已MIT开源,内核可编译为WebAssembly在浏览器离线运行,也可作为大模型的推测解码草稿模型使用,为资源受限的端侧场景提供了一条非主流但有价值的技术路径。
一个完整模型只有19.8MB、在笔记本CPU上以约1900 tok/s运行、内存占用仅41MB——这不是压缩后的实验残片,而是一个从零训练、消化了450亿token的完整语言模型。Reddit开发者QLNI最近公开了SHADOW-50M(实际44M参数),试图回答一个非主流问题:当把计算能力和持久记忆从模型权重里剥离出去、单独处理时,一个极小的本地模型到底能装下多少有用的行为。
这不是一次比拼benchmark的尝试。作者自己在帖子里反复强调:"我不是说20MB的模型能打败正常的LLM,它做不到。"但正因为放弃了通用能力的竞赛,SHADOW展现出的工程思路反而更值得拆解。

三元权重与指纹词表:极致压缩的两个支点
SHADOW-50M的体积能压到19.8MB,靠的是两个关键设计。
第一是三元权重(ternary weights),所有参数被约束为 {-1, 0, +1} 三种取值。这与近年学界热议的1-bit/1.58-bit LLM思路一脉相承——用极低精度换取存储和推理速度。作者顺便做了对照实验:一个51.8M参数的Llama风格模型Supra-50M,bf16下103.6MB,8-bit量化后56.2MB,但降到int4困惑度就从165恶化到193,压到三元直接崩掉。这从侧面说明,三元权重不是随便量化就能得到的,而需要从训练阶段就针对性设计。
第二个支点更反直觉:SHADOW没有使用训练得到的embedding层,而是用固定的512-bit"指纹"来表示73880个token的词表,整张冻结表仅4.7MB。作为对比,Supra的词表只有32000个token。冻结指纹表带来一个训练embedding无法企及的特性——可以随时添加新词而不需要重新训练。
三元权重(Ternary Weights)的理论基础来自BitNet系列工作。传统神经网络使用float32或bfloat16存储参数,每个权重占2-4字节;而三元量化将所有权重限制为{-1, 0, +1},理论上每个参数只需1.58 bit(log₂3)。这意味着矩阵乘法可以退化为加减法和跳零操作,无需浮点乘法器,在专用硬件和CPU的SIMD指令下都能显著提速。关键挑战在于训练:直接将已训练的float32模型量化为三元精度会造成严重的精度损失,因此需要"从头三元训练"——在前向传播时使用三元近似,在反向传播时用直通估计器(Straight-Through Estimator)保持梯度流动,让模型从一开始就在三元约束下学习表示。这也解释了为何Supra-50M在事后量化时困惑度急剧恶化,而SHADOW能保持可用性能。
冻结词表的意外收获:直接补齐8600个缺失词
首个SHADOW-50M版本漏掉了约8600个英文词片,比如小写的"fitzgerald"会被错误地拆成"fitz"送进模型。作者尝试用微调来修复,结果每次学会新词都会破坏原有能力——这是神经网络灾难性遗忘的典型表现。
解决方案干净利落:直接往冻结指纹表里加了8600行,不训练、不改权重。结果是此前公布的34个答案全部保持不变,同时模型能读懂大量新词片。更有意思的是,这张指纹表在人类词相似度评测上拿到0.594的Spearman相关性,而随机编码只有-0.057——说明这些固定指纹本身携带了有意义的语义结构,而非随机哈希。
"训练出来的embedding无法在不训练的情况下接受成千上万的新行,但冻结表可以。"作者这句话点出了整个设计哲学:把可扩展性从参数里解放出来。
计算与记忆:交给专用电路而非权重
SHADOW最核心的创新在于,它不试图用神经网络权重去"记住"算术或存储事实。
当模型判断某处需要计算时,它会输出类似 [calc]347*86[eq] 的标记,然后一个固定电路在readout阶段接管,把正确的数字填进同一个token流。没有计算器API、没有工具调用、也没有把结果粘回prompt。作者为算术、百分比、日期、星期、单位换算、计数、排序、比较乃至一个小型程序机都做了电路。
记忆部分同样绕开了主流方案。存储一条记录时,模型读一次并把注意力状态以1-bit精度写到磁盘,每token占288字节。查询时用 [need] 标记触发索引,约1微秒定位记录,存储的注意力状态在约0.03ms内直接回灌进模型,文本不再重读。索引每token仅22字节,不用向量数据库、不用embedding模型。在1亿token规模下,档案库28.8GB加2.2GB索引在磁盘上,而进程内存靠memory-map只占约28MB——因为一次提问只触碰它需要的页。
索引还带一条持久轨迹:被用到的记录会在索引里被强化。在重复提问上,top-1命中率从0.571升到0.743,全程没有训练模型。
将注意力状态(attention states)而非文本直接写入磁盘是SHADOW记忆方案的核心创新,这与主流的RAG(检索增强生成)架构有本质区别。传统RAG在检索时需要将原始文本重新送入模型,经过完整的前向传播才能获得上下文表示,代价昂贵。SHADOW的做法是在"写入"阶段就把模型处理完文本后产生的中间注意力激活值序列化到磁盘,查询时跳过词元重读,直接把这些激活状态注入到对应的网络层——本质上相当于把"已读完这段文字"的模型内部状态缓存起来复用。以1-bit精度量化注意力状态(每token 288字节)是在存储效率与信息保真度之间的折衷,使得100M token的档案库仅需约28.8GB,且通过内存映射(mmap)实现按需加载,进程内存占用极低。这一思路与KV-Cache的扩展版本有相似之处,但被持久化到了磁盘,形成跨会话的永久记忆。
对比实测:benchmark输了,实际任务赢了
作者诚实地公布了短板。在标准评测上,Supra-50M全面领先:ARC-Easy 0.435对SHADOW的0.307,PIQA 0.600对0.570,WikiText-2困惑度165对186。
但真正体现设计意图的是实际任务对比。面对"我有3本书又买了5本,现在几本",SHADOW直接回答"8本",Supra却答成"书通常来自短篇小说、诗歌或其他文学形式的合集"。问"账单240美元的15%是多少",SHADOW答"36美元",Supra给出自相矛盾的"250美元……150美元"。查询已存储的"P-204患者情况",SHADOW从磁盘准确读回"哮喘",而把记录塞进prompt的Supra反而编造成"患者睡太多时会哮喘"。对不存在的Z-999患者,SHADOW明确回答"没有记录",Supra则开始胡诌免疫系统。
这组对比说明了SHADOW的定位:它不擅长开放知识和创作,但在需要精确计算和可靠检索的场景里,专用电路加持久记忆的路线比让小模型硬记要靠谱得多。
这组对比揭示了语言模型评测的一个深层矛盾:ARC、PIQA等标准benchmark测量的是模型从预训练语料中内化的世界知识和语言推理能力,对于一个只有44M参数、训练规模有限的模型而言,这类测试几乎注定处于劣势。而SHADOW刻意放弃的恰好是这部分能力,转而在"需要精确答案"的任务上借助外部确定性机制获得可靠性。这种取舍体现了一种工程哲学上的分歧:通用LLM试图用统计学习覆盖所有任务类型,包括计算和事实查询;而SHADOW认为对于有明确答案的任务,确定性算法天然优于概率推断,不应浪费神经网络的参数容量去学习乘法表或背诵具体事实。Supra-50M在记忆任务上的"幻觉"表现——把提示里给出的正确信息都能答错——也侧面说明,在极小参数规模下,强迫模型处理超出其能力边界的任务会导致不可预测的失败模式。
四个应用实验:小模型也能配大模型
作者搭了四个测试台,把这个20MB模型放到更大模型旁边协作。
最有意思的是视频记忆:Gemma 3 4B看一部十分钟短片、每两秒取一帧,写下298条描述如"M-0039时刻:一只胖乎乎的白兔伸手去够紫蝴蝶",然后Gemma退场。SHADOW把这298个时刻当作磁盘记忆保留,之后可以按编号、时间或画面内容提问,全程不需要影片也不需要Gemma,在约42MB内存的笔记本上跑出55-56/60的成绩。
另外三个实验:1600条记录的库存查询拿到159/160,且20个关于从未存储物品的问题全部正确返回"无记录";SHADOW作为Qwen3-32B的draft model,把llama.cpp生成速度从19.7提到28.5 tok/s,而Qwen仍决定每个最终token;一个MCP记忆服务器让Qwen3-14B在对话中途存事实、之后检索5/5命中并引用原始记录。
同一个内核编译成WebAssembly后能在浏览器标签页里以约500 tok/s运行,完全离线。更出人意料的是,一位名为engram-forge的贡献者提交了一个PR,里面除了CUDA引擎和量化教程,还有一只把SHADOW塞进去的会说话的佩奇毛绒玩具——约35美元的板子加麦克风扬声器,本地生成回答,无云端、无账号、无联网。作者因无法独自验证那约11000行CUDA代码而尚未合并。
SHADOW作为draft model加速Qwen3-32B的场景,采用的是推测解码(Speculative Decoding)技术。其原理是:用一个小型"草稿模型"快速生成若干候选token,再交给大型"目标模型"一次性并行验证——由于验证的计算量远小于自回归生成,只要草稿模型的预测接受率足够高,整体吞吐就能提升。理论加速比取决于草稿接受率:若草稿连续猜对k个token,等效于大模型"免费"获得了k步。SHADOW作为草稿模型的成功说明,即便它的语言能力不及Qwen3-32B,两者在词汇分布上仍有足够重叠,能达到有效的加速效果(19.7→28.5 tok/s,约45%提升)。这也说明极小模型在大模型推理加速这一特定角色上有实际价值,而非仅作为独立助手使用。
局限与开源
作者把缺点也写进了仓库:通用知识薄弱,创意写作糟糕,七位数运算有时会抄错,大档案库偶尔会把无关记录拉进带数字的问题里。
整个项目采用MIT许可,主权重和微调/导出工具包已公开,浏览器演示可直接体验。作者表示接下来会发布训练代码、数据集、冻结表以及一份包含成本、失败实验和错误的完整技术记录。
SHADOW-50M的价值不在于跑分,而在于它验证了一条被主流忽视的路径:与其让越来越大的模型什么都自己扛,不如把计算交给确定性电路、把记忆交给磁盘索引,让神经网络专注于它真正擅长的语言理解。对于端侧AI和离线场景,这种"分工"思路可能比无脑堆参数更有想象空间。
相关推荐

对抗AI代码腐化:规格、结果笔记与文件清单的实战方法
一位开发者用八个月、650次提交、4.3万行代码的实战,总结出防止AI智能体代码库腐化的方法:前置规格与验收标准、任务结果笔记、文件清单约束,以及用触发式钩子取代规则文件。核心洞察是——指令只是建议,机制才能在长会话中存活。

"Tokens Exhausted":一段机器人视频背后的AI焦虑
一段名为「Tokens Exhausted」的机器人视频在 Reddit 引发热议,网友已分不清它是否为波士顿动力真实作品。本文解析这段AI讽刺内容为何戳中神经,以及它折射出的合成媒体与LLM时代焦虑。

4千美元淘到全新DGX Spark:本地部署大模型的性价比之选
一位Reddit用户以4000美元在Craigslist淘到全新DGX Spark,用于本地托管AI模型。本文解析这笔交易背后的性价比、二手交易安全,以及本地部署大模型的兴起趋势。