# Pytorch Lightning 闯关实录 **Repository Path**: Howie0126/StraightenOutPytorchLightning ## Basic Information - **Project Name**: Pytorch Lightning 闯关实录 - **Description**: 用一小段时间来学会Pytorch-Lighting。 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-01-19 - **Last Updated**: 2023-09-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Haowei 的 Pytorch Lightning 闯关实录 > Motivation: 作为使用Keras入门深度学习的我,接触动则一个py文件几百行的Pytorch代码感觉非常头疼。 ## 说几句 Pytorch-Lightning这个库我“发现”过两次。第一次发现时,感觉它很重很难学,而且似乎自己也用不上。但是后面随着做的项目开始出现了一些稍微高阶的要求,我发现我总是不断地在相似工程代码上花费大量时间,Debug也是这些代码花的时间最多,而且渐渐产生了一个矛盾之处:如果想要更多更好的功能,如TensorBoard支持,Early Stop,LR Scheduler,分布式训练,快速测试等,代码就无可避免地变得越来越长,看起来也越来越乱,同时核心的训练逻辑也渐渐被这些工程代码盖过。那么有没有更好的解决方案,甚至能一键解决所有这些问题呢? 于是我第二次发现了Pytorch-Lightning。但是问题还是来了。这个框架并没有因为香而变得更加易学。官网的教程很丰富,可以看出来开发者们在努力做了。但是很多相连的知识点都被分布在了不同的版块里,还有一些核心的理解要点并没有被强调出来,而是小字带过,这让我想做一个普惠的教程,包含所有我在学习过程中认为重要的概念,好用的参数,一些注意点、坑点,大量的示例代码段和一些核心问题的集中讲解。 ## 模板架构 - 主目录下只放一个`main.py`文件和一个用于辅助的`utils.py`。 - `data`和`modle`两个文件夹中放入`__init__.py`文件,做成包。这样方便导入。两个`init`文件分别是: - `from .data_interface import DInterface` - `from .model_interface import MInterface` - 在`data_interface `中建立一个`class DInterface(pl.LightningDataModule):`用作所有数据集文件的接口。`__init__()`函数中import相应Dataset类,`setup()`进行实例化,并老老实实加入所需要的的`train_dataloader`, `val_dataloader`, `test_dataloader`函数。这些函数往往都是相似的,可以用几个输入args控制不同的部分。 - 同理,在`model_interface `中建立`class MInterface(pl.LightningModule):`类,作为模型的中间接口。`__init__()`函数中import相应模型类,然后老老实实加入`configure_optimizers`, `training_step`, `validation_step`等函数,用一个接口类控制所有模型。不同部分使用输入参数控制。 - `main.py`函数只负责: - 定义parser,添加parse项。(注意如果你的模型或数据集文件的`__init__`函数中有需要外部控制的变量,如一个`random_arg`,你可以直接在`main.py`的Parser中添加这样一项,如`parser.add_argument('--random_arg', default='test', type=str)`,两个`Interface`类会自动传导这些参数到你的模型或数据集类中。) - 选好需要的`callback`函数们,如自动存档,Early Stop,LR Scheduler等。 - 实例化`MInterface`, `DInterface`, `Trainer`。 完事。 **需要注意的是,为了实现自动加入新model和dataset而不用更改Interface,model文件夹中的模型文件名应该使用snake case命名,如`rdn_fuse.py`,而文件中的主类则要使用对应的驼峰命名法,如`RdnFuse`**。 数据集data文件夹也是一样。 虽然对命名提出了较紧的要求,但实际上并不会影响使用,反而让你的代码结构更加清晰。希望使用时候可以注意这点,以免无法parse。