Home

Awesome

简介

一套适合初学者的pytorch lightning代码框架,能够满足DL时需要用到的很多内容,如实验版本管理、配置文件管理、命令行解析、多卡训练、EarlyStopping策略、累计梯度、梯度clipping等等。具体细节见boring.py

安装

pip install -r requirements.txt

生成配置文件

命令行运行以下指令会生成配置文件boring.yaml.

python boring.py fit --print_config > boring.yaml

配置文件主要包含:

seed_everything: 2 # 此处2是自己给定的随机数种子
ckpt_path: null # null表示从头开始训练,给定checkpoint的时候表示从checkpoint开始训练
trainer:
  # trainer的参数,如:
  devices: 1,
  max_epochs: 100
model:
  # 模型的参数,对应代码里面的MyModule。如:
  arch:
    ...
  exp_name: exp
data:
  # 数据集的参数,对应代码里面的MyDataModule。如:
  batch_size:
    - 1
    - 2
# 此处省略了其他配置,如checkpoint保存,EarlyStopping也在这个配置文件里面

训练

命令行运行以下指令会使用生成的配置文件boring.yaml来进行训练(fit)。

python boring.py fit --config boring.yaml --data.batch_size=[24,48] --trainer.devices=0,

其中--data.batch_size=[24,48]会修改配置文件里面的data部分的batch_size[24,48](24是训练集的batch size,48是验证集的)。配置文件里面其他的参数,如trainer.devices,都可以通过这种方式来修改,如--trainer.devices=2,(表示使用2号卡,不要忘记在卡号后面加逗号,不加会被认为使用2张卡训练,而非2号卡)。

GPU训练

多卡采用DDP模式训练时,注意保持不同实验间的batch_size一致。下面的例子的训练时总的batch size = 4 * 3,其中4是train dataloader的batch size,3是gpu的数目。

python boring.py fit --config boring.yaml --data.batch_size=[4,8] --trainer.devices=0,1,3

混合精度训练

上面的例子,使用FP16混合精度训练:

python boring.py fit --config boring.yaml --data.batch_size=[4,8] --trainer.devices=0,1,3 --trainer.precision=16-mixed

使用BF16混合精度训练:

python boring.py fit --config boring.yaml --data.batch_size=[4,8] --trainer.devices=0,1,3 --trainer.precision=bf16-mixed

一般而言,使用混合精度训练时,训练速度会有较大的提升,模型性能会有轻微下降。

恢复训练

恢复训练时,使用对应version的配置文件,以及对应的checkpoint

python boring.py fit --config logs/MyModel/version_x/config.yaml --ckpt_path logs/MyModel/version_x/checkpoints/last.ckpt --trainer.devices=0,1,3

测试

测试时,使用训练时使用的配置文件,以及想要测试的checkpoint

python boring.py test --config logs/MyModel/version_x/config.yaml --ckpt_path logs/MyModel/version_x/checkpoints/epoch2_valid_loss-1576.2192.ckpt --trainer.devices=0,1,3

批量训练

批量训练功能会不断地读取tasks目录下的任务,当任务启动要求满足时会使用nohup指令启动任务(任务配置参考tasks/template.yaml)。任务启动完成之后,任务配置文件会被移动到tasks/started目录下,任务输出会被保存为tasks/started目录下同名的log文件。任务结束之后,任务配置文件和log文件会被移动到tasks/done目录下。注意事项:不要让run_tasks.py停止运行(可以在byobu里面运行,或者使用nohup指令运行)。

安装: 只使用批量训练功能时,只需安装pip install gpustat

批量训练:可以使用run_tasks.py:

python run_tasks.py --gpus 0 1 2 3 --email=zhangsan@qq.com --email_task_started --email_task_ended --email_task_list_empty --email_task_all_ended --endless

参数
--gpus:需要监控的GPU编号
--email:通知邮箱,网易邮箱和QQ邮箱已经过测试,其他邮箱不确定。
--email_task_started:给定这个参数时,任务启动时会邮件通知
--email_task_ended:给定这个参数时,任务结束时会邮件通知
--email_task_list_empty:给定这个参数时,任务列表为空时会邮件通知。建议指定这个参数,任务列表为空时正好有一段时间可以安排下一波任务。
--email_task_all_ended:给定这个参数时,任务全部结束时会邮件通知。全部结束指的是给定的GPU全部空闲【空闲指的是没有当前的用户的任务在跑】。
--endless:是否无限循环

自定义:如果觉得配置文件比较麻烦,可以直接修改run_tasks.py中的read_tasks方法,实现自己的需求。