PyTorch 是当下研究与工程的事实标准深度学习框架;本文是体系的入口:梳理 Torch→PyTorch 沿革与生态版图,用四层架构与六要素简评建立全局认知,并给出学习路径。

从 Torch 到 PyTorch

三个名称,三层含义:

名称含义
Torch2002 年前后的 LuaJIT 科学计算框架,主打张量运算与 GPU 加速
PyTorchMeta AI(原 Facebook AI Research)2016 年发布的 Python 深度学习框架,继承 Torch 的张量思想重写
torchPyTorch 在 Python 侧暴露的核心包,import torch 即获得张量、autograd、nn、optim 全部能力

沿革主线:

  • 2016:PyTorch 0.1 发布,define-by-run 动态图带来即写即调试的体验,直接冲击静态图时代的 TensorFlow 1.x
  • 2018:1.0 合并 Caffe2 后端,统一到 ATen 算子层,从研究框架走向生产
  • 2022:PyTorch 基金会成立,项目归入 Linux Foundation 中立治理
  • 2023:2.0 引入 torch.compile,以 JIT 编译换取性能,补动态图框架的吞吐短板

动态图与静态图的取舍、与 TF/JAX 的横向比较见 深度学习框架对比。

生态版图

torch 是计算与训练核心,其余领域库全部构建其上:

库领域内容
torchvision计算机视觉datasets、models、transforms、ops(NMS、RoIAlign)
torchaudio音频变换、数据集、I/O
torchtextNLP已归档,任务由 HuggingFace 生态承接

外围还有 torch.hub(预训练模型分发)、ONNX 导出(跨框架部署)、ExecuTorch(端侧推理)。区分核心与生态的标准:领域库可替换、会过时;torch 的张量与训练闭环稳定不动。

分层架构:四层拆解

自顶向下调用、自底向上依赖(原结构图重绘):

flowchart TD
    A["应用层<br/>Dataset / DataLoader / torchvision"] --> B["网络搭建层<br/>torch.nn"]
    B --> C["优化层<br/>torch.autograd + torch.optim"]
    C --> D["数据与计算层<br/>Tensor / Storage / CUDA"]
  • 数据与计算层:Tensor 与 Storage 回答「数据如何表示与存储」——Tensor 描述解释方式(shape、stride、dtype、device),Storage 是裸的连续内存;torch.cuda 与混合精度 负责设备管理与加速
  • 网络搭建层:torch.nn 以 nn.Module 为核心抽象组织模型结构与参数
  • 优化层:torch.autograd 前向记录动态图、反向算梯度;torch.optim 只做一件事——按梯度更新参数
  • 应用层:Dataset 与 DataLoader 把数据批量、异步地送进模型,领域库与训练脚本在此层工作

层间依赖单向向下,上层只调下层 API——这解释了为什么换优化器不动模型、换设备不动训练循环。

架构六要素简评

要素简评
可用性维度、dtype、设备不匹配的报错信息明确,定位快
可修改性继承 Module、重写 Dataset、组合 loss 与 optimizer,扩展点无处不在
性能GPU 张量计算与 autograd 成熟;上限取决于数据加载、混合精度、算子融合与分布式策略
安全性短板在 pickle 反序列化:勿加载不可信来源的模型文件,safetensors 是安全替代
可测试性组件可独立验证:前向输出形状、梯度存在性、小数据过拟合 sanity check
易用性动态图加 Pythonic 风格,print 即调试,研究到工程无缝过渡——流行的根本原因

学习路径

按依赖顺序推进,前一步是后一步的前提:

  • Tensor 与 Storage:形状、dtype、设备、广播、索引、矩阵运算
  • torch.autograd:requires_grad、动态图、backward()、.grad
  • torch.nn:Module 继承、参数注册、forward()
  • torch.optim:zero_grad → backward → step 训练闭环
  • Dataset 与 DataLoader:数据管线与多进程加载

五步走通后,最小完整训练循环:

for inputs, targets in loader:                # DataLoader 产出 batch
    optimizer.zero_grad()                     # 清空上一轮梯度
    loss = criterion(model(inputs), targets)  # 前向传播 + 计算损失
    loss.backward()                           # autograd 反向求梯度
    optimizer.step()                          # 按梯度更新参数

再沿三个方向深入:性能(cuda 与混合精度)、规模(分布式训练总览——并行策略、通信原语、分片检查点)、部署(权重保存与格式转换)。本篇之后,可从 PyTorch MOC 导航至任意模块笔记。