- 媒体生成
- 计算机视觉
- 深度学习
- 人工智能
- 大模型
【免费下载链接】mmagic
OpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox. Unlock the magic 🪄: Generative-AI (AIGC), easy-to-use APIs, awsome model zoo, diffusion models, for text-to-image generation, image/video restoration/enhancement, etc.
本文是 MMagic 从 0.x 迁移到 1.x 时关于训练调度(Schedule)配置的完整实战指南。MMagic 1.x 全面重构了优化器、学习率策略与训练循环的配置方式:optimizers升级为optim_wrapper、lr_config被param_scheduler取代、total_iters移入train_cfg并新增val_cfg/test_cfg。读完本文,你将掌握 1.x 下这三种配置的完整写法、各字段含义,以及如何把旧版配置逐行改写成新版,并直接套用到仓库内真实模型的训练配置中。
一、为什么需要迁移:1.x 调度配置的三大变更
MMagic 1.x 基于 MMEngine 重构了底层运行时,训练调度配置也随之统一收敛。核心变更可以概括为以下三点:
optim_wrapper取代optimizers:所有与优化过程相关的配置统一放进optim_wrapper字段,原optimizer现在只是optim_wrapper的一个子字段。param_scheduler取代lr_config:学习率调度不再通过注册LrUpdater hook实现,而是由 MMEngine 的param_scheduler(参数调度器)声明式配置,可灵活组合MultiStepLR、CosineRestartLR、ReduceLR等多种策略。total_iters移入train_cfg:训练总轮数改由train_cfg中的max_iters(或max_epochs)指定,并配套新增val_cfg与test_cfg分别声明验证、测试阶段的循环类型。
这三项改动共同把"优化器、调度器、循环控制"三件事彻底解耦,每个字段职责单一,便于在 configs 目录下以_base_继承机制复用。
二、旧版与新版配置逐行对照
原文档给出的对照表是理解这次迁移的最佳入口,下面完整保留并补充逐行注释:
| 0.x 旧版写法 | 1.x 新版写法 |
|---|---|
optimizers = dict(...)顶层字段 | optim_wrapper = dict(...),optimizer成为其子字段 |
total_iters = 300000顶层变量 | train_cfg = dict(type='IterBasedTrainLoop', max_iters=300000, ...) |
lr_config = dict(policy='Step', by_epoch=False, step=[200000], gamma=0.5) | param_scheduler = dict(type='MultiStepLR', by_epoch=False, milestones=[200000], gamma=0.5) |
| 无对应字段(验证/测试循环隐式处理) | val_cfg = dict(type='ValLoop')、test_cfg = dict(type='TestLoop') |
旧版写法:
# 0.x:optimizer 是顶层字段,直接构建 PyTorch 优化器 optimizers = dict(generator=dict(type='Adam', lr=1e-4, betas=(0.9, 0.999))) # 0.x:总迭代次数是顶层变量 total_iters = 300000 # 0.x:通过 lr_config 注册 LrUpdater hook 实现学习率调度 lr_config = dict( policy='Step', by_epoch=False, step=[200000], gamma=0.5)新版写法:
# 1.x:所有优化配置收敛到 optim_wrapper,optimizer 是其子字段 optim_wrapper = dict( type='OptimWrapper', optimizer=dict(type='Adam', lr=1e-4), ) # 1.x:参数调度器由 param_scheduler 声明,策略名与 PyTorch 调度器对齐 param_scheduler = dict( type='MultiStepLR', by_epoch=False, milestones=[200000], gamma=0.5) # 1.x:训练、验证、测试循环分别配置 train_cfg = dict( type='IterBasedTrainLoop', max_iters=300000, val_interval=5000) val_cfg = dict(type='ValLoop') test_cfg = dict(type='TestLoop')要点解读:
- 旧版
policy='Step'对应新版type='MultiStepLR',step=[200000]对应milestones=[200000],其余语义完全一致——这是迁移时最容易直接照搬的映射。 - 新版
by_epoch=False语义不变:False表示按迭代(iter)计数,调度器配合IterBasedTrainLoop使用;True表示按 epoch 计数,配合EpochBasedTrainLoop使用。 val_interval从旧版散落在别处改为在train_cfg内显式声明,用于控制每隔多少迭代/epoch 执行一次验证。
三、optim_wrapper:优化过程配置的统一入口
3.1 单优化器场景(复原/增强类模型)
以 basicvsr_2xb4_reds4.py 为例,视频超分模型只有一个优化器,写法最直观:
optim_wrapper = dict( constructor='DefaultOptimWrapperConstructor', type='OptimWrapper', optimizer=dict(type='Adam', lr=2e-4, betas=(0.9, 0.99)), paramwise_cfg=dict(custom_keys={'spynet': dict(lr_mult=0.125)}))这里出现了两个新概念,是旧版没有的:
constructor:指定优化器包装器的构造器。单优化器场景用DefaultOptimWrapperConstructor;训练 GAN 等多优化器模型时必须换成MultiOptimWrapperConstructor(见下节)。paramwise_cfg:按参数名做差异化配置。上例中光流子网络spynet的学习率乘 0.125(即实际学习率为2e-4 * 0.125),这是超分训练中"光流模块慢速更新"的常见技巧;basicvsr-pp_c64n7_8xb1-600k_reds4.py 中该值取0.25,可对照体会。
3.2 多优化器场景(GAN 类模型)
GAN 的生成器与判别器使用不同优化器和训练节奏。MMagic 通过OptimWrapperDict包装二者,保证train_step的函数签名与其他模型一致,并由MultiOptimWrapperConstructor自动完成这一装配过程。仓库默认运行时 gen_default_runtime.py 中就写有:
optim_wrapper = dict(constructor='MultiOptimWrapperConstructor')具体到模型配置,以 stylegan2_c2_8xb4-800kiters_ffhq-256x256.py 为例:
optim_wrapper = dict( generator=dict( optimizer=dict(type='Adam', lr=0.002 * g_reg_ratio, betas=(0, 0.99**g_reg_ratio))), discriminator=dict( optimizer=dict(type='Adam', lr=0.002 * d_reg_ratio, betas=(0, 0.99**d_reg_ratio))))generator/discriminator两个子 dict 各带一个optimizer,分别配置生成器与判别器的优化参数。进一步地,每个子 dict 还可以声明accumulative_counts实现梯度累积(等效于旧版的batch_accumulation_steps),其与旧版disc_steps/gen_steps的换算关系详见 optimizers.md:
- 0.x 中
disc_steps // batch_accumulation_steps才是判别器连续更新的次数; - 1.x 中直接由
discriminator_steps/generator_steps声明连续更新次数,梯度累积次数由各优化器子 dict 的accumulative_counts控制,语义更清晰。
四、param_scheduler:声明式学习率调度
旧版lr_config依赖隐式的LrUpdater hook注册,新版改为纯声明式param_scheduler,策略名称与 PyTorch 调度器对齐,且支持列表形式组合多个调度器。仓库内可见三种典型用法:
1. 分段阶梯下降(MultiStepLR)——base_tof.py:
param_scheduler = dict( type='MultiStepLR', by_epoch=False, gamma=0.5, milestones=[200000, 400000, 600000, 800000])在 20 万、40 万、60 万、80 万迭代处各将学习率乘以gamma=0.5,与旧版policy='Step'完全等价。
2. 余弦重启(CosineRestartLR)——basicvsr_2xb4_reds4.py:
param_scheduler = dict( type='CosineRestartLR', by_epoch=False, periods=[300000], restart_weights=[1], eta_min=1e-7)periods声明每个周期的长度,restart_weights声明每个周期重启时的初始学习率权重,eta_min是衰减下限。这里periods=[300000]与train_cfg.max_iters=300_000对齐,训练全程学习率从初始值余弦衰减到1e-7。
3. 基于验证指标的自动衰减(ReduceLR)——cain_g1b32_1xb5_vimeo90k-triplet.py:
param_scheduler = dict( type='ReduceLR', by_epoch=True, mode='min', factor=0.5, patience=5, cooldown=0)ReduceLR在验证指标连续patience个 epoch 不再改善时把学习率乘以factor。注意它依赖验证环节,需要配套在 default_hooks 中注册ReduceLRSchedulerHook(并指定val_metric='MAE')。由此也可见:param_scheduler声明的是"调度策略",而真正驱动调度器执行的 hook 是ParamSchedulerHook,它已经内置在 default_runtime.py 等基础运行时中:
default_hooks = dict( ... param_scheduler=dict(type='ParamSchedulerHook'), ...)五、train_cfg/val_cfg/test_cfg:循环控制三件套
新版把训练过程拆成三个循环配置,全部基于 MMEngine 的 Loop 组件:
train_cfg:训练循环。IterBasedTrainLoop对应按迭代训练(声明max_iters),EpochBasedTrainLoop对应按 epoch 训练(声明max_epochs),并可携带val_interval控制验证频率。val_cfg:验证循环类型。生成类任务通常用MultiValLoop,允许一次运行多个验证指标(如 FID、IS 同时评估),见 gen_default_runtime.py。test_cfg:测试循环类型,用法与val_cfg对称。
5.1 按迭代训练:IterBasedTrainLoop
base_tof.py 展示了标准写法:
train_cfg = dict( type='IterBasedTrainLoop', max_iters=1_000_000, val_interval=5000) val_cfg = dict(type='MultiValLoop') test_cfg = dict(type='MultiTestLoop')注释里还给出了换算技巧:# 5000 iters == 1 epoch,即epoch_length = 5000,方便把按 epoch 的旧习惯折算成迭代数。GAN 模型同样按迭代训练,如 stylegan2_c2_8xb4-800kiters_ffhq-256x256.py 的train_cfg = dict(max_iters=800002)。
5.2 按 epoch 训练:EpochBasedTrainLoop
CAIN 视频插帧配置 是典型例子:
train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=500) val_cfg = dict(type='MultiValLoop') test_cfg = dict(type='MultiTestLoop')此时param_scheduler应同步设置by_epoch=True(上节 CAIN 的ReduceLR即如此),且日志处理器也要切换为按 epoch 记录:log_processor = dict(type='LogProcessor', by_epoch=True)(见 cain 配置)。反之,按迭代训练时 default_runtime.py 中的log_processor保持by_epoch=False。by_epoch三处一致(循环、调度器、日志)是配置自洽的关键。
六、迁移速查表与自检清单
把新旧字段映射整理成速查表,方便迁移时逐项对照:
| 旧版 0.x | 新版 1.x | 备注 |
|---|---|---|
optimizers = dict(...) | optim_wrapper = dict(type='OptimWrapper', optimizer=dict(...)) | 单优化器场景 |
optimizers = dict(generator=..., discriminator=...) | optim_wrapper = dict(constructor='MultiOptimWrapperConstructor', generator=..., discriminator=...) | GAN 场景,见 optimizers.md |
total_iters = N | train_cfg = dict(type='IterBasedTrainLoop', max_iters=N) | 按迭代训练 |
workflow = [('train', N)]等 | train_cfg+val_cfg+test_cfg三循环分置 | 循环控制独立成段 |
lr_config = dict(policy='Step', step=[...], gamma=...) | param_scheduler = dict(type='MultiStepLR', milestones=[...], gamma=...) | 阶梯衰减直译 |
lr_config = dict(policy='CosineAnnealing', ...) | param_scheduler = dict(type='CosineRestartLR' / 'CosineAnnealingLR', ...) | 按需选择余弦变体 |
lr_config = dict(policy='ReduceLROnPlateau', ...) | param_scheduler = dict(type='ReduceLR', ...)+ReduceLRSchedulerHook | 需要验证指标驱动 |
迁移完成后建议按以下清单自检:
optim_wrapper是否包含正确的constructor(单优化器用DefaultOptimWrapperConstructor,GAN 用MultiOptimWrapperConstructor);param_scheduler的by_epoch是否与train_cfg的循环类型(IterBasedTrainLoop/EpochBasedTrainLoop)一致;train_cfg.max_iters/max_epochs是否已取代全部旧版total_iters/total_epochs;- 若使用
ReduceLR等依赖验证的调度器,是否已在default_hooks中注册ReduceLRSchedulerHook并指定val_metric; val_cfg/test_cfg是否已显式声明(生成类任务使用MultiValLoop/MultiTestLoop)。
七、进一步阅读
- 优化器迁移的完整说明(含梯度累积、GAN 双优化器):optimizers.md
- 运行时配置迁移(hooks、日志、随机种子等):runtime.md
- 配置系统整体说明(命名规范与
_base_继承):overview.md 与 config 用户指南 - 实际配置范例:default_runtime.py、gen_default_runtime.py、basicvsr_2xb4_reds4.py、stylegan2_c2_8xb4-800kiters_ffhq-256x256.py
- 媒体生成
- 计算机视觉
- 深度学习
- 人工智能
- 大模型
【免费下载链接】mmagic
OpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox. Unlock the magic 🪄: Generative-AI (AIGC), easy-to-use APIs, awsome model zoo, diffusion models, for text-to-image generation, image/video restoration/enhancement, etc.
相关推荐
Bokeh Tooltips 完全指南:为 UI 组件与可视化添加交互提示信息
Bokeh Tooltips 完全指南:为 UI 组件与可视化添加交互提示信息 Bokeh 在广泛的 UI 元素(如绘图、控件)上内置了 Tooltips(提示
媒体生成计算机视觉深度学习人工智能大模型MMSegmentation 0.x 到 1.x 迁移指南:训练接口、配置体系与包结构变更全解析
MMSegmentation 0.x 到 1.x 迁移指南:训练接口、配置体系与包结构变更全解析 导读 本文基于 MMSegmentation 官方迁移文档(
人工智能深度学习计算机视觉MMSegmentation 0.x 迁移至 1.x 指南:接口变更、配置重构与命令迁移全解析
MMSegmentation 0.x 迁移至 1.x 指南:接口变更、配置重构与命令迁移全解析 本文是 MMSegmentation 从 0.x 升级到 1.x
人工智能深度学习计算机视觉
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考