news 2026/9/10 21:14:30

tinygrad Showcase 实战指南:在 tiny 框架上运行 EfficientNet、YOLOv8、Whisper 与 Stable Diffusion

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
tinygrad Showcase 实战指南:在 tiny 框架上运行 EfficientNet、YOLOv8、Whisper 与 Stable Diffusion

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 等设备上执行。

本文涉及的模型与示例文件对应关系如下:

领域模型示例入口
VisionEfficientNet(B0–B8 分类)extra/models/efficientnet.py
VisionYOLOv8(n/s/m/l/x 目标检测)examples/yolov8.py
AudioWhisper(tiny/base/small 语音识别)examples/whisper.py
GenerativeStable Diffusion(文生图)examples/stable_diffusion.py
GenerativeLLaMA(多代际大语言模型)examples/llama.py
GenerativeConversation(语音对话机器人)基于 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)

完整推理流水线包含以下关键环节:

  1. 预处理(preprocess):将输入图像 resize 到 640×640、BGR 转 RGB、通道维前置,并归一化到0.0–1.0
  2. 模型推理YOLOv8类(examples/yolov8.py)由 Conv_Block、Bottleneck、C2f(跨阶段部分连接)、SPPF(空间金字塔池化)和 Upsample(源自 PR #784 的 nearest 上采样实现,见 examples/yolov8.py)构成;
  3. 后处理(postprocess):置信度阈值过滤(默认conf_threshold=0.25)、TopK 选取最多max_det=300个框,并基于 IoU 矩阵(阈值0.45)结合类别掩码完成 NMS;
  4. 可视化(draw_bounding_boxes_and_save):在./outputs_yolov8/目录下输出带类别标签、置信度和彩色边框的检测图。

权重获取:脚本通过 get_weights_location 自动下载 YOLOv8 的.safetensors权重(fetchweights/目录),若检测到 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 需要安装pyaudiotorchaudio,随后执行:

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)通过TinyJitassign原地更新缓存张量,避免了逐帧重复计算。

四、Generative:生成式模型

4.1 Stable Diffusion:文本生成图像

showcase 文档给出的最小运行命令:

python3 examples/stable_diffusion.py

默认提示词为"a horse sized cat eating a bagel",即文档配图所展示的示例。实际上该脚本的完整入口(examples/stable_diffusion.py)暴露了丰富的可调参数:

参数默认值说明
--steps6扩散去噪步数
--prompt"a horse sized cat eating a bagel"生成提示词
--out系统临时目录rendered.png输出图片路径
--noshowFalse不自动弹出显示图片
--fp16False将权重转为 float16
--timingFalse打印每步耗时
--seedNone固定随机潜变量种子
--guidance7.5提示词引导强度
--fakeweightsFalse跳过权重加载(仅测试用)

完整流水线(对应 main 代码)依次为:

  1. 加载权重fetch下载sd-v1-4.ckpttorch_load解析后load_state_dict装入模型(--fakeweights可跳过);
  2. CLIP 文本编码:用 extra/models/clip.py 的TokenizerFrozenOpenClipEmbedder分别编码条件提示词与空字符串无条件上下文;
  3. DDIM 采样:从11000均匀取--steps个 timestep,用--seed初始化4×64×64随机噪声潜变量,经TinyJit编译的run逐步去噪,--guidance控制提示词条件强度;
  4. 解码成图:潜变量经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 入口可以看到该脚本支持的完整参数:

参数默认值说明
--promptNone起始文本;不传则进入聊天机器人模式
--count1000最多生成的 token 数
--personalityStacy人格,可选 Stacy / George / Gary / Lexie
--temperature0.7softmax 采样温度
--timingFalse打印每 token 耗时
--profileFalse输出 profile 数据到 out.prof
--gen1模型代际:1 / 2 / 3 / code / tiny
--size每代际首个模型尺寸(如 7B、13B、70B、8B 等)
--quantizeNone权重量化:int8nf4
--modelNone自定义权重目录或.index.json/.safetensors/.bin文件
--shard1多设备分片数量

代际与尺寸映射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/),为示例的正确性提供了持续回归保障。

六、快速上手清单与注意事项

  1. 安装依赖:除 tinygrad 本体外,按需安装librosapyaudio(Whisper)、torchaudio(Whisper 文档要求)、opencv-python(YOLOv8)、sentencepiece+tiktoken+blobfile(LLaMA,见 examples/llama.py 顶部注释);
  2. 选择后端:脚本启动时会打印using {Device.DEFAULT} backend,可通过DEBUGDevice相关环境变量选择 CPU/CUDA/Metal 等设备;
  3. 首次运行联网下载权重:EfficientNet、YOLOv8、Whisper、Stable Diffusion 都会自动fetch权重,LLaMA 需手动将权重放入weights/LLaMA{1,2,3,code,tiny}/对应子目录;
  4. 验证运行正确性:利用各脚本内置的确定性校验(Stable Diffusion 的 MSE 断言、LLaMA 的温度 0 输出断言)确认环境无误;
  5. 参考测试:遇到问题可对照 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 21:14:03

计算机图形学直线绘制算法:从DDA到反走样技术

1. 计算机图形学中的直线绘制算法概述在计算机图形学领域&#xff0c;直线绘制是最基础也是最重要的操作之一。作为CSU&#xff08;中南大学&#xff09;计算机图形学课程的核心实践内容&#xff0c;Line.cpp文件通常实现了四种经典的直线生成算法&#xff1a;DDA算法、中点画线…

作者头像 李华
网站建设 2026/9/10 21:07:16

昇腾CANN/GE算子属性获取API

aclmdlGetOpAttr 【免费下载链接】ge GE&#xff08;Graph Engine&#xff09;是面向昇腾的图编译器和执行器&#xff0c;提供了计算图优化、多流并行、内存复用和模型下沉等技术手段&#xff0c;加速模型执行效率&#xff0c;减少模型内存占用。 GE 提供对 PyTorch、TensorFlo…

作者头像 李华