写在前面
题主pytorch-lighting版本用的1.1.4版本,虽然该版本在官方文档似乎已经被废用了(官方文档也找不到这个版本)。但是本人参考的项目所用的是该版本,后续有机会再升级迁移吧,现在先记录一下自己在看这个Trainer参数各个参数的一些解读。
Trainer参数解读
本次解读主要是看其源码里关于参数的注释翻译,加以自己的理解,以及参考官方文档来。
我没有用到的参数就直接翻译源码中的翻译
- accelerator:支持传递不同的加速器类型
(“ cpu”、“ gpu”、“ tpu”、“ ipu”、“ auto”)
以及自定义加速器实例。(我用时没有指定,但是就默认用我的GPU了。该介绍是官网介绍)
trainer = Trainer(accelerator="gpu")
- accumulate_grad_batches:每 k 个批次或按照字典中的设置累积梯度。
这个即为梯度累积增加batch大小,指定batch大小,指定每个gpu_batch大小,指定gpu数量和分布式的节点数,该参数的计算可以用以下代码实现。意思就是每次算per_gpu_batchsize个数的梯度,然后累积到batch_size数目,然后再更新参数,没有内存开销,以时间换空间
grad_steps = _config["batch_size"] // (
_config["per_gpu_batchsize"] * num_gpus * _config["num_nodes"]
)
- amp_backend:要使用的混合精度后端(
native
或apex
) - amp_level:要使用的优化级别(O1、O2 等)。
- auto_lr_find:如果设置为
True
,将使trainer.tune()
运行学习率查找器,尝试优化初始学习以实现更快的收敛。 trainer.tune() 方法将在 LightningModule 的self.lr
或self.learning_rate
中设置建议的学习率。要使用不同的键,请将键名称设置为字符串而不是 True。 - auto_scale_batch_size: 如果设置为 True,将
initially
运行批量大小finder 试图找到适合内存的最大批量大小。 结果将存储在LightningModule中的self.batch_size
中。 此外,可以设置为通过估计批量大小的power
强力搜索或binsearch
,通过二分搜索估计批量大小。 - auto_select_gpus: 如果启用并且“gpus”是一个整数,则选择可用GPU自动。 这在以下情况下特别有用: GPU 配置为“独占模式”,例如一次只有一个进程可以访问它们。
- benchmark:如果 true 启用
cudnn.benchmark
。(起到一定的加速作用) - callbacks: 添加回调列表。
- checkpoint_callback: 如果为“True”,则启用检查点。如果没有用户定义的 ModelCheckpoint,它将配置默认的 ModelCheckpoint 回调
在这里我是指定了一个checkpoint_callback,一个lr_callback,将其放在list中,传给Trainer中的callbacks
checkpoint_callback = pl.callbacks.ModelCheckpoint(
save_top_k=1,
verbose=True,
monitor="val/the_metric",
mode="max",
save_last=True,
)
lr_callback = pl.callbacks.LearningRateMonitor(logging_interval="step")
callbacks = [checkpoint_callback, lr_callback]
trainer = pl.Trainer(callbacks=callbacks)
- check_val_every_n_epoch:每 n 个训练周期检查 val。
- default_root_dir: 没有传递
logger/ckpt_callback
时日志和权重的默认路径。默认值:os.getcwd()
。可以是远程文件路径,例如s3://mybucket/path
或hdfs://path/
- deterministic: 如果 true 启用 cudnn.definistic。
- distributed_backend: 已弃用。 请使用
accelerator
- fast_dev_run:如果设置为
n(int)
,则运行n
,否则如果设置为True
,则运行1
批处理训练、验证和测试来查找任何错误(即:一种单元测试)。 - flush_logs_every_n_steps:将日志刷新到磁盘的频率(默认为每 100 步)。
- gpus: 每个节点应用的要训练的 GPU 数量(int)或要训练的 GPU(列表或 str)
- gradient_clip_val:0 表示不裁剪。
- limit_train_batches: 要检查多少训练数据集(floats =percent,int = num_batches)
- limit_val_batches:要检查多少验证数据集(floats =percent,int = num_batches)
- limit_test_batches: 要检查多少测试数据集(floats =percent,int = num_batches)
- logger: 用于实验跟踪的记录器(或记录器的可迭代集合)。
一个示例代码,用的TensorBoardLogger,后续补充一个查看TensorBoardLogger的events里面的内容快速获取变量的博客,这个在留一人交叉验证时非常好用,比一个个下文件快多了(已补充)
https://blog.csdn.net/qq_45045793/article/details/137831911
logger = pl.loggers.TensorBoardLogger(
_config["log_dir"],
name=f'{exp_name}_seed{_config["seed"]}_from_{_config["load_path"].split("/")[-1][:-5]}_{current_time}',
version=f"perno_{per_no}",
)
- log_gpu_memory:
None
、min_max
、all
。 可能会降低性能 - log_every_n_steps:在步骤内记录的频率(默认为每 50 步)。(这里本人设置为10步,即每10个step打印一下log
- automatic_optimization: 如果为 False,则您负责调用 .backward、.step、zero_grad在闪电模块中。 此参数已移至 LightningModule。 它已被弃用在 v1.1 中,并将在 v1.3 中删除。
- prepare_data_per_node:如果为True,则每个LOCAL_RANK=0都会调用prepare data。否则只有NODE_RANK=0、LOCAL_RANK=0才会准备数据。
- process_position: 在同一台机器上运行多个模型时对进度条进行排序。
- progress_bar_refresh_rate: 刷新进度条的频率(以步骤为单位)。 值
0
禁用进度条。当自定义回调传递给:paramref:~Trainer.callbacks
时被忽略。 - profiler: 分析训练期间的各个步骤并协助识别瓶颈。 传递布尔值。 value 在 v1.1 中已弃用,并将在 v1.3 中删除。
- overfit_batches: 过拟合一定百分比的训练数据(float)或一定数量的批次(int)。 默认值:0.0
- plugins: 插件允许修改 ddp 和 amp 等核心行为,并启用自定义lightning 插件。
- precision:全精度(32)、半精度(16)。 可用于 CPU、GPU 或 TPU。
trainer = pl.Trainer(precision=32)
- max_epochs: 一旦达到这个 epoch 数,就停止训练。
- min_epochs: 至少进行这么多epoch 的强制训练
- max_steps:达到此步数后停止训练。 默认情况下禁用(None)。
- min_steps: 强制训练至少这些步数。 默认情况下禁用(None)。
- num_nodes: 分布式训练的GPU节点数。
- num_processes: 分布式训练的进程数,distributed_backend=“ddp_cpu”
- num_sanity_val_steps: 在开始训练例程之前,健全性检查运行
n
个验证批次。将其设置为-1
以在所有验证数据加载器中运行所有批次。 默认值:2
- reload_dataloaders_every_epoch:设置为 True 以在每个epoch重新加载数据加载器。
- replace_sampler_ddp: 显式启用或禁用采样器替换。 如果没有指定这个使用 DDP 时会自动切换。 默认情况下它会添加
shuffle=True
训练采样器和 val/test 采样器的shuffle=False
。 如果你想定制的话,您可以设置replace_sampler_ddp=False
并添加您自己的分布式采样器。 - resume_from_checkpoint:如果有, 恢复训练的检查点的路径/URL。 路径上没有检查点文件,从头开始。 如果从中期检查点恢复,训练将从下一个 epoch 开始时开始。
- sync_batchnorm:在进程组/整个世界之间同步批处理规范层。
- terminate_on_nan: 如果设置为
True
,将在以下位置终止训练(通过引发ValueError
)如果任何参数或损失为NaN 或 +/-inf
,则每个训练批次结束。 - tpu_cores:要训练多少个 TPU 核心(1 或 8)/要训练的单个 TPU [1]
- track_grad_norm:
-1
无跟踪。 否则跟踪该p-范数
。 可以设置为inf
无穷范数。 - truncated_bptt_steps: 截断后向传播每 k 步执行一次反向传播顺序。
- val_check_interval: 检查验证集的频率。 使用 float 在训练时期内进行检查,使用 int 来检查每 n 个步骤(批次)。
这里指定为0.2,即训练时每20%就进行一次val_check
pl.Trainer(val_check_interval=0.2)
- Weights_summary:训练开始时打印权重摘要。
- weights_save_path:如果指定,保存权重的位置。 将覆盖
default_root_dir
仅用于checkpoints 。 如果出于某种原因您需要checkpoints ,请使用此选项存储在与default_root_dir
中写入的日志不同的位置。可以是远程文件路径,例如s3://mybucket/path
或hdfs://path/
默认为default_root_dir
。 - move_metrics_to_cpu:是否强制将内部记录的指标移动到CPU。这可以节省一些 GPU 内存,但会使训练速度变慢。 请注意使用。
- enable_pl_optimizer:如果为 True,则每个优化器将被包装
pytorch_lightning.core.optimizer.LightningOptimizer
。 它允许lightning
处理 AMP、TPU、accumulated_gradients 等。.. warning:: 目前已弃用,并将在 v1.3 中删除
附上本人使用代码:
checkpoint_callback = pl.callbacks.ModelCheckpoint(
save_top_k=1,
verbose=True,
monitor="val/the_metric",
mode="max",
save_last=True,
)
logger = pl.loggers.TensorBoardLogger(
_config["log_dir"],
name=f'{exp_name}_seed{_config["seed"]}_from_{_config["load_path"].split("/")[-1][:-5]}_{current_time}',
version=f"perno_{per_no}",
)
lr_callback = pl.callbacks.LearningRateMonitor(logging_interval="step")
callbacks = [checkpoint_callback, lr_callback]
num_gpus = (
_config["num_gpus"]
if isinstance(_config["num_gpus"], int)
else len(_config["num_gpus"])
)
# 意思就是每次算per_gpu_batchsize个数的梯度,然后累积到batch_size数目,然后再更新参数,没有内存开销,以时间换空间
grad_steps = _config["batch_size"] // (
_config["per_gpu_batchsize"] * num_gpus * _config["num_nodes"]
)
print(
_config["batch_size"],
_config["per_gpu_batchsize"],
num_gpus,
_config["num_nodes"],
grad_steps
)
max_steps = _config["max_steps"]
trainer = pl.Trainer(
gpus=num_gpus,
num_nodes=_config["num_nodes"],
precision=_config["precision"],
benchmark=True,
deterministic=True,
max_epochs=_config["max_epoch"] if max_steps is None else 1000, # 到最大epochs时停止训练
max_steps=max_steps, # 到最大epochs时停止训练
callbacks=callbacks,
logger=logger,
replace_sampler_ddp=False,
accumulate_grad_batches=grad_steps,
log_every_n_steps=10,
resume_from_checkpoint=_config["resume_from"],
weights_summary="top",
fast_dev_run=_config["fast_dev_run"],
val_check_interval=_config["val_check_interval"],
num_sanity_val_steps=2, # 开始训练前的验证次数进行健全性检查
)
print(trainer)
try:
trainer.fit(model, datamodule=dm)
except:
traceback.print_exc()
config.py(没附全,具体细节请看文末本项目所参考的源项目的GitHub仓库):
from sacred import Experiment # 辅助实验框架
ex = Experiment("ViLT")
def _loss_names(d):
ret = {
"itm": 0,
"mlm": 0,
"mpp": 0,
"mppd": 0,
"vqa": 0,
"nlvr2": 0,
"irtr": 0,
"mmimdb": 0,
"hatememes": 0,
"food101": 0,
}
ret.update(d)
return ret
@ex.config # 被sacred收集可在任意函数使用的变量
def config():
exp_name = "vilt"
batch_size = 4096 # this is a desired batch size; pl trainer will accumulate gradients when per step batch is smaller.
max_epoch = 100
max_steps = 25000
# PL Trainer Setting
resume_from = None
fast_dev_run = False
val_check_interval = 1.0
test_only = False
finetune_first = False
# below params varies with the environment
data_root = ""
log_dir = "result"
per_gpu_batchsize = 0 # you should define this manually with per_gpu_batch_size=#
num_gpus = 1
num_nodes = 1
load_path = ""
num_workers = 8
precision = 16
@ex.named_config
def task_finetune_food101():
exp_name = "finetune_food101"
datasets = ["Food101"]
loss_names = _loss_names({"food101": 1})
batch_size = 256
max_epoch = 20
max_steps = None
warmup_steps = 0.1
draw_false_image = 0
learning_rate = 1e-2
val_check_interval = 0.2
weight_decay = 2e-2
# optim_type = "adam"
max_text_len = 512
附参考的Github项目地址:
https://github.com/dandelin/ViLT
https://github.com/YiLunLee/missing_aware_prompts