结论:要做端侧推理,公开资料给出的最小闭环是七步:装依赖 → 建张量 → 组模型 → 写训练循环 → 评估 → 上 JIT → 存取权重。它的三条关键性质是:张量运算是惰性的,只有调用 .realize() 或 .numpy() 才真正执行;神经网络就是一组张量运算,模块不必须继承任何基类;JIT 用于加速固定输入形状的推理,但不支持变化输入尺寸与非本框架操作。权重标准格式为 safetensors。
准备:导入与依赖
快速上手指南假定读者不熟悉任何深度学习框架,但具备神经网络基础。起步只需要少量导入:数值库、计时辅助、张量类与数据类型。
张量是这套工具链的基础数据结构,可以理解为某个数据类型的多维数组;所有高层操作都作用在张量上。张量既能从 Python 列表或数值库数组构造,也能用工厂方法生成:
| 工厂方法 | 作用 |
|---|---|
| full / zeros / ones | 按给定形状生成定值、全零或全一张量 |
| full_like / zeros_like / ones_like | 按另一张量的形状生成对应值 |
| eye | 单位矩阵 |
| arange | 按起止与步长生成序列 |
| rand / randn / uniform | 均匀分布、标准正态分布或指定区间的随机张量 |
所有创建方法都可以带上 dtype 参数指定数据类型。运算则为惰性:例如 (t + 1) * 2 之后再接 relu() 与 log_softmax(),表达式不会立即求值,直到用 .realize() 或 .numpy() 触发。
模型就是一组张量运算
神经网络在这个框架里就是张量运算的组合。常见做法是把一组运算放进一个类的调用方法里,以便模块化复用;这些类不必继承任何基类,若无需可训练参数,甚至可以不是类。
指南用一个全连接层示例说明:构造时按初始化方式生成权重张量,可选的偏置为全零;前向时对输入做线性变换。基于它,指南搭了一个两层网络——输入 784 维、隐藏层 128 维、输出 10 维(对应十个数字),两层都不带偏置,激活使用 Leaky ReLU。前向过程就是依次做线性变换与激活,再返回输出。
训练与评估循环
训练循环非常直接:定好网络、损失与优化器,对损失调用反向传播得到梯度,再用优化器更新参数。指南在这部分点出一个关键取舍:加载 / 存储类运算在框架里不原生支持,因为它增加了移植到不同后端的复杂度,而且大多数模型并不需要;示例里的交叉熵损失就用 arange 掩码实现,绕开了原生加载 / 存储。
| 环节 | 指南中的取值与做法 |
|---|---|
| 损失 | 稀疏分类交叉熵 |
| 优化器 | 随机梯度下降,学习率 3e-4 |
| 参数来源 | 显式传入,或用工具函数取全部参数 |
| 数据 | 数据集加载器提供的示例数据集 |
| 训练设置 | 训练 1000 步,批大小 64,用上下文开启训练模式 |
| 每步动作 | 取批 → 前向 → 算损失 → 清零梯度 → 反向传播 → 更新参数 → 计算准确率 |
评估沿用同样的批大小 64,跑 1000 个批次,并用计时辅助输出耗时。值得注意的是,指南把 Context(TRAINING=1) 用作训练模式开关,退出上下文时该标志会恢复为之前的值——这是用上下文管理状态,而不是全局变量。
JIT 与模型存取
指南的「额外能力」部分给出两个工程要点。
其一,JIT 可以加速某些网络的运算:做法是给前向过程加装饰器,并确保输入输出都是已实现的张量。但指南明确其限制——当前不支持变化输入尺寸的模型,也不支持非本框架的操作。启用后评估耗时通常显著下降,加速器利用率更高。
其二,权重存取的标准格式是 safetensors:这意味着其他同样使用该格式的模型权重也能直接加载进来。存取由状态字典相关函数完成——先取状态字典,保存到文件,再加载并写回网络。此外,预设模型目录里的许多模型提供了「从预训练加载」的方法,通常会下载权重;这类权重多为另一框架的格式,加载时需要安装对应框架。
调试与可视化
再有两点对排查很有用:一是环境变量控制运行时行为,常见的有 DEBUG 与各后端启用开关,完整清单在环境变量文档里;二是设置 VIZ=1 可以可视化神经网络的计算图,用于确认运算是否按预期组织。
常见问题
为什么定义了运算却没有立刻执行?
因为张量运算是惰性的,表达式只有在调用 .realize() 或 .numpy() 时才真正执行。这是该工具链的基础性质,也是理解性能与调试输出的前提。
可以用 JIT 加速所有模型吗?
不能。当前 JIT 不支持变化输入尺寸的模型,也不支持非本框架的操作。启用时还需保证输入与输出都是已实现的张量。
模型权重用什么格式保存?
标准格式是 safetensors。先取状态字典,保存到文件;加载时读取状态字典再写回网络。使用同样格式的其他模型权重也能直接加载。
如何确认网络的计算图结构?
设置 VIZ=1 即可可视化计算图。日常排查运行时行为还可以借助 DEBUG 等环境变量,完整清单见环境变量文档。
延伸阅读
- 大型 ADAS 代码库怎么读:四步阅读顺序与三类边界 —— 推理运行时在整车软件中的位置。
- openpilot 的 100 Hz 控制回路:开源 ADAS 能给车载设备什么 —— 端侧推理与控制回路的配合。
- EdgeForge:嵌入式侧端框架的自编译方案 —— 另一种端侧工具链的构建取舍。
- 张量调度与内存:端侧推理运行时怎么排布算子 —— 承接张量运算到硬件的路径。
参考资料
- 项目 02 ——
openpilot-research/source/tinygrad_repo/docs/quickstart.md(取用张量工厂方法、惰性求值、两层网络示例、训练与评估循环、JIT 限制、safetensors 存取与调试开关)。
说明:本文为对固定文档快照的整理,未在本机运行完整训练、未验证各后端可用性与性能数字,也未核对示例数据集与预训练权重的实际下载内容。文中所有 API、取值与限制均出自源文档,标注为未验证的结论保留其原有边界。
更新记录
首次发布 2026-10-11 最近核对:2026-10-11
发表回复