从入门到分布式 · 一文读懂 PyTorch 官方 Examples

2026-10-29 开发技术 2 次阅读 0 次点赞
这篇博客系统梳理了PyTorch官方Examples仓库中的20多个示例,按学习路径分为入门、生成模型、图神经网络、自然语言处理、强化学习、序列建模与视觉前沿、工业级训练与分布式等几大板块。作者逐一说明每个示例解决的问题、技术思路和适合的学习阶段,涵盖从60行代码的自动求导入门到ImageNet训练和DDP、FSDP等分布式方案。文末给出了一条从regression到distributed的推荐学习路径,并建议多用dry-run、成对对比阅读、关注C++版本等实用技巧。

学深度学习框架,最好的教材是官方示例,文档反而排在后面。PyTorch 的 examples 目录就是一部活的教程库,60 行代码就能跑通的回归入门,和支撑 ImageNet 训练的工业级分布式脚本,全塞在里面。

我按学习路径把仓库里 20 多个示例串了一遍,分成几大块逐个讲。每个示例在解决什么问题、思路是什么、该在哪个阶段入手,下面都会说清楚。说实话这些代码我没有逐行啃完,但每个示例的定位,从 README 和目录结构里看得很明白。

一、入门 · 自动求导到图像分类

regression,60 行读懂 autograd

整个示例集里最精简的就是它,用单个 nn.Linear 拟合一个随机的四次多项式。

它的妙处在手动执行梯度下降,不套任何现成优化器,直接对参数跑 param.data.add_(-0.1 * param.grad)。前向传播、损失计算、反向传播、参数更新,这四步你能一行行看清楚。loss 掉到 1e-3 以下就自动停,再把学出来的多项式系数和真实系数摆在一起对比。

适合刚接触 PyTorch、想弄懂 autograd 机制的开发者。

mnist 系列,一个任务的四种写法

MNIST 手写数字识别是深度学习的 Hello World,官方仓库给它准备了 4 个变体,正好对应四种训练方式。

目录 技术点 并行方式
mnist 标准 CNN + 反向传播 单进程
mnist_forward_forward 逐层局部学习,无反向传播 单进程
mnist_hogwild 多进程共享内存异步 SGD 多进程无锁更新
mnist_rnn LSTM 序列建模图像 单进程
  • mnist 是两层卷积加两层全连接的经典 CNN,配 Adadelta 优化器和 StepLR 学习率衰减,后面很多示例都是照着它的骨架改的。
  • mnist_forward_forward 复现 Hinton 2022 年的 Forward-Forward 算法。最大亮点是没有反向传播,每层各配一个 Adam 优化器,靠比较正样本(真实标签叠在图片上)和负样本(错误标签叠上去)的激活 goodness 逐层局部训练。想找反向传播的替代方案,这是最直观的一份实现。
  • mnist_hogwild 演示 Hogwild! 异步 SGD。用 model.share_memory() 把模型塞进共享内存,再起多个进程对同一个模型无锁并发更新,算是多进程并行训练最原始的形态。
  • mnist_rnn 把 28×28 图像当成长度 28 的序列,每一行像素算一个时间步,用 LSTM 建模。训练流程和 CNN 版一模一样,方便你直接对比两种架构的差距。

siamese_network,度量学习入门

孪生网络用两个共享权重的 ResNet-18 分别提取两张图的特征,拼起来过全连接层加 Sigmoid 输出相似度,用 BCELoss 训练。数据集构造有个巧思,按奇偶索引交替生成正样本对(同类不同图)和负样本对(不同类),绕开了"两张完全一样的图"这种没意思的样本。想搞人脸识别、图像检索,从这里入手挺顺。

二、生成模型 · 让网络学会创造

vae,变分自编码器

MLP 版的 VAE,结构极简但概念是完整的。编码器输出均值 μ 和对数方差 log σ²,靠重参数化技巧(z = μ + ε·σ,ε ~ N(0,1))做出可导的随机采样,解码器再重建图像。损失就是重建误差(BCE)加 KL 散度。每个 epoch 会把重建图和随机采样图存进 results/ 目录,训成什么样,翻翻这个目录就知道。

dcgan,生成对抗网络

DCGAN 把生成器和判别器的完整对抗训练循环写全了,数据源支持 CIFAR-10、LSUN、MNIST、ImageNet,也能喂自定义文件夹,还能从 checkpoint 续训,用 --dry-run 快速验证。训练时每个 epoch 都存一张生成样本的网格图,生成质量怎么一点点变好,看得见。

fast_neural_style,实时风格迁移

基于 Johnson 那篇《Perceptual Losses for Real-Time Style Transfer》和 Instance Normalization 实现。两种玩法。第一种,用 COCO 数据集加一张风格图,训练自己的风格迁移模型。第二种,直接拿官方给的预训练模型(mosaic、candy 这些风格)给任意照片上色,笔记本 CPU 就能流畅跑。

三、图神经网络 · 处理非欧几里得数据

gcn 和 gat 是一对姊妹示例,都在 Cora 引文数据集上做半监督节点分类,这个数据集有 2708 个论文节点、7 类主题。

  • gcn 实现 Kipf & Welling 的图卷积层 H' = f(D^(-1/2)AD^(-1/2)HW),重点看度矩阵归一化这个技巧和稀疏矩阵乘法 torch.spmm。
  • gat 实现图注意力机制,给每条边算注意力系数 α_ij(LeakyReLU 加掩码 softmax),支持多头注意力,最后把各头的输出取平均或者拼起来。

两个对着读,就能分清"固定权重聚合邻居"和"注意力加权聚合邻居"到底差在哪。

四、自然语言处理

word_language_model,词级语言模型

基于 Penn Treebank 数据集的 RNN/LSTM/GRU 语言模型。有几个亮点。一个 RNNModel 容器类统一支持 4 种循环网络。支持权重绑定,让 embedding 和输出层共享权重,这是《Using the Output Embedding to Improve Language Models》里的经典技巧。generate.py 能用训好的模型从任意起始词逐词生成文本。

language_translation,Transformer 机器翻译

基于《Attention is All You Need》的翻译示例,默认德译英,靠 spacy 分词器能切到任意语言对,比如 --src en --tgt fr 就是英译法。训完还给一个交互式推理界面,随便输入一句就能拿到翻译。想学 Transformer 的编码器-解码器结构和贪心解码,这份材料很实用。

五、强化学习 · reinforcement_learning

在经典的 CartPole-v1 环境上实现了两种策略梯度算法。

  • reinforce.py 是 REINFORCE(蒙特卡洛策略梯度),等一个完整回合结束后按折扣回报更新策略网络,保存动作 log-prob 的那个列表机制值得细读。
  • actor_critic.py 是单模型双头的 Actor-Critic,一个网络同时输出动作概率(actor 头)和状态价值(critic 头),用优势函数 A = R - V 压低梯度方差。

两个脚本加起来不到 200 行,是策略梯度算法最小可行的实现。

六、序列建模与视觉前沿

time_sequence_prediction,手写循环的 LSTM

mnist_rnn 用的是现成的 nn.LSTM,这个示例反过来,用两个 LSTMCell 手写时间步循环,LSTM 内部 hidden state 怎么一层层传,一眼看穿。另一个特色是用 LBFGS 优化器(因为能全量数据训练),还支持对正弦波做 1000 步外推,把预测曲线画出来。

super_resolution,超分辨率

实现 ESPCN 模型,4 层卷积后面接 nn.PixelShuffle 做亚像素级上采样,把低分辨率图放大。代码拆得很干净,model.py 管网络定义,data.py/dataset.py 管数据处理,main.py 管训练,super_resolve.py 管推理,是工程组织的规范样本。

vision_transformer,手写 ViT

不引第三方库,从零实现 Vision Transformer。用 Tensor.unfold 做 Patch 切分,线性投影加 class token 加位置编码,再手写多头自注意力的 Encoder Block(LayerNorm → MultiheadAttention → MLP,带两处残差连接)。仓库还附了训练好的 best-weights.pt,能直接加载验证。

七、进阶 · 工业级训练与分布式

imagenet,真实世界的训练脚本

整个示例集里工程价值最高的单文件脚本就是它。torchvision 的全部图像模型架构,一行 -a 参数就能切。DDP 分布式训练(--multiprocessing-distributed)和混合精度 AMP 都配好了,checkpoint 保存、断点恢复、--evaluate 评估模式一个不少,还有 --dummy 假数据能快速测速。想做大规模训练,先把这个脚本读透。

distributed,分布式训练全家桶

下面这些子目录,基本把 PyTorch 分布式的所有形态都盖到了。

子目录 内容
ddp/ DistributedDataParallel 基础(MNIST 多进程训练)
ddp-tutorial-series/ DDP 进阶教程,含单机与多节点(multi_node)版本
FSDP/ 全分片数据并行(Fully Sharded Data Parallel),含微调与绘图工具
FSDP2/ 新一代 per-parameter DTensor FSDP API 示例
rpc/ RPC 框架系列,含参数服务器、RPC+DDP 组合、模型流水线、批量推理、分布式 RL、分布式 RNN
tensor_parallelism/ 张量并行
minGPT-ddp/ 基于 minGPT 的大语言模型 DDP 训练(含 YAML 配置)

fx,模型变换的瑞士军刀

torch.fx 示例集有 11 个独立脚本,演示符号追踪、自定义 Tracer、子图替换(subgraph rewriter)、算子替换、动态输出包装、性能分析这些。做模型量化、算子融合、编译优化之前,建议先在这里把 FX 的编程模型摸一遍。

八、其他与遗留

legacy/snli 是基于 SNLI 数据集的文本蕴含分类,用 LSTM 编码前提和假设两句话,已经归档不再维护,当参考看就行。

总结 · 推荐学习路径

把这些示例串起来,能理出这么一条学习路径。

regression(自动求导)
  → mnist 四部曲(分类/优化器/并行初探)
    → vae / dcgan(生成模型)
      → gcn / gat(图学习)
        → word_language_model / language_translation(NLP)
          → reinforcement_learning(RL)
            → imagenet / distributed(工业级训练)

最后几条建议,都挺实在。

第一,多用 --dry-run。绝大多数示例都支持这个参数,跑通一个 batch 就退出,适合快速验证环境。

第二,用一键脚本。仓库顶层的 run_python_examples.sh 能批量把全部 Python 示例跑一遍。

第三,对比着读。mnist 对 mnist_rnn 是架构对比,gcn 对 gat 是聚合方式对比,mnist 对 mnist_hogwild 是并行对比,成对读收获翻倍。

第四,别忘了 C++ 版。cpp/mnist 是 CNN 示例的 libtorch 移植,想了解 PyTorch C++ 前端就从它看。

最后更新于46分钟前
本文由人工编写,AI优化,转载请注明原文地址: 从入门到分布式 · 一文读懂 PyTorch 官方 Examples

评论 (0)

请 登录 后发表评论

暂无评论,快来发表第一条评论吧!