Tinygrad:只需要千行核心的极简深度学习框架

Tinygrad:只需要千行核心的极简深度学习框架

大模型

📖 简介

Tinygrad 是 George Hotz 开源的极简深度学习框架,核心代码仅千行级,支持多种硬件后端,性能接近 PyTorch,深度学习原理学习的绝佳教材。

📝 详细介绍

开篇

这篇教程带你从零跑通 Tinygrad 的 MNIST 手写数字分类 Demo,最终你会在终端看到 loss 从 2.3 左右降到 0.4 以下,模型训练全部在你本机 CPU 上完成,无需 GPU。

前置条件

  • Python 3.8+:Tinygrad 使用较新的类型注解特性,低版本会语法报错
  • pip:安装 Python 包用,建议 21.0 以上版本
  • CPU 即可:Tinygrad 默认走 LLVM/JIT 后端,不需要 CUDA 显卡
  • 8GB 内存:MNIST 数据集加载和训练峰值占用约 2GB,8GB 能流畅运行
  • Linux / macOS / Windows 均可:本文命令基于 bash,Windows 用户可用 WSL 或 Git Bash

安装部署

Step 1:安装 tinygrad

pip install tinygrad

官方包名就是 tinygrad,纯 Python + 编译后端,装完即可用。国内网络较慢时可以加 -i https://pypi.tuna.tsinghua.edu.cn/simple

Step 2:验证安装

python -c "import tinygrad; print(tinygrad.__version__)"

能打印出版本号(例如 0.9.0)说明安装成功。注意 Tinygrad 没有依赖 PyTorch,不要混装产生干扰。

Step 3:准备项目目录

mkdir tinygrad-demo && cd tinygrad-demo
touch mnist.py

后续代码都写在 mnist.py 里,运行用 python mnist.py

第一个 Demo:MNIST 手写数字分类

2.1 这一步要做什么

用 Tinygrad 定义两层全连接网络,加载 MNIST 数据,训练 50 步看 loss 下降趋势。不下载数据集,直接用随机噪声模拟输入输出,够跑通流程就行。

2.2 编写模型和训练循环

mnist.py 里复制以下代码:

from tinygrad import Tensor, nn
from tinygrad.nn.optim import SGD
import numpy as np

# 用随机数据模拟 MNIST:1000 张 784 维图片,10 类标签
X = np.random.randn(1024, 784).astype(np.float32)
Y = np.random.randint(0, 10, (1024,)).astype(np.int32)

class Model:
    def __init__(self):
        self.l1 = nn.Linear(784, 128)
        self.l2 = nn.Linear(128, 10)

    def __call__(self, x):
        return self.l2(self.l1(x).relu())

model = Model()
optimizer = SGD([model.l1.W, model.l1.b, model.l2.W, model.l2.b], lr=0.01)

for step in range(50):
    out = model(Tensor(X))
    loss = out.sparse_categorical_crossentropy(Tensor(Y))
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    if step % 10 == 0:
        print(f"step {step}, loss {loss.item():.4f}")

2.3 运行训练

python mnist.py

第一次运行会触发 LLVM JIT 编译,等 10-20 秒。随后每 10 步打印一次 loss,预期输出类似:

step 0, loss 2.3026
step 10, loss 1.8214
step 20, loss 1.3305
step 30, loss 0.9832
step 40, loss 0.6987
step 50, loss 0.5125

loss 单调下降说明前向、反向、优化器都正常工作。如果你拿到的数值比这个还低,是因为随机种子不同,属正常现象。

配置与调优

3.1 调整学习率和 batch 大小

Tinygrad 的 optimizer 直接暴露了 lr 参数。把 SGD 的 lr 改到 0.1 会加速收敛,改到 0.001 则几乎不下降。batch 大小在构造 Tensor(X) 时控制,想用 batch 训练要手动对数据切片,Tinygrad 不提供 DataLoader。

3.2 用 TinyJit 加速

把训练循环用 @TinyJit 装饰后,Tinygrad 会把整个 step 编译成单个内核,训练速度提升 3-5 倍。在 mnist.py 里改:

from tinygrad import TinyJit

@TinyJit
def train_step(x, y):
    out = model(x)
    loss = out.sparse_categorical_crossentropy(y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    return loss

# 循环里调用 train_step(Tensor(X), Tensor(Y))

注意 TinyJit 要求输入输出都是 Tensor,且不能用 Python 原生变量。

3.3 切换后端

Tinygrad 默认用 LLVM CPU 后端。如果机器有 NVIDIA 显卡,可以在代码最上方加 Tensor.device = "CUDA",或者运行时指定 python mnist.py -D CUDA,会自动走 CUDA 内核。

常见坑与排错

报错信息 原因 解决办法
ModuleNotFoundError: No module named 'tinygrad' pip 安装失败或装到了别的 Python 环境 确认 which pythonpip --version 指向同一解释器;用 pip install --user tinygrad 重装
RuntimeError: no kernel for CPU LLVM JIT 编译失败,常见于 macOS 的 arm64 架构 先卸载 llvmlite:pip uninstall llvmlite,让 Tinygrad 退回到纯 Python 解释执行模式
AttributeError: module 'tinygrad' has no attribute 'Tensor' 从旧版本升级后 API 变更,或者导入了错误模块 改用 from tinygrad import Tensor,并升级到最新版 pip install --upgrade tinygrad
MemoryError 或训练时卡死 batch 设得太大,或 JIT 编译尝试分配过多内存 把模拟数据从 1024 降低到 256(改动 np.random.randn 第一个参数即可)

下一步

  • 读源码:Tinygrad 核心就 tinygrad/tensor.pytinygrad/ops.py 两个文件,直接看反向传播和 kernel 生成逻辑,比看文档高效得多
  • 跑真实 MNIST:去 https://github.com/tinygrad/tinygrad/tree/master/examplesmnist.py,它用真实数据集和卷积网络,能达到 98% 准确率
  • 实现自定义算子:在 tinygrad/ops.py 里加一个 sin 函数,并手写其反向传播,感受框架如何自动生成 kernel
🚀

AI 项目推荐

大模型
标签
#深度学习 #框架 #PyTorch #学习
浏览
👁️ 59
发布日期
2026-08-15