Pytorch-Lighting中Trainer参数的解读

写在前面

题主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:要使用的混合精度后端(nativeapex
  • amp_level:要使用的优化级别(O1、O2 等)。
  • auto_lr_find:如果设置为 True,将使trainer.tune()运行学习率查找器,尝试优化初始学习以实现更快的收敛。 trainer.tune() 方法将在 LightningModule 的 self.lrself.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/pathhdfs://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:Nonemin_maxall。 可能会降低性能
  • 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/pathhdfs://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

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值