Pytorch-Lightning介绍
github地址: https://github.com/Lightning-AI/lightning
API: https://pytorch-lightning.readthedocs.io/en/latest/index.html
PyTotrch具有简单好用的特点,但对于较复杂的任务可能会出现一些问题,且花费的时间也更长。
PyTorch Lightning可以将 研究代码和工程代码分离, 将PyTorch代码结构化,更加直观的展现数据操作过程,使得冗长的代码更加轻便,也可以称为轻量版的PyTorch。类似keras。
Lightning将以下结构强制应用于代码,从而使其可重用和共享:
研究代码(LightningModule)。
工程代码(Trainer)。
非必要的研究代码(Callbacks)。
数据(使用PyTorch DataLoader或将它们放入LightningDataModule中)。
完成此操作后,就可以在多个GPU,TPU,CPU上甚至在16位精度下进行训练,而无需更改代码!
Pytorch-Lightning安装
pip安装
pip install pytorch-lightningconda安装
conda install pytorch-lightning -c conda-forgePytorch-Lightning优势
不需要手写和维护额外的代码
提供多种优化策略
early-stoppoing
模型数据会自动上传到cuda(无需手动)
日志的输出
分布式的训练
Tensorboard的可视化
Pytorch-Lightning使用
PL的主要过程
# 从模型的定义开始,主要区别就是继承pl.LightningModuleclass LitAutoEncoder(pl.LightningModule):# 定义网络架构def __init__(self):super(LitAutoEncoder).__init__()self.encoder = nn.Sequential(nn.Linear(28*28, 64),nn.ReLU(),nn.Linear(64, 3)# 前向传播过程def forward(self, x):# 训练loopdef training_step(self, batch, batch_idx):self.log('train_loss', loss)return loss# 定义优化器def configure_optimizers(self):optimizer = torch.optim.Adam(self.parameters(), lr=1e-3)return optimizer# 使用pl.Trainer()完成训练autoencoder = LitAutoEncoder()trainer = pl.Trainer(gpus=0)trainer.fit(autoencoder, train_loader)trainer是自动化的,包括:
Epoch and batch iteration
自动调用 optimizer.step(), backward, zero_grad()
自动调用 .eval(), enabling/disabling grads
权重加载
保存日志到tensorboard
支持多-GPU、TPU、AMP
PL的训练验证测试过程
训练、验证和测试的过程是一样的,就是对三个函数进行重写。
training_step(self, batch, batch_idx)
validation_step(self, batch, batch_idx)
test_step(self, batch, batch_idx)
除以上三个主要函数外,还有training_step_end(self,batch_parts) 和 training_epoch_end(self, training_step_outputs)。
*_step_end-- 即每一个 * 步完成后调用。
*_epoch_end-- 即每一个 * 的epoch 完成之后会自动调用。
上面的 * 对train、valid、test都适用
def training_step(self, batch, batch_idx):x, y = batchy_hat = self.model(x)loss = F.cross_entropy(y_hat, y)pred = ...return {'loss': loss, 'pred': pred}
def training_step_end(self, batch_parts):当gpus=0 or 1时,这里的batch_parts即为traing_step的返回值(已验证)当gpus>1时,这里的batch_parts为list,list中每个为training_step返回值,list[i]为i号gpu的返回值(这里未验证)gpu_0_prediction = batch_parts[0]['pred']gpu_1_prediction = batch_parts[1]['pred']
# do something with both outputsreturn (batch_parts[0]['loss'] + batch_parts[1]['loss']) / 2
def training_epoch_end(self, training_step_outputs):for out in training_step_outputs:# do something with preds上述代码中:batch 即为从 train_dataloader 采样的一个batch的数据,batch_idx即为目前batch的索引。
pl.Trainer的主要参数
1、默认为每1个epoch校验一次,即自动调用validation_step()函数,可以进行设置
trainer = pl.Trainer(check_val_every_n_epoch=1)2、设置GPU
trainer = pl.Trainer(gpu=0)3、单个epoch内校验
# 每训练单个epoch的 25% 调用校验函数一次,注意:要传入float型数trainer = Trainer(val_check_interval=0.25)# 当然也可以是单个epoch训练完多少个batch后调用一次校验函数,但是一定是传入int型trainer = Trainer(val_check_interval=100) # 每训练100个batch校验一次4、测试
test 在训练过程中是不调用的,也就是说是不相关,在训练过程中只进行training和validation。
这里假设已经训练完成,进行测试
# 获取恢复了权重和超参数等的模型model = MODEL.load_from_checkpoint(checkpoint_path='my_model_path/hei.ckpt')# 修改测试时需要的参数,例如预测的步数等model.pred_step = 1000# 定义trainer, 其中limit_test_batches表示取测试集中的0.05的数据来做测试trainer = pl.Trainer(gpus=1, precision=16, limit_test_batches=0.05)# 测试,自动调用test_step(), 其中dm为数据集,放在下面讲trainer.test(model=dck, datamodule=dm)数据集的实现
class MyDataModule(pl.LightningDataModule):def __init__(self):super().__init__()...blablabla...def setup(self, stage):# 实现数据集的定义,每张GPU都会执行该函数, stage 用于标记是用于什么阶段if stage == 'fit' or stage is None:self.train_dataset = DCKDataset(self.train_file_path, self.train_file_num, transform=None)self.val_dataset = DCKDataset(self.val_file_path, self.val_file_num, transform=None)if stage == 'test' or stage is None:self.test_dataset = DCKDataset(self.test_file_path, self.test_file_num, transform=None)def prepare_data(self):# 在该函数里一般实现数据集的下载等,只有cuda:0 会执行该函数passdef train_dataloader(self):return DataLoader(self.train_dataset, batch_size=self.batch_size, shuffle=False, num_workers=0)
def val_dataloader(self):return DataLoader(self.val_dataset, batch_size=self.batch_size, shuffle=False)
def test_dataloader(self):return DataLoader(self.test_dataset, batch_size=1, shuffle=True)训练与测试阶段
dm = MyDataModule(args)if not is_predict:# 训练# 定义保存模型的callback,仔细查看后文checkpoint_callback = ModelCheckpoint(monitor='val_loss')# 定义模型model = MyModel()# 定义loggerlogger = TensorBoardLogger('log_dir', name='test_PL')# 定义数据集为训练校验阶段dm.setup('fit')# 定义trainertrainer = pl.Trainer(gpus=gpu, logger=logger, callbacks=[checkpoint_callback]);# 开始训练trainer.fit(dck, datamodule=dm)else:# 测试阶段dm.setup('test')# 恢复模型model = MyModel.load_from_checkpoint(checkpoint_path='trained_model.ckpt')# 定义trainer并测试trainer = pl.Trainer(gpus=1, precision=16, limit_test_batches=0.05)trainer.test(model=model, datamodule=dm)参考
github地址: https://github.com/Lightning-AI/lightning
API: https://pytorch-lightning.readthedocs.io/en/latest/index.html
新年福利
为回馈新老学员对七月在线的支持与肯定,新年之际,正价课开启秒杀模式,部分秒杀课如下图:
集训营、高级班,论文/申博留学等1V1辅导课也开启送福利活动,需要的小伙伴可找苏苏老师(VX:julyedukefu008)或七月在线其他老师了解
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.