迁移文档¶
我们在 MMPretrain 1.x 版本中引入了一些修改,可能会产生兼容性问题。请按照本教程从 MMClassification 0.x 或是 MMSelfSup 0.x 迁移您的项目。
新的依赖¶
配置文件的通用改变¶
在这个部分,我们将介绍一些旧版本 (MMClassification 0.x 或 MMSelfSup 0.x) 和 MMPretrain 1.x 之间通用的变化规范。
训练策略设置¶
MMCls or MMSelfSup 0.x |
MMPretrain 1.x |
备注 |
|---|---|---|
optimizer_config |
/ |
|
/ |
optim_wrapper |
|
lr_config |
param_scheduler |
|
runner |
train_cfg |
|
optimizer 和 optimizer_config 字段的变化:
现在我们使用
optim_wrapper字段指定与优化过程有关的所有配置。而optimizer字段是optim_wrapper的一个 子字段。paramwise_cfg字段不再是optimizer的子字段,而是optim_wrapper的子字段。optimizer_config字段被移除,其配置项被移入optim_wrapper字段。grad_clip被重命名为clip_grad
| 原配置 |
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))
|
| 新配置 |
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),
)
|
lr_config 字段的变化:
lr_config字段被移除,我们使用新的param_scheduler配置取代。warmup相关的字段都被移除,因为学习率预热可以通过多个学习率规划器的组合来实现,因此不再单独实现。
新的优化器参数规划器组合机制非常灵活,你可以使用它来设计多种学习率、动量曲线,详见MMEngine 中的教程。
| 原配置 |
lr_config = dict(
policy='CosineAnnealing',
min_lr=0,
warmup='linear',
warmup_iters=5,
warmup_ratio=0.01,
warmup_by_epoch=True)
|
| 新配置 |
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),
]
|
runner 字段的变化:
原 runner 字段被拆分为 train_cfg,val_cfg 和 test_cfg 三个字段,分别配置训练、验证和测试循环。
| 原配置 |
runner = dict(type='EpochBasedRunner', max_epochs=100)
|
| 新配置 |
# `val_interval` 字段来自原配置中 `evaluation.interval` 字段
train_cfg = dict(by_epoch=True, max_epochs=100, val_interval=1)
val_cfg = dict() # 空字典表示使用默认验证配置
test_cfg = dict() # 空字典表示使用默认测试配置
|
在 OpenMMLab 2.0 中,我们引入了“循环控制器”来控制训练、验证和测试行为,而原先 Runner 功能也相应地发生了变化。详细介绍参见 MMEngine 中的执行器教程。
运行设置¶
checkpoint_config 和 log_config 字段的变化:
checkpoint_config 被移动至 default_hooks.checkpoint,log_config 被移动至 default_hooks.logger。同时,
我们将很多原先在训练脚本中隐式定义的钩子移动到了 default_hooks 字段。
default_hooks = dict(
# 记录每轮迭代的耗时
timer=dict(type='IterTimerHook'),
# 每 100 轮迭代打印一次日志
logger=dict(type='LoggerHook', interval=100),
# 启用优化器参数规划器
param_scheduler=dict(type='ParamSchedulerHook'),
# 每个 epoch 保存一次模型权重文件,并且自动保存最优权重文件
checkpoint=dict(type='CheckpointHook', interval=1, save_best='auto'),
# 在分布式环境中设置采样器种子
sampler_seed=dict(type='DistSamplerSeedHook'),
# 可视化验证结果,将 `enable` 设为 True 来启用这一功能。
visualization=dict(type='VisualizationHook', enable=False),
)
此外,我们将原来的日志功能拆分为日志记录和可视化器。日志记录负责按照指定间隔保存日志数据,以及进行数据平滑等处理,可视化器用于在不同的后端记录日志,如终端、TensorBoard 和 WandB。
| 原配置 |
log_config = dict(
interval=100,
hooks=[
dict(type='TextLoggerHook'),
dict(type='TensorboardLoggerHook'),
])
|
| 新配置 |
default_hooks = dict(
...
logger=dict(type='LoggerHook', interval=100),
)
visualizer = dict(
type='UniversalVisualizer',
vis_backends=[dict(type='LocalVisBackend'), dict(type='TensorboardVisBackend')],
)
|
load_from 和 resume_from 字段的变动:
resume_from字段被移除。我们现在使用resume和load_from字段实现以下功能:如
resume=True且load_from不为 None,从load_from指定的权重文件恢复训练。如
resume=True且load_from为 None,尝试从工作目录中最新的权重文件恢复训练。如
resume=False且load_from不为 None,仅加载指定的权重文件,不恢复训练。如
resume=False且load_from为 None,不进行任何操作。
dist_params 字段的变动:dist_params 字段被移动为 env_cfg 字段的一个子字段。以下为 env_cfg 字段的所
有配置项:
env_cfg = dict(
# 是否启用 cudnn benchmark
cudnn_benchmark=False,
# 设置多进程相关参数
mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0),
# 设置分布式相关参数
dist_cfg=dict(backend='nccl'),
)
workflow 字段的变动:workflow 相关的功能现已被移除。
新字段 visualizer:可视化器是 OpenMMLab 2.0 架构中的新设计,我们使用可视化器进行日志、结果的可视化与多后
端的存储。详见 MMEngine 中的可视化教程。
visualizer = dict(
type='UniversalVisualizer',
vis_backends=[
dict(type='LocalVisBackend'),
# 将下行取消注释,即可将日志和可视化结果保存至 TesnorBoard
# dict(type='TensorboardVisBackend')
]
)
新字段 default_scope:指定所有注册器进行模块搜索默认的起点。MMPretrain 中的 default_scope 字段为 mmpretrain,大部分情况下不需要修改。详见 MMengine 中的注册器教程。
其他变动¶
我们将所有注册器的定义从各个包移动到了 mmpretrain.registry。
从 MMClassification 0.x 迁移¶
配置文件¶
在 MMPretrain 1.x 中,我们重构了配置文件的结构,绝大部分原来的配置文件无法直接使用。
在本节中,我们将介绍配置文件的所有变化。我们假设您已经对配置文件有所了解。
模型设置¶
model.backbone、model.neck 和 model.head 字段没有变化。
model.train_cfg 字段的变化:
BatchMixup被重命名为MixupBatchCutMix被重命名为CutMixBatchResizeMix被重命名为ResizeMix以上增强中的
prob参数均被移除,现在在train_cfg中使用一个统一的probs字段指定每个增强的概率。如果没 有指定probs字段,现在将均匀地随机选择一种增强。
| 原配置 |
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)
]
)
|
| 新配置 |
model = dict(
...
train_cfg=dict(augments=[
dict(type='Mixup', alpha=0.8),
dict(type='CutMix', alpha=1.0),
]
)
|
数据设置¶
data 字段的变化:
原先的
data字段被拆分为train_dataloader,val_dataloader和test_dataloader字段。这允许我们进行更 加细粒度的配置。比如在训练和测试中指定不同的采样器、批次大小等。samples_per_gpu字段被重命名为batch_sizeworkers_per_gpu字段被重命名为num_workers
| 原配置 |
data = dict(
samples_per_gpu=32,
workers_per_gpu=2,
train=dict(...),
val=dict(...),
test=dict(...),
)
|
| 新配置 |
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
|
pipeline 字段的变化:
原先的
ToTensor、ImageToTensor和Collect被合并为PackInputs我们建议去除数据集流水线中的
Normalize变换,转而使用data_preprocessor字段进行归一化预处理。RandomFlip中的flip_prob参数被重命名为probRandomCrop中的size参数被重命名为crop_sizeRandomResizedCrop中的size参数被重命名为scaleResize中的size参数被重命名为scale。并且不再支持形如(256, -1)的尺寸,请使用ResizeEdgeAutoAugment和RandAugment中的policies参数现在支持使用字符串来指定某些预设的策略集,AutoAugment支持 “imagenet”,RandAugment支持 “timm_increasing”RandomResizedCrop和CenterCrop不再支持efficientnet_style参数,请使用EfficientNetRandomCrop和EfficientNetCenterCrop
备注
我们将一些数据变换工作移至数据预处理器进行,如归一化,请参阅文档了解更多详细信息。
| 原配置 |
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'])
]
|
| 新配置 |
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'),
]
|
evaluation 字段的变化:
原先的
evaluation字段被拆分为val_evaluator和test_evaluator,并且不再支持interval和save_best参数。interval参数被移动至train_cfg.val_interval字段,详见训练策略配置。而save_best参数被移动至default_hooks.checkpoint.save_best字段,详见 运行设置。‘accuracy’ 指标被重命名为
Accuracy‘precision’,’recall’,’f1-score’ 和 ‘support’ 指标被组合为
SingleLabelMetric,并使用items参数指定具体计算哪些指标。‘mAP’ 指标被重命名为
AveragePrecision‘CP’,’CR’,’CF1’,’OP’,’OR’ 和 ‘OF1’ 指标被组合为
MultiLabelMetric,并使用items和average参数指定具体计算哪些指标。
| 原配置 |
evaluation = dict(
interval=1,
metric='accuracy',
metric_options=dict(topk=(1, 5))
)
|
| 新配置 |
val_evaluator = dict(type='Accuracy', topk=(1, 5))
test_evaluator = val_evaluator
|
| 原配置 |
evaluation = dict(
interval=1,
metric=['mAP', 'CP', 'OP', 'CR', 'OR', 'CF1', 'OF1'],
metric_options=dict(thr=0.5),
)
|
| 新配置 |
val_evaluator = [
dict(type='AveragePrecision'),
dict(type='MultiLabelMetric',
items=['precision', 'recall', 'f1-score'],
average='both',
thr=0.5),
]
test_evaluator = val_evaluator
|
模块变动¶
mmpretrain.apis¶
详见包文档
函数 |
变动 |
|---|---|
|
无变动 |
|
无变动,但我们推荐使用功能更强的 |
|
移除,直接使用 |
|
移除,直接使用 |
|
移除,直接使用 |
|
移除,使用 |
|
移除,使用 |
|
移除,使用 |
mmpretrain.core¶
mmpretrain.core 包被重命名为 mmpretrain.engine
子包 |
变动 |
|---|---|
|
移除,使用 |
|
|
|
|
|
移除,分布式环境相关的函数统一至 |
|
移除,其中可视化相关的功能被移动至 |
hooks 包中的 MMClsWandbHook 尚未实现。
hooks 包中的 CosineAnnealingCooldownLrUpdaterHook 被移除。我们现在支持使用学习率规划器的组合实现该功能。详见自定义训练优化策略。
mmpretrain.datasets¶
详见包文档
数据集类 |
变动 |
|---|---|
增加了 |
|
与 |
|
与 |
|
|
|
|
|
现在需要指定 |
|
现在需要指定 |
mmpretrain.datasets.pipelines 包被重命名为 mmpretrain.datasets.transforms
数据变换类 |
变动 |
|---|---|
|
|
|
移除,使用 |
|
|
|
|
|
移除,使用 |
|
移除,使用 |
|
|
|
移除,使用 |
mmpretrain.models¶
详见包文档,backbones、necks 和 losses 的结构没有变动。
ImageClassifier 的变动:
分类器的方法 |
变动 |
|---|---|
|
无变动 |
|
现在需要三个输入: |
|
变更为 |
|
变更为 |
|
|
|
原先的 |
|
新方法,与 |
heads 中的变动:
分类头的方法 |
变动 |
|---|---|
|
无变动 |
|
变更为 |
|
变更为 |
|
现在接受 |
|
新方法,它将返回分类头的输出,不会进行任何后处理(包括 softmax 或 sigmoid)。 |
mmpretrain.utils¶
详见包文档
函数 |
变动 |
|---|---|
|
无变动 |
|
|
|
输出格式发生变化。 |
|
|
|
移除,现在 runner 会自动包装模型。 |
|
移除,现在 runner 会自动包装模型。 |
|
移除,现在 runner 会自动选择设备。 |
从 MMSelfSup 0.x 迁移¶
配置文件¶
本章节将介绍 _base_ 文件夹中的配置文件的变化,主要包含以下三个部分:
数据集:
configs/_base_/datasets模型:
configs/_base_/models优化器及调度:
configs/_base_/schedules
数据集¶
在 MMSelfSup 0.x 中,我们使用字段 data 来整合数据相关信息, 例如 samples_per_gpu,train,val 等。
在 MMPretrain 1.x 中,我们分别使用字段 train_dataloader, val_dataloader 整理训练和验证的数据相关信息,并且 data 字段已经被 移除。
| 旧版本 |
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=...)
|
| 新版本 |
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 = ...
|
另外,我们 移除 了字段 data_source,以此来保证我们项目和其它 OpenMMLab 项目数据流的一致性。请查阅 Config 获取更详细的信息。
pipeline 中的变化:
以 MAE 的 pipeline 作为例子,新的写法如下:
train_pipeline = [
dict(type='LoadImageFromFile'),
dict(
type='RandomResizedCrop',
size=224,
scale=(0.2, 1.0),
backend='pillow',
interpolation='bicubic'),
dict(type='RandomFlip', prob=0.5),
dict(type='PackSelfSupInputs', meta_keys=['img_path'])
]
模型¶
在模型的配置文件中,和 MMSeflSup 0.x 版本相比,主要有两点不同。
有一个新的字段
data_preprocessor,主要负责对数据进行预处理,例如归一化,通道转换等。例子如下:
data_preprocessor=dict(
mean=[123.675, 116.28, 103.53],
std=[58.395, 57.12, 57.375],
bgr_to_rgb=True)
model = dict(
type='MAE',
data_preprocessor=dict(
mean=[127.5, 127.5, 127.5],
std=[127.5, 127.5, 127.5],
bgr_to_rgb=True),
backbone=...,
neck=...,
head=...,
init_cfg=...)
在新版本的
head字段中,我们新增加了loss,主要负责损失函数的构建。例子如下:
model = dict(
type='MAE',
backbone=...,
neck=...,
head=dict(
type='MAEPretrainHead',
norm_pix=True,
patch_size=16,
loss=dict(type='MAEReconstructionLoss')),
init_cfg=...)
模块变动¶
下列表格记录了代码模块、文件夹的主要改变。
MMSelfSup 0.x |
MMPretrain 1.x |
Remark |
|---|---|---|
apis |
/ |
目前 |
core |
engine |
|
datasets |
datasets |
数据集相关类主要基于不同的数据集实现,例如 ImageNet,Places205。(API link) |
datasets/data_sources |
/ |
|
datasets/pipelines |
datasets/transforms |
|
/ |
evaluation |
|
models/algorithms |
selfsup |
算法文件移动至 |
models/backbones |
selfsup |
自监督学习算法对应的,重新实现的主干网络移动到算法的 |
models/target_generators |
selfsup |
目标生成器的实现移动到算法的 |
/ |
models/losses |
|
/ |
structures |
|
/ |
visualization |
|