tinygrad Showcase 实战指南:在 tiny 框架上运行 EfficientNet、YOLOv8、Whisper 与 Stable Diffusion
【免费下载链接】tinygradYou like pytorch? You like micrograd? You love tinygrad! ❤️项目地址: https://gitcode.com/GitHub_Trending/tiny/tinygrad
tinygrad 是一个以"极简内核"著称的深度学习框架,而本仓库的 docs/showcase.md 恰恰证明了它的"小"与"能"并不矛盾:从视觉领域的 EfficientNet、YOLOv8,到音频领域的 Whisper,再到生成式方向的 Stable Diffusion、LLaMA 与多角色语音对话,全部可以直接在本仓库的examples/目录下运行。本文将逐模块拆解这些示例的启动命令、依赖要求、关键源码结构与底层实现,帮助你从"能跑通"进阶到"看得懂、改得动"。
一、概览:一个"小库"能装下多少 SOTA 模型
showcase 文档开篇即点明主旨:Despite being a tiny library, tinygrad is capable of doing a lot of things——尽管 tinygrad 体积很小,它依然能够运行从 EfficientNet(视觉) 中的后端分发到 CPU / CUDA / Metal / OpenCL / AMD 等设备上执行。
本文涉及的模型与示例文件对应关系如下:
| 领域 | 模型 | 示例入口 |
|---|---|---|
| Vision | EfficientNet(B0–B8 分类) | extra/models/efficientnet.py |
| Vision | YOLOv8(n/s/m/l/x 目标检测) | examples/yolov8.py |
| Audio | Whisper(tiny/base/small 语音识别) | examples/whisper.py |
| Generative | Stable Diffusion(文生图) | examples/stable_diffusion.py |
| Generative | LLaMA(多代际大语言模型) | examples/llama.py |
| Generative | Conversation(语音对话机器人) | 基于 examples/llama.py 的交互扩展 |
二、Vision:图像分类与目标检测
2.1 EfficientNet:单张图片分类与实时摄像头识别
showcase 文档给出两种运行方式:传入图片 URL/路径进行识别,或连接摄像头实时识别。
# 方式一:识别一张图片(可传入本地路径或图片 URL) python3 examples/efficientnet.py ./test/models/efficientnet/Chicken.jpg # 方式二:使用摄像头实时检测(需要 OpenCV 与摄像头) python3 examples/efficientnet.py webcam仓库自带两张可立即用于测试的样例图片:test/models/efficientnet/Chicken.jpg 与 test/models/efficientnet/car.jpg。
源码结构:模型定义在 extra/models/efficientnet.py,核心类EfficientNet通过number参数选择 B0–B8 及 L2 的宽度/深度缩放系数:
global_params = [ (1.0, 1.0), # b0 (1.0, 1.1), # b1 (1.1, 1.2), # b2 ... (4.3, 5.3), # l2 ][max(number, 0)]网络主干由 7 组 MBConvBlock(带 SE 注意力)堆叠而成,并在 forward 中完成 stem 卷积、全局平均池化与最终全连接分类:
def forward(self, x): x = self._bn0(x.conv2d(self._conv_stem, padding=(0,1,0,1), stride=2)).swish() x = x.sequential(self._blocks) x = self._bn1(x.conv2d(self._conv_head)).swish() x = x.avg_pool2d(kernel_size=x.shape[2:4]) x = x.reshape(shape=(-1, x.shape[1])) return x.linear(self._fc, self._fc_bias) if self._fc is not None else x值得注意的是,load_from_pretrained(extra/models/efficientnet.py)直接加载 PyTorch 官方 EfficientNet 的.pth权重,通过torch_load+replace完成参数搬运,无需任何格式转换脚本——这体现了 tinygrad 对既有生态权重的高度兼容性。示例脚本还支持examples/compile_efficientnet.py这类配套入口,可用于将模型编译成独立可执行文件。
2.2 YOLOv8:五种规模的实时目标检测
showcase 文档推荐直接查看 examples/yolov8.py。该脚本的用法为:
# 用法:python3 yolov8.py <图片URL或路径> <模型变体,可选,默认 n> python3 examples/yolov8.py ./test/models/efficientnet/Chicken.jpg n从 main 入口 可以看到,脚本支持n / s / m / l / x五种变体,它们通过 get_variant_multiples 中的缩放系数(depth、width、ratio)区分:
def get_variant_multiples(variant): return {'n':(0.33, 0.25, 2.0), 's':(0.33, 0.50, 2.0), 'm':(0.67, 0.75, 1.5), 'l':(1.0, 1.0, 1.0), 'x':(1, 1.25, 1.0) }.get(variant, None)完整推理流水线包含以下关键环节:
- 预处理(preprocess):将输入图像 resize 到 640×640、BGR 转 RGB、通道维前置,并归一化到
0.0–1.0; - 模型推理:
YOLOv8类(examples/yolov8.py)由 Conv_Block、Bottleneck、C2f(跨阶段部分连接)、SPPF(空间金字塔池化)和 Upsample(源自 PR #784 的 nearest 上采样实现,见 examples/yolov8.py)构成; - 后处理(postprocess):置信度阈值过滤(默认
conf_threshold=0.25)、TopK 选取最多max_det=300个框,并基于 IoU 矩阵(阈值0.45)结合类别掩码完成 NMS; - 可视化(draw_bounding_boxes_and_save):在
./outputs_yolov8/目录下输出带类别标签、置信度和彩色边框的检测图。
权重获取:脚本通过 get_weights_location 自动下载 YOLOv8 的.safetensors权重(fetch到weights/目录),若检测到 fp16 权重还会自动转成 fp32 以便 CPU 等后端加载。
仓库还提供了 ONNX 路线的参考实现 examples/yolov8-onnx.py:它借助 ultralytics 将yolov8n-seg.pt导出为 ONNX,再交给 tinygrad 的OnnxRunner(位于 tinygrad/nn/onnx.py)直接执行,展示了 tinygrad 对 ONNX 图的原生支持能力。
三、Audio:Whisper 语音识别
showcase 文档指出:运行 Whisper 需要安装pyaudio和torchaudio,随后执行:
SMALL=1 python3 examples/whisper.py环境变量语义:SMALL=1会切换加载模型规格,对应 examples/whisper.py 中的逻辑:
model, enc = init_whisper("small.en" if getenv("SMALL") else "tiny.en", batch_size=1)即默认使用tiny.en模型,设置SMALL=1后改用small.en。可选的模型名(tiny.en / tiny / base.en / base / small.en等)与下载地址统一维护在 MODEL_URLS,init_whisper(examples/whisper.py)负责自动fetch权重、用torch_load加载 PyTorch 格式的.pt权重并load_state_dict组装模型。
两种运行模式:
- 转写文件:
python3 examples/whisper.py <音频文件>,经 transcribe_file 用 librosa 以 16kHz 采样率读取后走完整转写流程; - 在线聆听:不带参数运行时,listener 通过 pyaudio 打开麦克风流(16kHz、单声道、每块 1600 样本),以多进程队列方式把 10 秒窗口的音频喂给模型做流式转写。
核心算法细节:音频首先在 prep_audio 中被切分为 30 秒片段、做 mel 频谱图与对数归一化;随后Whisper模型的 AudioEncoder(卷积 + Transformer 编码器)与 Decoder 配合,以"上一轮预测 token 作为下一轮输入"的自回归方式(见 transcribe_waveform)逐步生成文本,直到遇到<|endoftext|>或达到max_self_attn_cache_len长度上限。MultiHeadAttention中的 KV cache 机制(examples/whisper.py)通过TinyJit与assign原地更新缓存张量,避免了逐帧重复计算。
四、Generative:生成式模型
4.1 Stable Diffusion:文本生成图像
showcase 文档给出的最小运行命令:
python3 examples/stable_diffusion.py默认提示词为"a horse sized cat eating a bagel",即文档配图所展示的示例。实际上该脚本的完整入口(examples/stable_diffusion.py)暴露了丰富的可调参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
--steps | 6 | 扩散去噪步数 |
--prompt | "a horse sized cat eating a bagel" | 生成提示词 |
--out | 系统临时目录rendered.png | 输出图片路径 |
--noshow | False | 不自动弹出显示图片 |
--fp16 | False | 将权重转为 float16 |
--timing | False | 打印每步耗时 |
--seed | None | 固定随机潜变量种子 |
--guidance | 7.5 | 提示词引导强度 |
--fakeweights | False | 跳过权重加载(仅测试用) |
完整流水线(对应 main 代码)依次为:
- 加载权重:
fetch下载sd-v1-4.ckpt,torch_load解析后load_state_dict装入模型(--fakeweights可跳过); - CLIP 文本编码:用 extra/models/clip.py 的
Tokenizer与FrozenOpenClipEmbedder分别编码条件提示词与空字符串无条件上下文; - DDIM 采样:从
1到1000均匀取--steps个 timestep,用--seed初始化4×64×64随机噪声潜变量,经TinyJit编译的run逐步去噪,--guidance控制提示词条件强度; - 解码成图:潜变量经
StableDiffusion内置的 VAE Decoder(ResnetBlock + AttnBlock 上采样,见 examples/stable_diffusion.py)还原为 512×512 图像并保存。
可复现性验证:脚本内置校验逻辑(examples/stable_diffusion.py)——当以默认提示词、--steps 6 --seed 0 --guidance 7.5运行时,会将输出与仓库预置的 examples/stable_diffusion_seed0.png 计算均方误差并断言低于3e-3,确保任何后端的实现一致性。
4.2 LLaMA:多代际大语言模型对话
showcase 文档说明:需要先下载权重放入weights/LLaMA目录(目录不存在时需自行创建),然后运行:
python3 examples/llama.py从 examples/llama.py 的 argparse 入口可以看到该脚本支持的完整参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
--prompt | None | 起始文本;不传则进入聊天机器人模式 |
--count | 1000 | 最多生成的 token 数 |
--personality | Stacy | 人格,可选 Stacy / George / Gary / Lexie |
--temperature | 0.7 | softmax 采样温度 |
--timing | False | 打印每 token 耗时 |
--profile | False | 输出 profile 数据到 out.prof |
--gen | 1 | 模型代际:1 / 2 / 3 / code / tiny |
--size | 每代际首个 | 模型尺寸(如 7B、13B、70B、8B 等) |
--quantize | None | 权重量化:int8或nf4 |
--model | None | 自定义权重目录或.index.json/.safetensors/.bin文件 |
--shard | 1 | 多设备分片数量 |
代际与尺寸映射:MODEL_PARAMS(examples/llama.py)中维护了 LLaMA-1/2/3、Code LLaMA 与 TinyLLaMA 的完整结构参数表,例如 LLaMA-1 7B 为dim=4096, n_heads=32, n_layers=32, hidden_dim=11008,LLaMA-3 8B 采用 GQA(n_kv_heads=8)与rope_theta=500000。代码注释还解释了 SwiGLU 下 hidden_dim 需取传统 Transformer 的 2/3 以保持参数量一致的数学依据。
权重加载与部署细节:LLaMa.build(examples/llama.py)支持从多分片consolidated.*.pth权重拼接加载(concat_weights)、HuggingFace 权重自动转换(convert_from_huggingface)、int8/nf4内存量化,以及shard多设备张量并行——注意力权重沿最后一维切分、FFN 的 w1/w3 沿第 0 维切分。人格系统则由内置的 pre-prompt 与 few-shot 示例实现(examples/llama.py),四种人格各有独立的提示模板与对话分隔符。
验证方式:脚本内置确定性校验(examples/llama.py):当以--temperature=0 --count=10 --prompt="Hello."运行时,会断言输出与预置的期望文本一致(如 gen1/7B 应输出"Hello. I'm a 20 year old male"),可用作环境与权重的正确性检查。
4.3 Conversation:与 Stacy 语音对话
showcase 文档还介绍了基于 LLaMA 的语音对话体验:
# 前置条件:安装 espeak,并设置 PHONEMIZER_ESPEAK_LIBRARY python3 examples/conversation.py文档明确要求:确保系统安装了espeak且设置了环境变量PHONEMIZER_ESPEAK_LIBRARY(指向 espeak 的共享库路径),随后即可与 Stacy 进行语音对话。这一功能依赖外部 TTS/语音管线完成语音合成,LLaMA 侧则复用了上文所述的多角色对话能力。仓库的examples/conversation_data/目录下存放了各人格(Stacy、George、Lexie 等)的 pre-prompt 配置(如 examples/conversation_data/pre_prompt_stacy.yaml),方便以配置文件方式定制人格而不改代码。
五、深入源码:这些示例如何共用 tinygrad 能力
观察上述六个示例可以发现,它们都建立在 tinygrad 同一套核心机制之上:
- 统一算子与自动调度:所有模型仅用 tinygrad/tensor.py 中的
Tensor及其卷积、注意力、归一化等算子表达,无需为不同后端编写专属 kernel; - 图编译与 JIT:Whisper 与 Stable Diffusion 使用
TinyJit将推理循环编译为静态图(见 tinygrad/engine/jit.py),避免重复调度开销; - 权重生态兼容:通过 tinygrad/nn/state.py 的
torch_load/safe_load/load_state_dict直接读取 PyTorch 与 safetensors 权重,这是 EfficientNet、Whisper、Stable Diffusion、LLaMA 能无缝复用官方权重的基础; - 网络权重自动获取:所有示例通过
tinygrad.helpers.fetch在首次运行时自动下载权重,无需手动处理(LLaMA 例外,文档要求手动放置到weights/LLaMA); - 测试佐证:仓库测试集中存在大量针对这些模型的验证用例,例如 test/models/test_mnist.py、test/unit/test_conv.py,以及 Whisper 的 test/models/test_whisper.py(配套音频在 test/models/whisper/),为示例的正确性提供了持续回归保障。
六、快速上手清单与注意事项
- 安装依赖:除 tinygrad 本体外,按需安装
librosa、pyaudio(Whisper)、torchaudio(Whisper 文档要求)、opencv-python(YOLOv8)、sentencepiece+tiktoken+blobfile(LLaMA,见 examples/llama.py 顶部注释); - 选择后端:脚本启动时会打印
using {Device.DEFAULT} backend,可通过DEBUG、Device相关环境变量选择 CPU/CUDA/Metal 等设备; - 首次运行联网下载权重:EfficientNet、YOLOv8、Whisper、Stable Diffusion 都会自动
fetch权重,LLaMA 需手动将权重放入weights/LLaMA{1,2,3,code,tiny}/对应子目录; - 验证运行正确性:利用各脚本内置的确定性校验(Stable Diffusion 的 MSE 断言、LLaMA 的温度 0 输出断言)确认环境无误;
- 参考测试:遇到问题可对照 test/models/ 与 test/unit/ 下的同名测试,它们展示了官方认可的调用方式与期望输出。
从一行命令跑通图像分类,到在本地复现 Stable Diffusion 与 LLaMA 对话,docs/showcase.md 所呈现的这六个示例,正是理解 tinygrad"以最小内核驱动最大模型"设计哲学的最佳入口。结合源码逐行阅读后,你完全可以在此基础上替换权重、修改网络结构,甚至把这些推理流程编译部署到自己的设备上。
【免费下载链接】tinygradYou like pytorch? You like micrograd? You love tinygrad! ❤️项目地址: https://gitcode.com/GitHub_Trending/tiny/tinygrad
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考