开源
开发者用纯 C 从零写 Qwen 3 CPU 推理引擎
一名开发者用约一周半时间,从零用纯 C 为 Qwen 3(≤4B)写了一个仅依赖 libc/libm/cJSON 的 C…
2026.06.28 · 周日约 3 分钟阅读评分 31
评分细项加权总分 31
- 重要性
- 25
- 新颖性
- 35
- 影响面
- 20
- 可信度
- 55
- 实质性
- 40
一名独立开发者近日在 GitHub 上开源了一个面向 Qwen 3 系列(≤4B)的纯 C 语言 CPU 推理引擎,项目以「教学优先」为目标,强调代码可读性而非极致性能。仓库附带说明文档与聊天界面,作者将其定位为一份「可以从中学到东西」的参考实现,而非生产级运行时。
项目概况
- 支持模型:Qwen 3 系列中 4B 及以下的较小尺寸版本。
- 语言与依赖:纯 C 实现,仅依赖 libc、libm 与 cJSON;如启用并行则额外依赖 OpenMP。
- 权重加载:直接读取 Hugging Face 上的 safetensors 权重,加载时即时进行 4-bit affine 量化,无需额外预处理脚本。
- 配套能力:内置 KV 缓存与简易聊天界面,编译即可运行。
- 性能基线:在 i5-1240P(16 线程,CPU 算力大致对标 Apple M1)上仅约 1 token/s,作者本人也明确表示「非常慢」。
关键设计取舍
作者在博客中坦率列出了几项贯穿开发过程的取舍,构成了这份代码的「气质底色」:
- 正确性优先于性能:代码中遍布 assert 作为运行时护栏,作者称开发期间几乎未触发,但能避免在睡眠不足时写出离奇的 bug。
- 最大化自研比例:除 C 标准库与 cJSON 外,不引入外部代码或库,也不使用 LLM 生成代码;所有实现思路与编码均由作者本人完成。
- 零外部预处理:与同类 qwen3.c 项目需要先转换为专用二进制权重不同,本项目直接消费原始 BF16 safetensors,边加载边量化,做到「下载权重、编译、即跑」。
- 可读性优先:刻意避免对缓存局部性与编译器优化不友好的写法,即使牺牲速度,也要让读者能跟得上思路。
与同类项目的差异
作者在文中直接对标了 adriancable/qwen3.c:后者追求极致紧凑与高性能,指针算术与并行 MHA 循环对读者的 C 功底与领域知识要求较高;而本项目则反向选择,把「学习曲线平缓」作为首要目标,牺牲速度换取可读性,更适合希望理解推理全流程的初学者。
局限与适用场景
由于同时放弃了预处理流水线、缓存友好的数据布局以及高度手调的指针优化,即便开启 OpenMP 并行,该引擎的吞吐也仅停留在演示级(约 1 token/s)。其真正的价值在于:把 tokenizer、Transformer 数学、KV 缓存、量化等关键概念,以相对直白的方式串联在一份不到千行的纯 C 源码中。对于希望从底层理解 LLM 推理原理、但又不想直接啃 llama.c / qwen3.c 这类高度优化代码的读者,这是一个可上手的起点。
