tinygrad 完全解析:极简、可 hack 的深度学习框架
项目介绍:介于 PyTorch 与 micrograd 之间的“玩具”内核
在深度学习框架的版图上,PyTorch 占据了易用性高地,TensorFlow 统治着生产部署,而 JAX 则代表着函数式编程的未来。然而,这些框架的代码库动辄数十万行,内部实现极其复杂,让想要深入理解深度学习底层原理的开发者望而却步。
tinygrad的出现,正是为了填补这一空白。它由知名黑客 George Hotz(geohot)创建,是一个端到端深度学习堆栈,包含自动微分、张量库、JIT 编译器、优化器、神经网络层和数据加载器,但全部代码只有约 4 万行(核心部分甚至更少)。它的设计哲学是“保持小巧,易于阅读,极度可 hack”,让你能够像理解 micrograd 一样,彻底掌握一个现代深度学习框架的工作机制。
tinygrad 的名字本身就暗示了它的定位:比 PyTorch 更小,比 micrograd 更完整。它不仅是教学工具,更是一个真正可用的训练框架——你可以用它训练 MNIST 分类器(98% 准确率,仅需 5 秒),也可以在其上构建 GPT 等现代模型。更重要的是,它支持 CPU、GPU(CUDA/Metal/OpenCL)、AMD、Qualcomm 等多种硬件,并通过 JIT 编译生成高性能内核。
核心特性:极简、统一、可编译
轻量级张量库与自动微分
tinygrad 的核心是Tensor类,它支持所有常见的张量操作(点积、reshape、卷积等),并内置自动微分。与 PyTorch 的 API 高度相似,让你可以无缝迁移代码。
from tinygrad import Tensor x = Tensor.eye(3, requires_grad=True) y = Tensor([[2.0, 0, -2.0]], requires_grad=True) z = y.matmul(x).sum() z.backward() print(x.grad.tolist()) # dz/dx print(y.grad.tolist()) # dz/dy函数式 JIT 与懒执行
tinygrad 采用了与 JAX 相似的函数式 JIT 编译。通过TinyJit装饰器,可以将一个函数编译为高效的设备内核。更重要的是,tinygrad 是懒执行的——计算图不会立即执行,而是先构建 IR,最后通过编译器生成内核,并在需要时触发计算。这种设计使得内核融合成为可能,例如矩阵乘法可以被编译成单个高性能 kernel,而不是多个串行操作。
from tinygrad import Tensor, TinyJit @TinyJit def matmul(a, b): return a @ b a = Tensor.rand(1024, 1024) b = Tensor.rand(1024, 1024) c = matmul(a, b) # 触发 JIT 编译并执行多后端编译器
tinygrad 的核心编译器负责将计算图降级为底层 IR,并通过调度器为不同硬件生成代码。目前支持的后端包括:
CPU
CUDA(NVIDIA GPU)
METAL(Apple GPU)
OpenCL
AMD
QCOM(Qualcomm)
WebGPU(浏览器)
添加新后端非常容易——只需实现约 25 个低级操作(如矩阵乘法、卷积、复制等),就能将整个框架移植到新硬件上。
完整训练栈
除了张量和自动微分,tinygrad 还提供了nn模块(线性层、卷积、BatchNorm 等)、优化器(SGD、Adam)和数据加载器,让你可以编写完整的训练脚本。
from tinygrad import Tensor, nn from tinygrad.nn.optim import Adam class LinearNet: def __init__(self): self.l1 = Tensor.kaiming_uniform(784, 128) self.l2 = Tensor.kaiming_uniform(128, 10) def __call__(self, x): return x.flatten(1).dot(self.l1).relu().dot(self.l2) model = LinearNet() optim = Adam([model.l1, model.l2], lr=0.001) # 训练循环(类似 PyTorch) for epoch in range(10): optim.zero_grad() loss = model(x).sparse_categorical_crossentropy(y).backward() optim.step() print(loss.item())快速开始:5分钟上手
安装
推荐从源码安装以获得最新特性:
git clone https://github.com/tinygrad/tinygrad.git cd tinygrad pip install -e .或直接通过 pip 安装主分支:
pip install git+https://github.com/tinygrad/tinygrad.git测试运行
# 查看默认设备 python -c "from tinygrad import Device; print(Device.DEFAULT)" # 运行 MNIST 训练示例(会下载数据,需联网) python examples/beautiful_mnist.py调试模式
设置环境变量DEBUG=3可以查看编译过程,DEBUG=4可以看到生成的设备代码:
DEBUG=3 python3 -c "from tinygrad import Tensor; N=1024; a,b=Tensor.empty(N,N),Tensor.empty(N,N); (a.reshape(N,1,N) * b.T.reshape(1,N,N)).sum(axis=2).realize()"优势对比:tinygrad 与其他框架
对比维度 | tinygrad | PyTorch | JAX | TensorFlow |
|---|---|---|---|---|
| 代码规模 | ~4 万行 | 数百万行 | 数十万行 | 数百万行 |
| 可读性 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ | ⭐ |
| 自动微分 | 支持 | 支持 | 支持(函数式) | 支持 |
| JIT 编译 | 函数级 TinyJit | TorchScript | 默认 | XLA |
| 硬件支持 | 多后端,可扩展 | 丰富 | 丰富 | 丰富 |
| 训练能力 | 完整 | 完整 | 完整 | 完整 |
| 易用性 | 接近 PyTorch | 极高 | 中等 | 中等 |
| 生产级部署 | 实验性 | 成熟 | 中等 | 成熟 |
| 社区 | 新兴 | 庞大 | 增长 | 庞大 |
| 核心目标 | 教学 + 可 hack | 易用 + 性能 | 函数式 + 编译 | 生产 + 部署 |
核心优势:
代码极简:任何人都可以在几小时内通读核心代码,理解深度学习框架的内部机制。
可 hack 性:想要添加新操作、新后端或优化编译器?修改几处代码即可,无需在数十万行代码中挣扎。
统一设计:从张量到编译器的全栈统一,没有“Python 前端 + C++ 后端”的割裂感。
真正跨平台:通过少量底层原语就能移植到任何硬件,甚至支持 WebGPU(浏览器中运行)。
应用场景:谁应该使用 tinygrad?
学习者:想深入理解深度学习框架的内部实现,tinygrad 是最佳教材。你可以从
tinygrad/tensor.py开始,一步步看到自动微分、编译和硬件加速如何实现。研究人员:需要快速验证新算子、新优化器或新训练策略?tinygrad 让你无需在庞大代码库中绕圈,可以直接在核心上实验。
框架开发者:想为特定硬件(如自研 NPU)开发深度学习支持?tinygrad 的硬件抽象层极其简单,可以快速移植。
极客:喜欢探索新技术,对 George Hotz 的作品感兴趣?tinygrad 充满了 hack 精神,值得收藏和把玩。
总结:学习深度学习框架的最佳入口
tinygrad 证明了深度学习框架不必是庞然大物。通过极简的设计和可 hack 的实现,它让开发者能够真正理解现代深度学习栈的每个层次,从张量运算到编译器优化。如果你正在寻找一条从零开始掌握深度学习框架的捷径,tinygrad 就是最好的起点。它可能不会取代 PyTorch 在生产环境中的地位,但它一定会培养出更多懂得框架底层原理的工程师。
现在就克隆代码,用 DEBUG=3 运行一下,看看矩阵乘法是如何被编译成 CUDA kernel 的——你可能会对深度学习框架的魔力有全新的认识。
项目地址:https://github.com/tinygrad/tinygrad
文档:https://docs.tinygrad.org