跳到主要内容

PyTorch 教程

欢迎学习 PyTorch!本教程将带你从零基础开始,逐步掌握深度学习的核心知识和 PyTorch 框架的实战技能。

什么是深度学习?

在介绍 PyTorch 之前,我们需要先理解什么是深度学习,以及它为什么如此重要。

从机器学习到深度学习

机器学习是一门让计算机从数据中学习规律的技术。传统的机器学习方法需要人工设计特征,然后使用算法进行分类或回归。例如,识别图片中的猫,需要先设计边缘检测、颜色分布等特征,再用分类器判断。

深度学习是机器学习的一个分支,它的核心思想是让神经网络自动学习特征。通过多层神经网络,深度学习可以从原始数据中逐层提取越来越抽象的特征:第一层可能学习边缘和纹理,第二层学习形状和部件,更高层学习完整的物体概念。

神经网络:深度学习的基础

神经网络是深度学习的基本模型,灵感来源于人脑神经元的工作方式。一个简单的神经网络由以下部分组成:

神经元(Neuron):接收输入信号,进行加权求和,再通过激活函数输出结果。

y=f(iwixi+b)y = f(\sum_{i} w_i x_i + b)

其中 xix_i 是输入,wiw_i 是权重,bb 是偏置,ff 是激活函数。

前向传播(Forward Propagation):数据从输入层经过隐藏层流向输出层的过程。

损失函数(Loss Function):衡量模型预测值与真实值之间的差距。常见的损失函数包括:

  • 均方误差(MSE):用于回归问题
  • 交叉熵损失(Cross-Entropy):用于分类问题

反向传播(Backpropagation):根据损失函数,从输出层向输入层逐层计算梯度,告诉每个参数应该如何调整才能减小损失。

梯度下降(Gradient Descent):使用计算出的梯度更新参数:

wnew=woldηLww_{new} = w_{old} - \eta \cdot \frac{\partial L}{\partial w}

其中 η\eta 是学习率,控制更新步长。

深度学习的应用领域

深度学习已经深刻改变了众多领域:

领域应用代表技术
计算机视觉图像分类、目标检测、人脸识别CNN、Vision Transformer
自然语言处理机器翻译、文本生成、问答系统Transformer、BERT、GPT
语音识别语音转文字、语音合成RNN、Conformer
推荐系统个性化推荐、广告投放协同过滤、深度推荐模型
自动驾驶环境感知、路径规划多传感器融合、强化学习
医疗健康疾病诊断、药物发现医学图像分析、分子预测

什么是 PyTorch?

PyTorch 是由 Meta(原 Facebook)AI 研究团队开发的开源深度学习框架。它提供了强大的张量计算能力和动态计算图支持,是目前最流行的深度学习框架之一。

PyTorch 的核心特点

特点说明
动态计算图支持 Define-by-Run,代码执行时动态构建计算图,调试更方便
Python 优先与 NumPy 无缝集成,代码简洁易读,符合 Python 编程习惯
GPU 加速支持 CUDA,高效利用 GPU 算力,大幅加速训练过程
丰富的生态torchvision、torchaudio、torchtext 等领域扩展库
社区活跃大量预训练模型和开源项目,学术论文主流框架

PyTorch vs TensorFlow

特性PyTorchTensorFlow
计算图动态图(Eager Execution)静态图(2.x 支持动态)
调试体验原生 Python 调试,断点、打印都可以较复杂,需要特殊技巧
学习曲线较平缓,类似 NumPy 的使用体验较陡峭,概念较多
部署方式TorchScript、ONNX、TorchServeTensorFlow Serving、TFLite
社区定位研究领域主流,学术界首选工业界主流,生产部署成熟
预训练模型Hugging Face Transformers 等TensorFlow Hub

如何选择?

  • 学术研究:PyTorch 是更好的选择,绝大多数顶会论文使用 PyTorch
  • 工业部署:两者都可以,TensorFlow 的部署工具链更成熟
  • 快速原型:PyTorch 的动态图让实验更灵活
  • 移动端部署:TensorFlow Lite 支持更好

PyTorch 技术架构

┌─────────────────────────────────────────────────────────────┐
│ PyTorch 技术栈 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 应用层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ torchvision │ │ torchaudio │ │ torchtext │ │
│ │ 计算机视觉 │ │ 音频处理 │ │ 文本处理 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ 框架层 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ PyTorch Core │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ Tensor │ │ Autograd│ │ nn.Module│ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ Optim │ │ DataLoader│ │ CUDA │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 编译层(PyTorch 2.x 新增) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ torch.compile (Dynamo + Inductor) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 底层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ ATen │ │ Caffe2 │ │ CUDA │ │
│ │ 张量运算库 │ │ 生产部署 │ │ GPU加速 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

PyTorch 2.x 新特性

PyTorch 2.0 是一个重要的里程碑版本,引入了 torch.compile 编译技术,显著提升了性能。

torch.compile:一行代码加速模型

import torch

# 创建模型
model = MyNeuralNetwork()

# 一行代码编译,获得加速
model = torch.compile(model)

# 正常使用,无需修改其他代码
output = model(input)

torch.compile 的工作原理:

  1. TorchDynamo:捕获 PyTorch 程序的动态行为,安全地提取计算图
  2. TorchInductor:将计算图编译成高效的底层代码(Triton 或 C++)
  3. 自动优化:自动应用 kernel fusion、内存优化等技术

性能提升:对于典型模型,torch.compile 可以带来 30%-200% 的加速,无需修改任何模型代码。

其他 PyTorch 2.x 特性

特性说明
torch.compile编译模型获得加速,支持多种后端
Accelerated Transformers原生优化的 Transformer 注意力实现
金属性能着色器(MPS)Apple Silicon GPU 加速支持
分布式训练增强FSDP、Tensor Parallel 改进
torch.export稳定的模型导出格式

编译模式详解

import torch

model = MyModel()

# 默认模式:平衡编译时间和执行效率
compiled_model = torch.compile(model)

# 最大优化模式:编译时间更长,但运行更快
compiled_model = torch.compile(model, mode="max-autotune")

# 减少内存模式:降低内存占用
compiled_model = torch.compile(model, mode="reduce-overhead")

# 禁用编译(调试用)
compiled_model = torch.compile(model, mode="default", fullgraph=False)

为什么学习 PyTorch?

1. 研究领域的主流选择

PyTorch 在学术研究领域占据主导地位:

  • 顶会论文(NeurIPS、ICML、CVPR 等)中 PyTorch 使用率超过 80%
  • Hugging Face Transformers 默认支持 PyTorch
  • 大量开源项目和预训练模型基于 PyTorch
  • 深度学习课程的首选教学框架

2. 学习曲线平缓

  • 代码风格接近 NumPy,有 Python 基础的工程师容易上手
  • 动态图让调试变得简单,可以使用 print、断点等常规调试手段
  • 错误信息清晰,便于定位问题
  • 社区文档完善,遇到问题容易找到解决方案

3. 工业界广泛应用

  • Meta、OpenAI、Tesla、Uber 等公司深度使用
  • 支持生产环境部署(TorchServe、TorchScript)
  • 完善的模型导出和优化工具(ONNX)
  • 云平台原生支持(AWS、GCP、Azure)

4. 生态系统丰富

  • torchvision:图像模型、数据集、图像增强
  • torchaudio:音频处理、语音模型
  • torchtext:文本处理、词向量
  • PyTorch Lightning:简化训练循环的高级框架
  • Hugging Face:预训练模型库
  • fastai:高级 API,快速原型开发

安装配置

系统要求

  • Python 3.8 或更高版本(推荐 3.10 或 3.11)
  • pip 或 conda 包管理器
  • (可选)NVIDIA GPU + CUDA 驱动

安装 PyTorch

使用 pip 安装(推荐)

# CPU 版本
pip install torch torchvision torchaudio

# GPU 版本(CUDA 11.8)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

# GPU 版本(CUDA 12.1)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

# GPU 版本(CUDA 12.4)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

使用 conda 安装

# CPU 版本
conda install pytorch torchvision torchaudio cpuonly -c pytorch

# GPU 版本
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia

使用 uv 安装(更快的包管理器)

uv pip install torch torchvision torchaudio

验证安装

import torch

print(f"PyTorch 版本: {torch.__version__}")
print(f"CUDA 是否可用: {torch.cuda.is_available()}")

if torch.cuda.is_available():
print(f"CUDA 版本: {torch.version.cuda}")
print(f"GPU 数量: {torch.cuda.device_count()}")
for i in range(torch.cuda.device_count()):
print(f"GPU {i}: {torch.cuda.get_device_name(i)}")

# 测试 MPS(Apple Silicon)
if torch.backends.mps.is_available():
print("MPS (Apple Silicon GPU) 可用")

# 简单计算测试
x = torch.randn(1000, 1000)
y = torch.randn(1000, 1000)
z = torch.mm(x, y)
print(f"矩阵乘法测试成功,结果形状: {z.shape}")

开发环境推荐

Jupyter Notebook / JupyterLab

pip install jupyterlab
jupyter lab

适合交互式开发和可视化。

VS Code

  • 安装 Python 扩展
  • 安装 PyTorch Snippets 扩展
  • 支持调试和代码补全

Google Colab

  • 免费提供 GPU 资源(T4)
  • 适合学习和快速实验
  • 预装 PyTorch 环境

PyCharm

  • 专业版支持科学模式
  • 良好的调试体验

教程目录

本教程涵盖从入门到进阶的完整内容:

基础入门

  • 张量操作 - PyTorch 的核心数据结构,学习创建、索引、运算
  • 自动求导 - 理解计算图和梯度计算原理

神经网络基础

进阶网络架构

实用技能

知识速查

学习建议

前置知识

学习 PyTorch 前需要掌握:

必要基础

  • Python 编程:变量、函数、类、模块、文件操作
  • NumPy 基础:数组操作、索引、广播机制

推荐了解

  • 机器学习基础:监督学习、无监督学习、过拟合、正则化
  • 线性代数:矩阵运算、向量空间、特征值
  • 微积分:导数、偏导数、链式法则
  • 概率统计:概率分布、期望、方差

学习路径

第一阶段:基础入门(1-2 周)

├── 环境配置 → 跑通第一个程序
├── 张量操作 → 理解 PyTorch 数据结构
└── 自动求导 → 理解梯度计算原理

第二阶段:神经网络核心(2-3 周)

├── nn.Module → 构建神经网络
├── Dataset/DataLoader → 数据处理
├── 损失函数与优化器 → 训练模型
└── MNIST/CIFAR 实战 → 完整项目

第三阶段:经典架构(3-4 周)

├── CNN → 图像分类
├── RNN/LSTM → 序列建模
└── 迁移学习 → 使用预训练模型

第四阶段:进阶应用(持续学习)

├── 模型优化 → 加速训练、减少显存
├── 模型部署 → 生产环境应用
└── 特定领域 → NLP、CV、推荐等

实践建议

  1. 动手实践:不要只看代码,每行代码都要亲自敲一遍
  2. 理解原理:不仅要会用 API,还要理解背后的数学原理
  3. 多调参数:改变超参数观察结果,建立直觉
  4. 阅读源码:遇到问题时阅读 PyTorch 源码,理解实现细节
  5. 参与社区:在 GitHub、论坛讨论问题,分享经验
  6. 关注更新:PyTorch 迭代较快,保持学习新特性

常见学习陷阱

陷阱表现建议
只看不练看完教程觉得懂了,动手就不会每个知识点都写代码验证
跳过基础直接看复杂模型,发现看不懂扎实掌握张量和自动求导
死记 API记忆大量函数用法理解原理,善用文档
忽视调试出错就放弃学会使用调试工具定位问题
过早优化追求性能忽略正确性先保证正确,再考虑优化

深度学习资源推荐

官方资源

经典教材

  • 《动手学深度学习》(Dive into Deep Learning)中文版,理论结合代码,强烈推荐
  • Deep Learning with PyTorch:官方团队编写,深入浅出
  • 《深度学习》(Deep Learning, Ian Goodfellow):深度学习圣经,偏理论

在线课程

  • Stanford CS231n:计算机视觉经典课程
  • Stanford CS224n:自然语言处理课程
  • fast.ai Practical Deep Learning:实践导向,快速上手

社区资源

版本说明

本教程基于 PyTorch 2.x 版本编写。主要版本差异:

版本发布时间主要特性
1.x2017-2022动态图、Eager Execution
2.02023.03torch.compile、性能优化
2.12023.10改进的编译器、分布式增强
2.22024.01进一步性能优化、新后端支持
2.32024.04SDPA 优化、张量并行改进
2.42024.07Python 3.12 支持、延迟加载
2.52024.10cuDNN SDPA 后端、区域编译、FlexAttention
2.62025.01Python 3.13 支持、torch.compiler.set_stance、FP16 CPU

PyTorch 2.5 新特性详解

PyTorch 2.5 于 2024 年 10 月发布,带来了多项重要改进:

cuDNN 后端加速 SDPA

SDPA(Scaled Dot-Product Attention)现在可以使用 cuDNN 的 "Fused Flash Attention" 后端。在 NVIDIA H100 GPU 上,这可以比 FlashAttentionV2 快 75%。此加速默认为 H100 或更新 GPU 的 SDPA 用户启用。

import torch
import torch.nn.functional as F

# SDPA 自动使用优化后的后端
query = torch.randn(32, 8, 128, 64, device='cuda')
key = torch.randn(32, 8, 128, 64, device='cuda')
value = torch.randn(32, 8, 128, 64, device='cuda')

output = F.scaled_dot_product_attention(query, key, value)

区域编译(Regional Compilation)

区域编译允许编译重复的 nn.Module(如 LLM 中的 transformer 层)而无需重复编译,显著减少冷启动时间:

import torch

# 启用区域编译(默认启用)
torch._dynamo.config.inline_inbuilt_nn_modules = True

model = MyTransformerModel()
compiled_model = torch.compile(model)

与完整模型编译相比,区域编译可以减少编译延迟,性能损失仅 1%-5%。

FlexAttention(原型特性)

FlexAttention 提供了灵活的 API 来实现各种注意力机制(如滑动窗口、因果掩码、PrefixLM):

import torch
from torch.nn.attention.flex_attention import flex_attention

# 实现滑动窗口注意力
def sliding_window_attention(query, key, value, window_size):
# 定义滑动窗口掩码
def sliding_window_mask(b, h, q_idx, kv_idx):
return q_idx - kv_idx <= window_size

return flex_attention(query, key, value, score_mod=sliding_window_mask)

# torch.compile 会自动生成优化的 FlashAttention 内核
compiled_attn = torch.compile(sliding_window_attention)

CPU 后端优化

TorchInductor CPU 后端获得大幅优化,在 97.5% 的测试模型上超越 eager 模式性能。支持:

  • CPP 后端代码生成
  • FX 融合与自定义 CPU 内核
  • max-autotune 模式的 GEMM 模板

PyTorch 2.6 新特性详解

PyTorch 2.6 于 2025 年 1 月发布,继续推进 PT2 编译技术:

Python 3.13 支持

torch.compile 现在支持 Python 3.13,用户可以在最新 Python 版本中优化模型。

torch.compiler.set_stance(Beta)

新功能允许指定 torch.compile 在不同调用间的行为"姿态":

import torch

model = MyModel()
compiled_model = torch.compile(model)

# 设置姿态:在需要重新编译时使用 eager 模式
torch.compiler.set_stance("eager_on_recompile")

output = compiled_model(input) # 尽可能复用缓存的编译代码

可用姿态包括:

  • default:正常编译行为
  • eager_on_recompile:重新编译时回退到 eager,复用缓存代码
  • fail_on_recompile:重新编译时报错(用于调试)

FP16 支持 X86 CPU

FP16 数据类型在 X86 CPU 上的支持从原型升级为 Beta 特性,支持 eager 模式和 Torch.compile + Inductor 模式。Intel Xeon 6 处理器的 AMX 加速器原生支持 FP16。

import torch

# 在 CPU 上使用 FP16
x = torch.randn(1000, 1000, dtype=torch.float16)
y = torch.randn(1000, 1000, dtype=torch.float16)
z = torch.mm(x, y) # CPU FP16 矩阵乘法

torch.library.triton_op(Beta)

提供标准方式创建由用户定义 Triton 内核支持的自定义算子:

import torch
from torch.library import triton_op

@triton_op("my_lib::custom_kernel", mutates_args=())
def my_custom_kernel(x: torch.Tensor) -> torch.Tensor:
# Triton 内核实现
...

# torch.compile 可以优化 Triton 内核
compiled = torch.compile(my_custom_kernel)

AOTInductor 增强

  • PT2 Archive:新的打包格式,包含 AOTInductor 所需的所有文件
  • Minifier:遇到错误时创建最小化的 nn.Module 复现问题
  • ABI 兼容模式:确保 AOTInductor 编译的模型在新版 PyTorch 上继续运行
重要变更

从 PyTorch 2.6 开始,torch.loadweights_only 参数默认值变为 True,这是一个安全性改进。如果需要加载包含非张量数据的检查点,需要显式设置 weights_only=False

版本兼容性说明

  • PyTorch 保持较好的向后兼容性
  • 1.x 的代码通常可以在 2.x 运行
  • 建议使用最新稳定版获得最佳性能
  • 注意 PyTorch 2.6 不再发布 Conda 包,请使用 pip 安装

准备好了吗?

现在你已经了解了深度学习的基础概念和 PyTorch 的核心特性。点击下一章开始你的深度学习之旅,首先我们将学习 PyTorch 的核心数据结构——张量(Tensor)。

记住:深度学习是一门实践性很强的技术,多动手、多思考、多调试,你一定能掌握它!