Pytorch Lightning 1.5.1 到 Pytorch Lightning 2.0.0 的迁移坑

Pytorch Lightning 1.5.1 到 Pytorch Lightning 2.0.0 的迁移坑

问题描述

  1. 版本兼容报错,可参考函数替代与参数修改节,以及直接根据终端输出修改。
  2. 由 all_step_outputs 迁移修改至分步的 training_step_outputs, validation_step_outputs 和 test_step_outputs。结合官方 github 中迁移说明和 Pytoch Lighning 官方文档修改(😇)。

函数替代与参数修改(部分)

  1. Pytorch Lightning 1.5.1 LightningModule 中的 training_epoch_end( ) 在 Pytorch Lightning 2.0.0 LightningModule 中被替换为 on_train_epoch_end( )。类似的有 validation_epoch_end ( ) 及 test_epoch_end( )。原文参考:github 迁移
  2. pytorch_lightning.trainer.trainer 参数发生以下变化:
    accelerator (Union[str, Accelerator, None]) --> accelerator (Union[str, Accelerator]),不再支持将 strategy 参数在 accelerator 中导入。
    checkpoint_callback (Optional[bool]) 参数被移除,该参数功能被 enable_checkpointing (Optional[bool]) 合并替代。
    flush_logs_every_n_steps (Optional[int]) 和 log_gpu_memory (Optional[str]) 被移除,需用户在相应模块中自定义。

上述参考来源:Pytorch Lightning 1.5.1 官方文档 Trainer

All_step_outputs 的迁移

官方 github 的说明中,给出了函数替代的修改,以及在 _init_ 模块里新增 train_step_outputs 等变量定义,其修改如下:

 class MyLightningModule(L.LightningModule):
+    def __init__(self):
+        super().__init__()
+        self.training_step_outputs = []

     def training_step(self, ...):
         loss = ...
+        self.training_step_outputs.append(loss)
         return loss

#-------------------- 删除部分 ----------------------
#-    def training_epoch_end(self, outputs):
#-        epoch_average = torch.stack([output["loss"] for output in outputs]).mean()
#-------------------- 删除部分 ----------------------

+    def on_train_epoch_end(self):
+        epoch_average = torch.stack(self.training_step_outputs).mean()
         self.log("training_epoch_average", epoch_average)
+        self.training_step_outputs.clear()  # free memory

Pytorch Lightning 2.0.0官方文档 中 给出的 on_train_epoch_end( ) 简单模板:

class MyLightningModule(L.LightningModule):
    def __init__(self):
        super().__init__()
        self.training_step_outputs = []

    def training_step(self):
        loss = ...
        self.training_step_outputs.append(loss)
        return loss


class MyCallback(L.Callback):
    def on_train_epoch_end(self, trainer, pl_module):
        # do something with all training_step outputs, for example:
        epoch_mean = torch.stack(pl_module.training_step_outputs).mean()
        pl_module.log("training_epoch_mean", epoch_mean)
        # free up the memory
        pl_module.training_step_outputs.clear()

在 training_step 的末尾一定要加上 self.xxx.append( ) 操作,在 1.5.1 的版本中,这个操作似乎隐式的完成了,而在新版中如果不 append 在进行 evaluate 等操作时常常会得到空的输出。
validation_step_outputs() 与 test_step_outputs() 类似。
【踩坑ing】

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PyTorch Lightning是一种轻量级的高级PyTorch封装,它使得训练神经网络更加容易、更加模块化。它提供了许多常用的功能,例如自动分布式训练、自动检查点、自动日志记录等等。下面是一个PyTorch Lightning的学习指南: 1. 先学习PyTorch基础知识:在学习PyTorch Lightning之前,您需要先学习PyTorch的基础知识,例如如何构建神经网络、如何训练模型等等。 2. 安装PyTorch Lightning:在安装PyTorch Lightning之前,您需要先安装PyTorch。然后可以通过pip安装PyTorch Lightning。 3. 了解PyTorch Lightning的核心概念:PyTorch Lightning的核心概念是“LightningModule”、“Trainer”和“DataModule”。LightningModule是您定义神经网络的地方,Trainer是您定义训练过程的地方,DataModule是您定义数据集的地方。 4. 编写您的第一个PyTorch Lightning程序:您可以从一个简单的例子开始,例如MNIST手写数字识别。在这个例子中,您可以定义一个LightningModule来构建神经网络,定义一个DataModule来加载数据集,然后定义一个Trainer来训练模型。 5. 学习如何自动分布式训练:PyTorch Lightning可以自动进行分布式训练,这意味着您可以在多个GPU或多台计算机上训练模型。您只需要在Trainer中设置一些参数即可。 6. 学习如何自动检查点和日志记录:PyTorch Lightning可以自动保存检查点和记录日志,这使得您可以在训练过程中随时恢复模型并查看训练指标。 7. 学习如何使用PyTorch Lightning扩展您的研究:PyTorch Lightning提供了许多扩展功能,例如自动优化器、自动批量大小调整、自动对抗性训练等等。您可以使用这些功能来扩展您的研究。 总之,PyTorch Lightning是一个非常强大的工具,可以使训练神经网络更加容易和高效。如果您想提高您的PyTorch技能并加快训练过程,请考虑学习PyTorch Lightning

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值