写 PyTorch 总像在写脚本?试试 PyTorch Lightning,把模型训练变成“工程化项目”
写 PyTorch 总像在写脚本?试试 PyTorch Lightning,把模型训练变成“工程化项目”
作者:Echo_Wish
做过深度学习项目的朋友,大概率都有过这种经历。
刚开始写模型时,一切很美好:
model = MyModel()
optimizer = torch.optim.Adam(model.parameters())
for epoch in range(10):
for x, y in dataloader:
optimizer.zero_grad()
pred = model(x)
loss = loss_fn(pred, y)
loss.backward()
optimizer.step()
代码几十行,看起来很优雅。
但项目一旦稍微复杂一点,事情就开始变味了。
你会慢慢加上:
- GPU 支持
- 多卡训练
- 日志系统
- checkpoint
- early stopping
- mixed precision
- 分布式训练
- tensorboard
然后你的训练脚本就变成这样:
train.py
1200 行
代码越来越像一锅粥。
很多团队最后都陷入一个困境:
模型能跑,但代码完全不工程化。
这时候就该轮到今天的主角登场了:
PyTorch Lightning
简单说一句:
PyTorch Lightning 就是帮你把“研究代码”变成“工程代码”。
今天咱们就聊聊,为什么它这么香。
一、PyTorch Lightning 到底解决了什么问题
Lightning 的核心思想其实很简单:
把“模型逻辑”和“训练逻辑”分离。
传统 PyTorch:
model + optimizer + training loop
全部混在一起
Lightning:
模型逻辑
↓
LightningModule
训练流程
↓
Trainer
你只关心三件事:
- forward
- loss
- optimizer
剩下的事情交给框架。
二、Lightning 的核心结构
一个 Lightning 项目通常长这样:
project/
├─ model.py
├─ dataset.py
├─ train.py
└─ config.yaml
核心是两个类:
LightningModule
LightningDataModule
三、把普通 PyTorch 改造成 Lightning
先看一个普通的 PyTorch 模型。
import torch
import torch.nn as nn
import torch.optim as optim
class Net(nn.Module):
def __init__(self):
super().__init__()
self.fc = nn.Linear(784, 10)
def forward(self, x):
return self.fc(x)
训练代码:
model = Net()
optimizer = optim.Adam(model.parameters())
for epoch in range(10):
for x, y in train_loader:
optimizer.zero_grad()
pred = model(x)
loss = nn.CrossEntropyLoss()(pred, y)
loss.backward()
optimizer.step()
代码看起来不复杂,但问题很多:
- 日志怎么办
- checkpoint 怎么保存
- GPU 怎么用
- 多卡训练怎么办
Lightning 的写法是这样。
四、LightningModule:核心组件
import pytorch_lightning as pl
import torch.nn as nn
import torch
class LitModel(pl.LightningModule):
def __init__(self):
super().__init__()
self.layer = nn.Linear(784, 10)
self.loss_fn = nn.CrossEntropyLoss()
def forward(self, x):
return self.layer(x)
def training_step(self, batch, batch_idx):
x, y = batch
logits = self(x)
loss = self.loss_fn(logits, y)
self.log("train_loss", loss)
return loss
def configure_optimizers(self):
optimizer = torch.optim.Adam(self.parameters(), lr=1e-3)
return optimizer
代码非常清晰:
forward
training_step
optimizer
训练逻辑完全隔离。
五、训练流程变得极其简单
以前的训练脚本:
几百行
Lightning 版本:
from pytorch_lightning import Trainer
model = LitModel()
trainer = Trainer(max_epochs=10)
trainer.fit(model, train_loader)
三行代码。
但背后帮你做了很多事情:
- 自动 GPU
- 自动 checkpoint
- 自动日志
- 自动分布式
六、Lightning 的工程化能力
Lightning 真正厉害的地方,是工程能力。
我挑几个最常用的。
1 自动 GPU / 多卡训练
以前要写:
model = model.cuda()
x = x.cuda()
Lightning:
trainer = Trainer(
accelerator="gpu",
devices=2
)
直接两张卡训练。
如果是分布式:
trainer = Trainer(
accelerator="gpu",
devices=4,
strategy="ddp"
)
不用写任何分布式代码。
2 自动 checkpoint
深度学习训练最怕什么?
训练到一半断电。
Lightning 自带 checkpoint:
from pytorch_lightning.callbacks import ModelCheckpoint
checkpoint = ModelCheckpoint(
monitor="val_loss",
save_top_k=1
)
trainer = Trainer(
callbacks=[checkpoint]
)
自动保存最佳模型。
3 TensorBoard 日志
很多人会写:
writer.add_scalar(...)
Lightning 直接:
self.log("loss", loss)
TensorBoard 自动生成。
七、LightningDataModule:数据工程化
很多项目的另一个痛点:
数据加载代码非常乱。
Lightning 提供了 DataModule。
import pytorch_lightning as pl
from torch.utils.data import DataLoader
class MyData(pl.LightningDataModule):
def train_dataloader(self):
return DataLoader(
train_dataset,
batch_size=32,
shuffle=True
)
def val_dataloader(self):
return DataLoader(
val_dataset,
batch_size=32
)
训练:
trainer.fit(model, datamodule=data)
数据逻辑彻底解耦。
八、Lightning 项目的真实结构
成熟项目通常长这样:
ml-project
│
├─ data
│ └─ dataset.py
│
├─ models
│ └─ classifier.py
│
├─ lightning
│ └─ module.py
│
├─ configs
│ └─ config.yaml
│
└─ train.py
这时候代码就从:
研究代码
升级成:
工程项目
九、一个简单训练流程图
Lightning 的核心流程其实很简单:
Dataset
↓
DataModule
↓
LightningModule
↓
Trainer
↓
训练完成
开发者只写 模型和数据逻辑。
训练循环由框架统一管理。
十、什么时候适合用 Lightning
我自己的经验是:
研究阶段
普通 PyTorch 更灵活。
工程阶段
Lightning 非常合适。
比如:
- 模型训练平台
- 自动训练 pipeline
- 多 GPU 训练
- 实验管理
很多公司内部训练平台,其实就是 Lightning + 一些封装。
十一、一个很多人忽略的价值
Lightning 最大的价值,其实不是代码少。
而是:
代码规范。
所有项目统一结构:
LightningModule
DataModule
Trainer
新人一进项目就知道:
- 模型在哪
- 数据在哪
- 训练逻辑在哪
这在团队协作里非常重要。
最后
很多人学深度学习时,会花很多时间在:
- CNN
- Transformer
- Diffusion
但真正做项目之后你会发现:
工程能力比模型更重要。
一个模型代码如果写得像脚本:
无法维护
无法复现
无法扩展
那它很难真正落地。
而 PyTorch Lightning 做的事情其实很朴素:
把深度学习代码,变成软件工程项目。
如果你正在做:
- 模型训练平台
- 多人协作 AI 项目
- 复杂训练 pipeline
- 点赞
- 收藏
- 关注作者
评论(0)