# 迁移文档 我们在 MMPretrain 1.x 版本中引入了一些修改,可能会产生兼容性问题。请按照本教程从 MMClassification 0.x 或是 MMSelfSup 0.x 迁移您的项目。 ## 新的依赖 ```{warning} MMPretrain 1.x 版本依赖于一些新的代码包,您应该根据 [安装教程](./get_started.md) 来创建新的环境,尽管你可能已经拥有了一个可以正常运行 MMClassification 0.x 或 MMSelfSup 0.x 的环境。请参考[安装文档](./get_started.md) 对依赖库进行对应的安装。 ``` 1. [MMEngine](https://github.com/open-mmlab/mmengine):MMEngine 是 OpenMMLab 2.0 架构的核心库,我们将许多与计算机视觉无关的组件从 MMCV 拆分到了 MMEngine。 2. [MMCV](https://github.com/open-mmlab/mmcv):OpenMMLab 计算机视觉基础库,这不是一个新的依赖,但你需要将其升级到 `2.0.0rc1` 版本以上。 3. [rich](https://github.com/Textualize/rich):一个命令行美化库,用以在命令行中呈现更美观的输出。 # 配置文件的通用改变 在这个部分,我们将介绍一些旧版本 (**MMClassification 0.x** 或 **MMSelfSup 0.x**) 和 **MMPretrain 1.x** 之间通用的变化规范。 ## 训练策略设置 | MMCls or MMSelfSup 0.x | MMPretrain 1.x | 备注 | | ---------------------- | --------------- | -------------------------------------------------------------------------------------------------------- | | optimizer_config | / | `optimizer_config` 已经被**移除**。 | | / | optim_wrapper | `optim_wrapper` 提供了参数更新的相关字段。 | | lr_config | param_scheduler | `param_scheduler` 是一个列表设置学习率或者是其它参数,这将比之前更加灵活。 | | runner | train_cfg | `train_cfg` 中的循环设置(如 `EpochBasedTrainLoop`,`IterBasedTrainLoop`)将控制模型训练过程中的工作流。 | **`optimizer`** 和 **`optimizer_config`** 字段的变化: - 现在我们使用 `optim_wrapper` 字段指定与优化过程有关的所有配置。而 `optimizer` 字段是 `optim_wrapper` 的一个 子字段。 - `paramwise_cfg` 字段不再是 `optimizer` 的子字段,而是 `optim_wrapper` 的子字段。 - `optimizer_config` 字段被移除,其配置项被移入 `optim_wrapper` 字段。 - `grad_clip` 被重命名为 `clip_grad`
原配置 | ```python optimizer = dict( type='AdamW', lr=0.0015, weight_decay=0.3, paramwise_cfg = dict( norm_decay_mult=0.0, bias_decay_mult=0.0, )) optimizer_config = dict(grad_clip=dict(max_norm=1.0)) ``` |
新配置 | ```python optim_wrapper = dict( optimizer=dict(type='AdamW', lr=0.0015, weight_decay=0.3), paramwise_cfg = dict( norm_decay_mult=0.0, bias_decay_mult=0.0, ), clip_grad=dict(max_norm=1.0), ) ``` |
原配置 | ```python lr_config = dict( policy='CosineAnnealing', min_lr=0, warmup='linear', warmup_iters=5, warmup_ratio=0.01, warmup_by_epoch=True) ``` |
新配置 | ```python param_scheduler = [ # 学习率预热 dict( type='LinearLR', start_factor=0.01, by_epoch=True, end=5, # 每轮迭代都更新学习率,而不是每个 epoch convert_to_iter_based=True), # 主学习率规划器 dict(type='CosineAnnealingLR', by_epoch=True, begin=5), ] ``` |
原配置 | ```python runner = dict(type='EpochBasedRunner', max_epochs=100) ``` |
新配置 | ```python # `val_interval` 字段来自原配置中 `evaluation.interval` 字段 train_cfg = dict(by_epoch=True, max_epochs=100, val_interval=1) val_cfg = dict() # 空字典表示使用默认验证配置 test_cfg = dict() # 空字典表示使用默认测试配置 ``` |
原配置 | ```python log_config = dict( interval=100, hooks=[ dict(type='TextLoggerHook'), dict(type='TensorboardLoggerHook'), ]) ``` |
新配置 | ```python default_hooks = dict( ... logger=dict(type='LoggerHook', interval=100), ) visualizer = dict( type='UniversalVisualizer', vis_backends=[dict(type='LocalVisBackend'), dict(type='TensorboardVisBackend')], ) ``` |
原配置 | ```python model = dict( ... train_cfg=dict(augments=[ dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) ] ) ``` |
新配置 | ```python model = dict( ... train_cfg=dict(augments=[ dict(type='Mixup', alpha=0.8), dict(type='CutMix', alpha=1.0), ] ) ``` |
原配置 | ```python data = dict( samples_per_gpu=32, workers_per_gpu=2, train=dict(...), val=dict(...), test=dict(...), ) ``` |
新配置 | ```python train_dataloader = dict( batch_size=32, num_workers=2, dataset=dict(...), sampler=dict(type='DefaultSampler', shuffle=True) # 必要的 ) val_dataloader = dict( batch_size=32, num_workers=2, dataset=dict(...), sampler=dict(type='DefaultSampler', shuffle=False) # 必要的 ) test_dataloader = val_dataloader ``` |
原配置 | ```python img_norm_cfg = dict( mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) train_pipeline = [ dict(type='LoadImageFromFile'), dict(type='RandomResizedCrop', size=224), dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), dict(type='Normalize', **img_norm_cfg), dict(type='ImageToTensor', keys=['img']), dict(type='ToTensor', keys=['gt_label']), dict(type='Collect', keys=['img', 'gt_label']) ] ``` |
新配置 | ```python data_preprocessor = dict( mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) train_pipeline = [ dict(type='LoadImageFromFile'), dict(type='RandomResizedCrop', scale=224), dict(type='RandomFlip', prob=0.5, direction='horizontal'), dict(type='PackInputs'), ] ``` |
原配置 | ```python evaluation = dict( interval=1, metric='accuracy', metric_options=dict(topk=(1, 5)) ) ``` |
新配置 | ```python val_evaluator = dict(type='Accuracy', topk=(1, 5)) test_evaluator = val_evaluator ``` |
原配置 | ```python evaluation = dict( interval=1, metric=['mAP', 'CP', 'OP', 'CR', 'OR', 'CF1', 'OF1'], metric_options=dict(thr=0.5), ) ``` |
新配置 | ```python val_evaluator = [ dict(type='AveragePrecision'), dict(type='MultiLabelMetric', items=['precision', 'recall', 'f1-score'], average='both', thr=0.5), ] test_evaluator = val_evaluator ``` |
旧版本 | ```python data = dict( samples_per_gpu=32, # total 32*8(gpu)=256 workers_per_gpu=4, train=dict( type=dataset_type, data_source=dict( type=data_source, data_prefix='data/imagenet/train', ann_file='data/imagenet/meta/train.txt', ), num_views=[1, 1], pipelines=[train_pipeline1, train_pipeline2], prefetch=prefetch, ), val=...) ``` |
新版本 | ```python train_dataloader = dict( batch_size=32, num_workers=4, persistent_workers=True, sampler=dict(type='DefaultSampler', shuffle=True), collate_fn=dict(type='default_collate'), dataset=dict( type=dataset_type, data_root=data_root, ann_file='meta/train.txt', data_prefix=dict(img_path='train/'), pipeline=train_pipeline)) val_dataloader = ... ``` |