模型 / 数据集
skyzh/tiny-llm avatar
skyzh/tiny-llm

tiny-llm:在 Apple Silicon 上从零搭建 Qwen3 推理系统

learn LLM inference system on Apple Silicon for systems engineers: build a tiny vLLM + Qwen

4,567 个 Star381 个 ForkPythonApache-2.0

秒懂

它是什么?
tiny-llm 是面向系统工程师的 LLM 推理课程,用 MLX 和 Qwen3-4B 在 Apple Silicon 上逐步实现一个迷你 vLLM。本文评估其教学路径、代码结构、当前完成度与适用人群。
适合谁用?
tiny-llm 适合那些已经熟悉系统软件、但想进入 LLM 推理领域的工程师。如果你能接受 MLX 与 Metal 的绑定,并且愿意花四周时间从头实现算子而不是调用现成库,这个课程提供的练习深度和代码可读性都很高。
能商用吗?
可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库在最近一天内有新的提交。
用什么语言写的?
主要是 Python(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

这门课解决什么问题

很多系统工程师想理解 LLM 推理,但面对的是 vLLM 或 TensorRT-LLM 这样的大型代码库。这些项目为了性能和通用性做了大量抽象,新手很难把矩阵乘法、KV cache、连续批处理这些概念对应到实际代码里。tiny-llm 把这条路径拆成一个可以完整阅读的小型实现。课程目标是让学习者从 `mlx.core` 的数组操作开始,逐步构建一个能加载 Qwen3-4B、把 token 变成 logits、并生成文本的系统。它定位为 LLM serving 领域的 Needle 项目,也就是 CMU 深度学习课程中那个从零实现自动微分的练习。tiny-llm 的约束很明确:只用 MLX 数组和扩展运行时,不使用高层神经网络层。当某个算子被教到时,学习者要在 Python、C++ 或 Metal 中自己实现它,而不是调用 MLX 里对应的优化版本。MLX 的现成实现只作为正确性对照和性能基准。

四周路径:从算子到调度器

课程按四周划分,每章围绕一个具体的系统组件。第一周从矩阵乘法走到文本生成,覆盖注意力、RoPE、GQA、RMSNorm、MLP、采样和自回归循环。第二周加入 KV cache,建立同步的 MLX 基线,然后用匹配的基准测试来驱动优化决策,内容从量化 decode matvec 到融合模型内核、分块 prefill 和 split-K。第三周引入连续批处理和分块准入,然后把 paged KV 作为 serving 的标准布局。decode attention 和 FlashAttention 被改造成直接读取页,这样调度器不需要每一步都重建稠密历史。第四周转向构建编码 agent,内容涉及有边界的验证循环、检查点恢复、上下文压缩和工具结果绑定。这个顺序不是随意的。每个组件都在前一个组件暴露性能瓶颈时才被引入,而不是一次性把所有 serving 机制堆给学习者。

为何选 MLX 和 Qwen3

选择 Apple Silicon 作为目标平台有实际原因。MLX 利用统一内存空间,Metal 内核可以直接访问,学习者在一台机器上就能检查完整路径,不需要依赖昂贵的 CUDA GPU。Qwen3-4B 的规模经过挑选:它足够大,能暴露真实的权重带宽、注意力和缓存开销,但又小到可以在本地迭代。这个模型带有分组查询注意力、QK 归一化、BF16 激活和 4-bit 权重,这些特性与当前主流模型服务的工作很接近。README 明确说,课程不覆盖量化之外的其他主题。这意味着 MoE 和投机解码虽然在第 3.6 和 3.7 章出现,但被标记为可选。课程的核心是让学习者理解 serving 系统的机制,而不是覆盖所有可能的优化技术。

代码布局与运行方式

仓库结构把练习和参考实现分开。`tiny_llm` 包是学习者实现练习的地方,`tiny_llm_ref` 包含测试和基准附录使用的参考解。安装和验证流程很直接。先用 `pdm install -v` 安装依赖,然后运行 `pdm run check-installation` 验证环境,最后用 `pdm run test-refsol -- -k week_1` 跑第一周的参考解测试。书籍本身发布在 skyzh.github.io/tiny-llm,环境搭建说明在 setup.html。章节顺序记录在 book/src/SUMMARY.md。这种布局让学习者可以对照参考实现检查自己的代码,同时测试命令明确指定了周次,方便按进度验证。

完成度与审核状态

课程仍在发布中,完成度并不均匀。仓库中的路线图表格显示,Week 1 的七个章节在代码、测试、文档和审核四列都是完成的。Week 2 和 Week 3 的代码和测试已完成,但文档列标记为待审核。Week 4 的发布方式不同,它逐日发布经过审核的内容,目前到 Day 9。表格里有一个值得注意的区分:Audit 列反映的是 Chi 对已发布课程内容的个人编辑审查,与代码和测试的完成度无关。这意味着一个章节的代码和测试可能已经就绪,但面向学习者的文字材料还没经过最终审阅。对于想要完整学习体验的人来说,Week 2 和 Week 3 的文档部分可能还在变动。Week 4 的内容描述相当具体,比如 Day 5 压缩模型可见转录中的旧完成效果,同时保留精确回执,Day 9 把超大的工具结果字节存储在模型提示之外,只显示有界的摘要。这些设计针对的是 agent 循环中的状态管理问题,而不是推理性能。

局限与不适用场景

tiny-llm 的约束同时也是它的局限。课程绑定 Apple Silicon 和 MLX,这意味着在 NVIDIA GPU 上工作的工程师无法直接复用这里的代码模式。Metal 内核和 MLX 扩展运行时是特定的技术栈,与 CUDA 生态不互通。另一个限制是课程范围。README 明确说其他主题不在覆盖范围内,比如量化之外的技术。MoE 和投机解码虽然列出,但是可选的,可能没有与核心章节相同深度的练习。第四周的 agent 内容有一个明显的前提条件:运行循环前需要阅读 Week 4 概述,并使用没有密钥的一次性工作区。Day 3 可以发送文件内容给模型、在批准后修改文件并运行一个配置好的命令,这种能力在有真实工作区时存在风险。课程的设计假设学习者会遵守这些限制。对于想快速评估多个 serving 框架差异的人,这门课太深太慢。对于只想用现成 API 跑通 Qwen3 的人,它完全不合适。

与同类项目的差异

README 把 tiny-llm 定位为 LLM serving 领域的 Needle 项目。Needle 是 CMU 课程中从零实现自动微分系统的练习,重点在深度学习训练的基础算子。tiny-llm 走的是另一条路:它不要求实现训练,而是实现推理路径上的 serving 机制。与直接阅读 vLLM 源码相比,tiny-llm 的规模小得多,可以端到端读完。vLLM 是生产级系统,包含大量性能优化和兼容性处理,代码量庞大。tiny-llm 选择用 MLX 而不是 PyTorch 或 CUDA,这让它能在 Apple Silicon 上运行,但代价是偏离了主流部署环境。另一个隐含的对比对象是 Qwen 官方提供的推理脚本。那些脚本调用现成的优化算子,用户看不到中间的内存流量和调度决策。tiny-llm 要求学习者自己实现这些算子,所以能看到每个步骤的成本。这种差异决定了课程的价值:它不是使用手册,而是系统解剖课。

编辑结论

tiny-llm 适合那些已经熟悉系统软件、但想进入 LLM 推理领域的工程师。如果你能接受 MLX 与 Metal 的绑定,并且愿意花四周时间从头实现算子而不是调用现成库,这个课程提供的练习深度和代码可读性都很高。不适合需要快速部署推理服务的人,也不适合没有 C++ 或 Metal 基础的学习者。建议先确认 Week 1 的七个章节已经全部完成并经过审核,再决定是否投入时间。Week 2 和 Week 3 的文档部分仍标记为待审核,这部分内容的教学质量尚未经过独立确认。在开始前,先用 `pdm run check-installation` 验证环境,并查看 book/src/SUMMARY.md 了解章节顺序。课程采用 Apache-2.0 许可证,代码和文档可以自由使用,但 Week 4 的内容仍在逐日发布,目前只到 Day 9。

官方来源

  1. Issues
  2. License: Apache-2.0
  3. Project website
  4. README
  5. skyzh/tiny-llm on GitHub
社区笔记

社区笔记