PyTorch 教程
欢迎学习 PyTorch!本教程将带你从零基础开始,逐步掌握深度学习的核心知识和 PyTorch 框架的实战技能。
什么是深度学习?
在介绍 PyTorch 之前,我们需要先理解什么是深度学习,以及它为什么如此重要。
从机器学习到深度学习
机器学习是一门让计算机从数据中学习规律的技术。传统的机器学习方法需要人工设计特征,然后使用算法进行分类或回归。例如,识别图片中的猫,需要先设计边缘检测、颜色分布等特征,再用分类器判断。
深度学习是机器学习的一个分支,它的核心思想是让神经网络自动学习特征。通过多层神经网络,深度学习可以从原始数据中逐层提取越来越抽象的特征:第一层可能学习边缘和纹理,第二层学习形状和部件,更高层学习完整的物体概念。
神经网络:深度学习的基础
神经网络是深度学习的基本模型,灵感来源于人脑神经元的工作方式。一个简单的神经网络由以下部分组成:
神经元(Neuron):接收输入信号,进行加权求和,再通过激活函数输出结果。
其中 是输入, 是权重, 是偏置, 是激活函数。
前向传播(Forward Propagation):数据从输入层经过隐藏层流向输出层的过程。
损失函数(Loss Function):衡量模型预测值与真实值之间的差距。常见的损失函数包括:
- 均方误差(MSE):用于回归问题
- 交叉熵损失(Cross-Entropy):用于分类问题
反向传播(Backpropagation):根据损失函数,从输出层向输入层逐层计算梯度,告诉每个参数应该如何调整才能减小损失。
梯度下降(Gradient Descent):使用计算出的梯度更新参数:
其中 是学习率,控制更新步长。
深度学习的应用领域
深度学习已经深刻改变了众多领域:
| 领域 | 应用 | 代表技术 |
|---|---|---|
| 计算机视觉 | 图像分类、目标检测、人脸识别 | 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
| 特性 | PyTorch | TensorFlow |
|---|---|---|
| 计算图 | 动态图(Eager Execution) | 静态图(2.x 支持动态) |
| 调试体验 | 原生 Python 调试,断点、打印都可以 | 较复杂,需要特殊技巧 |
| 学习曲线 | 较平缓,类似 NumPy 的使用体验 | 较陡峭,概念较多 |
| 部署方式 | TorchScript、ONNX、TorchServe | TensorFlow 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 的工作原理:
- TorchDynamo:捕获 PyTorch 程序的动态行为,安全地提取计算图
- TorchInductor:将计算图编译成高效的底层代码(Triton 或 C++)
- 自动优化:自动应用 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 常用 API 速查
学习建议
前置知识
学习 PyTorch 前需要掌握:
必要基础:
- Python 编程:变量、函数、类、模块、文件操作
- NumPy 基础:数组操作、索引、广播机制
推荐了解:
- 机器学习基础:监督学习、无监督学习、过拟合、正则化
- 线性代数:矩阵运算、向量空间、特征值
- 微积分:导数、偏导数、链式法则
- 概率统计:概率分布、期望、方差
学习路径
第一阶段:基础入门(1-2 周)
│
├── 环境配置 → 跑通第一个程序
├── 张量操作 → 理解 PyTorch 数据结构
└── 自动求导 → 理解梯度计算原理
│
第二阶段:神经网络核心(2-3 周)
│
├── nn.Module → 构建神经网络
├── Dataset/DataLoader → 数据处理
├── 损失函数与优化器 → 训练模型
└── MNIST/CIFAR 实战 → 完整项目
│
第三阶段:经典架构(3-4 周)
│
├── CNN → 图像分类
├── RNN/LSTM → 序列建模
└── 迁移学习 → 使用预训练模型
│
第四阶段:进阶应用(持续学习)
│
├── 模型优化 → 加速训练、减少显存
├── 模型部署 → 生产环境应用
└── 特定领域 → NLP、CV、推荐等
实践建议
- 动手实践:不要只看代码,每行代码都要亲自敲一遍
- 理解原理:不仅要会用 API,还要理解背后的数学原理
- 多调参数:改变超参数观察结果,建立直觉
- 阅读源码:遇到问题时阅读 PyTorch 源码,理解实现细节
- 参与社区:在 GitHub、论坛讨论问题,分享经验
- 关注更新:PyTorch 迭代较快,保持学习新特性
常见学习陷阱
| 陷阱 | 表现 | 建议 |
|---|---|---|
| 只看不练 | 看完教程觉得懂了,动手就不会 | 每个知识点都写代码验证 |
| 跳过基础 | 直接看复杂模型,发现看不懂 | 扎实掌握张量和自动求导 |
| 死记 API | 记忆大量函数用法 | 理解原理,善用文档 |
| 忽视调试 | 出错就放弃 | 学会使用调试工具定位问题 |
| 过早优化 | 追求性能忽略正确性 | 先保证正确,再考虑优化 |
深度学习资源推荐
官方资源
经典教材
- 《动手学深度学习》(Dive into Deep Learning):中文版,理论结合代码,强烈推荐
- Deep Learning with PyTorch:官方团队编写,深入浅出
- 《深度学习》(Deep Learning, Ian Goodfellow):深度学习圣经,偏理论
在线课程
- Stanford CS231n:计算机视觉经典课程
- Stanford CS224n:自然语言处理课程
- fast.ai Practical Deep Learning:实践导向,快速上手
社区资源
- PyTorch 论坛:https://discuss.pytorch.org/
- Stack Overflow:搜索
[pytorch]标签 - Papers with Code:https://paperswithcode.com/,论文+代码实现
版本说明
本教程基于 PyTorch 2.x 版本编写。主要版本差异:
| 版本 | 发布时间 | 主要特性 |
|---|---|---|
| 1.x | 2017-2022 | 动态图、Eager Execution |
| 2.0 | 2023.03 | torch.compile、性能优化 |
| 2.1 | 2023.10 | 改进的编译器、分布式增强 |
| 2.2 | 2024.01 | 进一步性能优化、新后端支持 |
| 2.3 | 2024.04 | SDPA 优化、张量并行改进 |
| 2.4 | 2024.07 | Python 3.12 支持、延迟加载 |
| 2.5 | 2024.10 | cuDNN SDPA 后端、区域编译、FlexAttention |
| 2.6 | 2025.01 | Python 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.load 的 weights_only 参数默认值变为 True,这是一个安全性改进。如果需要加载包含非张量数据的检查点,需要显式设置 weights_only=False。
版本兼容性说明:
- PyTorch 保持较好的向后兼容性
- 1.x 的代码通常可以在 2.x 运行
- 建议使用最新稳定版获得最佳性能
- 注意 PyTorch 2.6 不再发布 Conda 包,请使用 pip 安装
准备好了吗?
现在你已经了解了深度学习的基础概念和 PyTorch 的核心特性。点击下一章开始你的深度学习之旅,首先我们将学习 PyTorch 的核心数据结构——张量(Tensor)。
记住:深度学习是一门实践性很强的技术,多动手、多思考、多调试,你一定能掌握它!