diff --git a/configs/pruning/mmcls/dcff/dcff_compact_resnet_8xb32_in1k.py b/configs/pruning/mmcls/dcff/dcff_compact_resnet_8xb32_in1k.py index 66a2587cd..f90ce65be 100644 --- a/configs/pruning/mmcls/dcff/dcff_compact_resnet_8xb32_in1k.py +++ b/configs/pruning/mmcls/dcff/dcff_compact_resnet_8xb32_in1k.py @@ -1,5 +1,13 @@ _base_ = ['dcff_resnet_8xb32_in1k.py'] # model settings -model = _base_.model -model['is_deployed'] = True +model_cfg = dict( + _scope_='mmrazor', + type='sub_model', + cfg=dict( + cfg_path='mmcls::resnet/resnet50_8xb32_in1k.py', pretrained=False), + fix_subnet='configs/pruning/mmcls/dcff/fix_subnet.json', + mode='mutator', + init_cfg=dict( + type='Pretrained', + checkpoint='configs/pruning/mmcls/dcff/fix_subnet_weight.pth')) diff --git a/configs/pruning/mmcls/dcff/dcff_resnet_8xb32_in1k.py b/configs/pruning/mmcls/dcff/dcff_resnet_8xb32_in1k.py index db3502818..360645a6a 100644 --- a/configs/pruning/mmcls/dcff/dcff_resnet_8xb32_in1k.py +++ b/configs/pruning/mmcls/dcff/dcff_resnet_8xb32_in1k.py @@ -76,7 +76,10 @@ type='ChannelAnalyzer', demo_input=(1, 3, 224, 224), tracer_type='BackwardTracer')), + fix_subnet=None, + data_preprocessor=None, target_pruning_ratio=target_pruning_ratio, step_freq=1, - linear_schedule=False, - is_deployed=False) + linear_schedule=False) + +val_cfg = dict(_delete_=True, type='mmrazor.ItePruneValLoop') diff --git a/configs/pruning/mmcls/dcff/fix_subnet.json b/configs/pruning/mmcls/dcff/fix_subnet.json new file mode 100644 index 000000000..dfdcea758 --- /dev/null +++ b/configs/pruning/mmcls/dcff/fix_subnet.json @@ -0,0 +1,141 @@ +{ + "type":"DCFFChannelMutator", + "channel_unit_cfg":{ + "type":"DCFFChannelUnit", + "default_args":{ + "choice_mode":"ratio" + }, + "units":{ + "backbone.conv1_(0, 64)_64":{ + "init_args":{ + "num_channels":64, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":1.0 + }, + "backbone.layer1.0.conv1_(0, 64)_64":{ + "init_args":{ + "num_channels":64, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.640625 + }, + "backbone.layer1.1.conv1_(0, 64)_64":{ + "init_args":{ + "num_channels":64, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.640625 + }, + "backbone.layer2.0.conv1_(0, 128)_128":{ + "init_args":{ + "num_channels":128, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer2.0.conv2_(0, 128)_128":{ + "init_args":{ + "num_channels":128, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.59375 + }, + "backbone.layer2.1.conv1_(0, 128)_128":{ + "init_args":{ + "num_channels":128, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer3.0.conv1_(0, 256)_256":{ + "init_args":{ + "num_channels":256, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer3.0.conv2_(0, 256)_256":{ + "init_args":{ + "num_channels":256, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.59765625 + }, + "backbone.layer3.1.conv1_(0, 256)_256":{ + "init_args":{ + "num_channels":256, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer4.0.conv1_(0, 512)_512":{ + "init_args":{ + "num_channels":512, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.69921875 + }, + "backbone.layer4.0.conv2_(0, 512)_512":{ + "init_args":{ + "num_channels":512, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.69921875 + }, + "backbone.layer4.1.conv1_(0, 512)_512":{ + "init_args":{ + "num_channels":512, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.69921875 + } + } + }, + "parse_cfg":{ + "type":"ChannelAnalyzer", + "demo_input":[ + 1, + 3, + 224, + 224 + ], + "tracer_type":"BackwardTracer" + } +} diff --git a/configs/pruning/mmcls/dcff/resnet_cls.json b/configs/pruning/mmcls/dcff/resnet_cls.json deleted file mode 100644 index 3fafa125d..000000000 --- a/configs/pruning/mmcls/dcff/resnet_cls.json +++ /dev/null @@ -1,509 +0,0 @@ -{ - "backbone.conv1_(0, 3)_3":{ - "init_args":{ - "num_channels":3, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 3 - ], - "choice_mode":"number" - }, - "choice":3 - }, - "backbone.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 64 - ], - "choice_mode":"number" - }, - "choice":64 - }, - "backbone.layer1.0.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 41 - ], - "choice_mode":"number" - }, - "choice":41 - }, - "backbone.layer1.0.conv2_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 38 - ], - "choice_mode":"number" - }, - "choice":38 - }, - "backbone.layer1.0.conv3_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 230 - ], - "choice_mode":"number" - }, - "choice":230 - }, - "backbone.layer1.1.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 41 - ], - "choice_mode":"number" - }, - "choice":41 - }, - "backbone.layer1.1.conv2_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 38 - ], - "choice_mode":"number" - }, - "choice":38 - }, - "backbone.layer1.2.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 41 - ], - "choice_mode":"number" - }, - "choice":41 - }, - "backbone.layer1.2.conv2_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 38 - ], - "choice_mode":"number" - }, - "choice":38 - }, - "backbone.layer2.0.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 83 - ], - "choice_mode":"number" - }, - "choice":83 - }, - "backbone.layer2.0.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 76 - ], - "choice_mode":"number" - }, - "choice":76 - }, - "backbone.layer2.0.conv3_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 460 - ], - "choice_mode":"number" - }, - "choice":460 - }, - "backbone.layer2.1.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 83 - ], - "choice_mode":"number" - }, - "choice":83 - }, - "backbone.layer2.1.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 76 - ], - "choice_mode":"number" - }, - "choice":76 - }, - "backbone.layer2.2.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 83 - ], - "choice_mode":"number" - }, - "choice":83 - }, - "backbone.layer2.2.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 76 - ], - "choice_mode":"number" - }, - "choice":76 - }, - "backbone.layer2.3.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 83 - ], - "choice_mode":"number" - }, - "choice":83 - }, - "backbone.layer2.3.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 76 - ], - "choice_mode":"number" - }, - "choice":76 - }, - "backbone.layer3.0.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 166 - ], - "choice_mode":"number" - }, - "choice":166 - }, - "backbone.layer3.0.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 153 - ], - "choice_mode":"number" - }, - "choice":153 - }, - "backbone.layer3.0.conv3_(0, 1024)_1024":{ - "init_args":{ - "num_channels":1024, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 921 - ], - "choice_mode":"number" - }, - "choice":921 - }, - "backbone.layer3.1.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 166 - ], - "choice_mode":"number" - }, - "choice":166 - }, - "backbone.layer3.1.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 153 - ], - "choice_mode":"number" - }, - "choice":153 - }, - "backbone.layer3.2.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 166 - ], - "choice_mode":"number" - }, - "choice":166 - }, - "backbone.layer3.2.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 153 - ], - "choice_mode":"number" - }, - "choice":153 - }, - "backbone.layer3.3.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer3.3.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer3.4.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer3.4.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer3.5.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer3.5.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer4.0.conv1_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.0.conv2_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.0.conv3_(0, 2048)_2048":{ - "init_args":{ - "num_channels":2048, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 1843 - ], - "choice_mode":"number" - }, - "choice":1843 - }, - "backbone.layer4.1.conv1_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.1.conv2_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.2.conv1_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.2.conv2_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "head.fc_(0, 1000)_1000":{ - "init_args":{ - "num_channels":1000, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 1000 - ], - "choice_mode":"number" - }, - "choice":1000 - } -} diff --git a/configs/pruning/mmdet/dcff/dcff_compact_faster_rcnn_resnet50_8xb4_coco.py b/configs/pruning/mmdet/dcff/dcff_compact_faster_rcnn_resnet50_8xb4_coco.py index 7efb17b7e..73e64f1aa 100644 --- a/configs/pruning/mmdet/dcff/dcff_compact_faster_rcnn_resnet50_8xb4_coco.py +++ b/configs/pruning/mmdet/dcff/dcff_compact_faster_rcnn_resnet50_8xb4_coco.py @@ -1,5 +1,12 @@ _base_ = ['dcff_faster_rcnn_resnet50_8xb4_coco.py'] # model settings -model = _base_.model -model['is_deployed'] = True +model_cfg = dict( + _scope_='mmrazor', + type='sub_model', + cfg=_base_.architecture, + fix_subnet='configs/pruning/mmdet/dcff/fix_subnet.json', + mode='mutator', + init_cfg=dict( + type='Pretrained', + checkpoint='configs/pruning/mmdet/dcff/fix_subnet_weight.pth')) diff --git a/configs/pruning/mmdet/dcff/dcff_faster_rcnn_resnet50_8xb4_coco.py b/configs/pruning/mmdet/dcff/dcff_faster_rcnn_resnet50_8xb4_coco.py index 482156d76..b6051c649 100644 --- a/configs/pruning/mmdet/dcff/dcff_faster_rcnn_resnet50_8xb4_coco.py +++ b/configs/pruning/mmdet/dcff/dcff_faster_rcnn_resnet50_8xb4_coco.py @@ -65,10 +65,6 @@ _delete_=True) train_cfg = dict(max_epochs=120, val_interval=1) -# !dataset config -# ========================================================================== -# data preprocessor - model = dict( _scope_='mmrazor', type='DCFF', @@ -76,18 +72,16 @@ mutator_cfg=dict( type='DCFFChannelMutator', channel_unit_cfg=dict( - type='DCFFChannelUnit', - units='configs/pruning/mmdet/dcff/resnet_det.json'), + type='DCFFChannelUnit', default_args=dict(choice_mode='ratio')), parse_cfg=dict( type='ChannelAnalyzer', demo_input=(1, 3, 224, 224), tracer_type='BackwardTracer')), target_pruning_ratio=target_pruning_ratio, step_freq=1, - linear_schedule=False, - is_deployed=False) + linear_schedule=False) model_wrapper = dict( type='mmcv.MMDistributedDataParallel', find_unused_parameters=True) -val_cfg = dict(_delete_=True) +val_cfg = dict(_delete_=True, type='mmrazor.ItePruneValLoop') diff --git a/configs/pruning/mmdet/dcff/fix_subnet.json b/configs/pruning/mmdet/dcff/fix_subnet.json new file mode 100644 index 000000000..9722b07e5 --- /dev/null +++ b/configs/pruning/mmdet/dcff/fix_subnet.json @@ -0,0 +1,141 @@ +{ + "type":"DCFFChannelMutator", + "channel_unit_cfg":{ + "type":"DCFFChannelUnit", + "default_args":{ + "choice_mode":"ratio" + }, + "units":{ + "backbone.conv1_(0, 64)_64":{ + "init_args":{ + "num_channels":64, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":1.0 + }, + "backbone.layer1.0.conv1_(0, 64)_64":{ + "init_args":{ + "num_channels":64, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.640625 + }, + "backbone.layer1.1.conv1_(0, 64)_64":{ + "init_args":{ + "num_channels":64, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.640625 + }, + "backbone.layer2.0.conv1_(0, 128)_128":{ + "init_args":{ + "num_channels":128, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer2.0.conv2_(0, 128)_128":{ + "init_args":{ + "num_channels":128, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.59375 + }, + "backbone.layer2.1.conv1_(0, 128)_128":{ + "init_args":{ + "num_channels":128, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer3.0.conv1_(0, 256)_256":{ + "init_args":{ + "num_channels":256, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer3.0.conv2_(0, 256)_256":{ + "init_args":{ + "num_channels":256, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.59765625 + }, + "backbone.layer3.1.conv1_(0, 256)_256":{ + "init_args":{ + "num_channels":256, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484374 + }, + "backbone.layer4.0.conv1_(0, 512)_512":{ + "init_args":{ + "num_channels":512, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.69921875 + }, + "backbone.layer4.0.conv2_(0, 512)_512":{ + "init_args":{ + "num_channels":512, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.69921875 + }, + "backbone.layer4.1.conv1_(0, 512)_512":{ + "init_args":{ + "num_channels":512, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.69921875 + } + } + }, + "parse_cfg":{ + "type":"ChannelAnalyzer", + "demo_input":[ + 1, + 3, + 224, + 224 + ], + "tracer_type":"BackwardTracer" + } +} diff --git a/configs/pruning/mmdet/dcff/resnet_det.json b/configs/pruning/mmdet/dcff/resnet_det.json deleted file mode 100644 index 7e3de46b3..000000000 --- a/configs/pruning/mmdet/dcff/resnet_det.json +++ /dev/null @@ -1,522 +0,0 @@ -{ - "backbone.conv1_(0, 3)_3":{ - "init_args":{ - "num_channels":3, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 3 - ], - "choice_mode":"number" - }, - "choice":3 - }, - "backbone.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 64 - ], - "choice_mode":"number" - }, - "choice":64 - }, - "backbone.layer1.0.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 41 - ], - "choice_mode":"number" - }, - "choice":41 - }, - "backbone.layer1.0.conv2_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 38 - ], - "choice_mode":"number" - }, - "choice":38 - }, - "backbone.layer1.0.conv3_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 230 - ], - "choice_mode":"number" - }, - "choice":230 - }, - "backbone.layer1.1.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 41 - ], - "choice_mode":"number" - }, - "choice":41 - }, - "backbone.layer1.1.conv2_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 38 - ], - "choice_mode":"number" - }, - "choice":38 - }, - "backbone.layer1.2.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 41 - ], - "choice_mode":"number" - }, - "choice":41 - }, - "backbone.layer1.2.conv2_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 38 - ], - "choice_mode":"number" - }, - "choice":38 - }, - "backbone.layer2.0.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 83 - ], - "choice_mode":"number" - }, - "choice":83 - }, - "backbone.layer2.0.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 76 - ], - "choice_mode":"number" - }, - "choice":76 - }, - "backbone.layer2.0.conv3_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 460 - ], - "choice_mode":"number" - }, - "choice":460 - }, - "backbone.layer2.1.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 83 - ], - "choice_mode":"number" - }, - "choice":83 - }, - "backbone.layer2.1.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 76 - ], - "choice_mode":"number" - }, - "choice":76 - }, - "backbone.layer2.2.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 83 - ], - "choice_mode":"number" - }, - "choice":83 - }, - "backbone.layer2.2.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 76 - ], - "choice_mode":"number" - }, - "choice":76 - }, - "backbone.layer2.3.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 83 - ], - "choice_mode":"number" - }, - "choice":83 - }, - "backbone.layer2.3.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 76 - ], - "choice_mode":"number" - }, - "choice":76 - }, - "backbone.layer3.0.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 166 - ], - "choice_mode":"number" - }, - "choice":166 - }, - "backbone.layer3.0.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 153 - ], - "choice_mode":"number" - }, - "choice":153 - }, - "backbone.layer3.0.conv3_(0, 1024)_1024":{ - "init_args":{ - "num_channels":1024, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 921 - ], - "choice_mode":"number" - }, - "choice":921 - }, - "backbone.layer3.1.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 166 - ], - "choice_mode":"number" - }, - "choice":166 - }, - "backbone.layer3.1.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 153 - ], - "choice_mode":"number" - }, - "choice":153 - }, - "backbone.layer3.2.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 166 - ], - "choice_mode":"number" - }, - "choice":166 - }, - "backbone.layer3.2.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 153 - ], - "choice_mode":"number" - }, - "choice":153 - }, - "backbone.layer3.3.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer3.3.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer3.4.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer3.4.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer3.5.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer3.5.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer4.0.conv1_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.0.conv2_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.0.conv3_(0, 2048)_2048":{ - "init_args":{ - "num_channels":2048, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 1843 - ], - "choice_mode":"number" - }, - "choice":1843 - }, - "backbone.layer4.1.conv1_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.1.conv2_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.2.conv1_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.2.conv2_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.2.conv3_(0, 2048)_2048":{ - "init_args":{ - "num_channels":2048, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 1843 - ], - "choice_mode":"number" - }, - "choice":1843 - }, - "head.fc_(0, 1000)_1000":{ - "init_args":{ - "num_channels":1000, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 1000 - ], - "choice_mode":"number" - }, - "choice":1000 - } -} diff --git a/configs/pruning/mmpose/dcff/dcff_compact_topdown_heatmap_resnet50_coco.py b/configs/pruning/mmpose/dcff/dcff_compact_topdown_heatmap_resnet50_coco.py index 8ec4867b2..8fddabb02 100644 --- a/configs/pruning/mmpose/dcff/dcff_compact_topdown_heatmap_resnet50_coco.py +++ b/configs/pruning/mmpose/dcff/dcff_compact_topdown_heatmap_resnet50_coco.py @@ -1,5 +1,12 @@ _base_ = ['dcff_topdown_heatmap_resnet50_coco.py'] # model settings -model = _base_.model -model['is_deployed'] = True +model_cfg = dict( + _scope_='mmrazor', + type='sub_model', + cfg=_base_.architecture, + fix_subnet='configs/pruning/mmpose/dcff/fix_subnet.json', + mode='mutator', + init_cfg=dict( + type='Pretrained', + checkpoint='configs/pruning/mmpose/dcff/fix_subnet_weight.pth')) diff --git a/configs/pruning/mmpose/dcff/dcff_topdown_heatmap_resnet50_coco.py b/configs/pruning/mmpose/dcff/dcff_topdown_heatmap_resnet50_coco.py index 1e0d0a447..d18bccc02 100644 --- a/configs/pruning/mmpose/dcff/dcff_topdown_heatmap_resnet50_coco.py +++ b/configs/pruning/mmpose/dcff/dcff_topdown_heatmap_resnet50_coco.py @@ -108,25 +108,22 @@ model = dict( _scope_='mmrazor', type='DCFF', - architecture=dict( - cfg_path='mmcls::resnet/resnet50_8xb32_in1k.py', pretrained=False), + architecture=architecture, mutator_cfg=dict( type='DCFFChannelMutator', channel_unit_cfg=dict( - type='DCFFChannelUnit', - units='configs/pruning/mmpose/dcff/resnet_pose.json'), + type='DCFFChannelUnit', default_args=dict(choice_mode='ratio')), parse_cfg=dict( type='ChannelAnalyzer', demo_input=(1, 3, 224, 224), tracer_type='BackwardTracer')), target_pruning_ratio=target_pruning_ratio, step_freq=1, - linear_schedule=False, - is_deployed=False) + linear_schedule=False) dataset_type = 'CocoDataset' data_mode = 'topdown' -data_root = 'data/coco' +data_root = 'data/coco/' file_client_args = dict(backend='disk') @@ -187,3 +184,5 @@ type='mmpose.CocoMetric', ann_file=data_root + 'annotations/person_keypoints_val2017.json') test_evaluator = val_evaluator + +val_cfg = dict(_delete_=True, type='mmrazor.ItePruneValLoop') diff --git a/configs/pruning/mmpose/dcff/fix_subnet.json b/configs/pruning/mmpose/dcff/fix_subnet.json new file mode 100644 index 000000000..6c5243e0a --- /dev/null +++ b/configs/pruning/mmpose/dcff/fix_subnet.json @@ -0,0 +1,141 @@ +{ + "type":"DCFFChannelMutator", + "channel_unit_cfg":{ + "type":"DCFFChannelUnit", + "default_args":{ + "choice_mode":"ratio" + }, + "units":{ + "backbone.conv1_(0, 64)_64":{ + "init_args":{ + "num_channels":64, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":1.0 + }, + "backbone.layer1.0.conv1_(0, 64)_64":{ + "init_args":{ + "num_channels":64, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.640625 + }, + "backbone.layer1.1.conv1_(0, 64)_64":{ + "init_args":{ + "num_channels":64, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.640625 + }, + "backbone.layer2.0.conv1_(0, 128)_128":{ + "init_args":{ + "num_channels":128, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer2.0.conv2_(0, 128)_128":{ + "init_args":{ + "num_channels":128, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.59374 + }, + "backbone.layer2.1.conv1_(0, 128)_128":{ + "init_args":{ + "num_channels":128, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer3.0.conv1_(0, 256)_256":{ + "init_args":{ + "num_channels":256, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer3.0.conv2_(0, 256)_256":{ + "init_args":{ + "num_channels":256, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.59765625 + }, + "backbone.layer3.1.conv1_(0, 256)_256":{ + "init_args":{ + "num_channels":256, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer4.0.conv1_(0, 512)_512":{ + "init_args":{ + "num_channels":512, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.69921875 + }, + "backbone.layer4.0.conv2_(0, 512)_512":{ + "init_args":{ + "num_channels":512, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.69921875 + }, + "backbone.layer4.1.conv1_(0, 512)_512":{ + "init_args":{ + "num_channels":512, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.69921875 + } + } + }, + "parse_cfg":{ + "type":"ChannelAnalyzer", + "demo_input":[ + 1, + 3, + 224, + 224 + ], + "tracer_type":"BackwardTracer" + } +} diff --git a/configs/pruning/mmpose/dcff/resnet_pose.json b/configs/pruning/mmpose/dcff/resnet_pose.json deleted file mode 100644 index a08b40503..000000000 --- a/configs/pruning/mmpose/dcff/resnet_pose.json +++ /dev/null @@ -1,509 +0,0 @@ -{ - "backbone.conv1_(0, 3)_3":{ - "init_args":{ - "num_channels":3, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 3 - ], - "choice_mode":"number" - }, - "choice":3 - }, - "backbone.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 64 - ], - "choice_mode":"number" - }, - "choice":64 - }, - "backbone.layer1.0.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 51 - ], - "choice_mode":"number" - }, - "choice":51 - }, - "backbone.layer1.0.conv2_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 51 - ], - "choice_mode":"number" - }, - "choice":51 - }, - "backbone.layer1.0.conv3_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 230 - ], - "choice_mode":"number" - }, - "choice":230 - }, - "backbone.layer1.1.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 51 - ], - "choice_mode":"number" - }, - "choice":51 - }, - "backbone.layer1.1.conv2_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 51 - ], - "choice_mode":"number" - }, - "choice":51 - }, - "backbone.layer1.2.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 51 - ], - "choice_mode":"number" - }, - "choice":51 - }, - "backbone.layer1.2.conv2_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 51 - ], - "choice_mode":"number" - }, - "choice":51 - }, - "backbone.layer2.0.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 102 - ], - "choice_mode":"number" - }, - "choice":102 - }, - "backbone.layer2.0.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 102 - ], - "choice_mode":"number" - }, - "choice":102 - }, - "backbone.layer2.0.conv3_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 460 - ], - "choice_mode":"number" - }, - "choice":460 - }, - "backbone.layer2.1.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 102 - ], - "choice_mode":"number" - }, - "choice":102 - }, - "backbone.layer2.1.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 102 - ], - "choice_mode":"number" - }, - "choice":102 - }, - "backbone.layer2.2.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 102 - ], - "choice_mode":"number" - }, - "choice":102 - }, - "backbone.layer2.2.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 102 - ], - "choice_mode":"number" - }, - "choice":102 - }, - "backbone.layer2.3.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 102 - ], - "choice_mode":"number" - }, - "choice":102 - }, - "backbone.layer2.3.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 102 - ], - "choice_mode":"number" - }, - "choice":102 - }, - "backbone.layer3.0.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 204 - ], - "choice_mode":"number" - }, - "choice":204 - }, - "backbone.layer3.0.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 204 - ], - "choice_mode":"number" - }, - "choice":204 - }, - "backbone.layer3.0.conv3_(0, 1024)_1024":{ - "init_args":{ - "num_channels":1024, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 921 - ], - "choice_mode":"number" - }, - "choice":921 - }, - "backbone.layer3.1.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 204 - ], - "choice_mode":"number" - }, - "choice":204 - }, - "backbone.layer3.1.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 204 - ], - "choice_mode":"number" - }, - "choice":204 - }, - "backbone.layer3.2.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 204 - ], - "choice_mode":"number" - }, - "choice":204 - }, - "backbone.layer3.2.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 204 - ], - "choice_mode":"number" - }, - "choice":204 - }, - "backbone.layer3.3.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 217 - ], - "choice_mode":"number" - }, - "choice":217 - }, - "backbone.layer3.3.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 217 - ], - "choice_mode":"number" - }, - "choice":217 - }, - "backbone.layer3.4.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 217 - ], - "choice_mode":"number" - }, - "choice":217 - }, - "backbone.layer3.4.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 217 - ], - "choice_mode":"number" - }, - "choice":217 - }, - "backbone.layer3.5.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 217 - ], - "choice_mode":"number" - }, - "choice":217 - }, - "backbone.layer3.5.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 217 - ], - "choice_mode":"number" - }, - "choice":217 - }, - "backbone.layer4.0.conv1_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 435 - ], - "choice_mode":"number" - }, - "choice":435 - }, - "backbone.layer4.0.conv2_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 435 - ], - "choice_mode":"number" - }, - "choice":435 - }, - "backbone.layer4.0.conv3_(0, 2048)_2048":{ - "init_args":{ - "num_channels":2048, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 1843 - ], - "choice_mode":"number" - }, - "choice":1843 - }, - "backbone.layer4.1.conv1_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 435 - ], - "choice_mode":"number" - }, - "choice":435 - }, - "backbone.layer4.1.conv2_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 435 - ], - "choice_mode":"number" - }, - "choice":435 - }, - "backbone.layer4.2.conv1_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 435 - ], - "choice_mode":"number" - }, - "choice":435 - }, - "backbone.layer4.2.conv2_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 435 - ], - "choice_mode":"number" - }, - "choice":435 - }, - "backbone.layer4.2.conv3_(0, 2048)_2048":{ - "init_args":{ - "num_channels":2048, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 1843 - ], - "choice_mode":"number" - }, - "choice":1843 - } -} diff --git a/configs/pruning/mmseg/dcff/dcff_compact_pointrend_resnet50_8xb2_cityscapes.py b/configs/pruning/mmseg/dcff/dcff_compact_pointrend_resnet50_8xb2_cityscapes.py index 2914b7d84..3a5d86a2b 100644 --- a/configs/pruning/mmseg/dcff/dcff_compact_pointrend_resnet50_8xb2_cityscapes.py +++ b/configs/pruning/mmseg/dcff/dcff_compact_pointrend_resnet50_8xb2_cityscapes.py @@ -1,5 +1,12 @@ _base_ = ['dcff_pointrend_resnet50_8xb2_cityscapes.py'] # model settings -model = _base_.model -model['is_deployed'] = True +model_cfg = dict( + _scope_='mmrazor', + type='sub_model', + cfg=_base_.architecture, + fix_subnet='configs/pruning/mmseg/dcff/fix_subnet.json', + mode='mutator', + init_cfg=dict( + type='Pretrained', + checkpoint='configs/pruning/mmseg/dcff/fix_subnet_weight.pth')) diff --git a/configs/pruning/mmseg/dcff/dcff_pointrend_resnet50_8xb2_cityscapes.py b/configs/pruning/mmseg/dcff/dcff_pointrend_resnet50_8xb2_cityscapes.py index d3edff602..d552e23e9 100644 --- a/configs/pruning/mmseg/dcff/dcff_pointrend_resnet50_8xb2_cityscapes.py +++ b/configs/pruning/mmseg/dcff/dcff_pointrend_resnet50_8xb2_cityscapes.py @@ -80,21 +80,20 @@ model = dict( _scope_='mmrazor', type='DCFF', - architecture=dict( - cfg_path='mmcls::resnet/resnet50_8xb32_in1k.py', pretrained=False), + architecture=_base_.architecture, mutator_cfg=dict( type='DCFFChannelMutator', channel_unit_cfg=dict( - type='DCFFChannelUnit', - units='configs/pruning/mmseg/dcff/resnet_seg.json'), + type='DCFFChannelUnit', default_args=dict(choice_mode='ratio')), parse_cfg=dict( type='ChannelAnalyzer', demo_input=(1, 3, 224, 224), tracer_type='BackwardTracer')), target_pruning_ratio=target_pruning_ratio, step_freq=200, - linear_schedule=False, - is_deployed=False) + linear_schedule=False) model_wrapper = dict( type='mmcv.MMDistributedDataParallel', find_unused_parameters=True) + +val_cfg = dict(_delete_=True, type='mmrazor.ItePruneValLoop') diff --git a/configs/pruning/mmseg/dcff/fix_subnet.json b/configs/pruning/mmseg/dcff/fix_subnet.json new file mode 100644 index 000000000..bd9fcb189 --- /dev/null +++ b/configs/pruning/mmseg/dcff/fix_subnet.json @@ -0,0 +1,141 @@ +{ + "type":"DCFFChannelMutator", + "channel_unit_cfg":{ + "type":"DCFFChannelUnit", + "default_args":{ + "choice_mode":"ratio" + }, + "units":{ + "backbone.conv1_(0, 64)_64":{ + "init_args":{ + "num_channels":64, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":1.0 + }, + "backbone.layer1.0.conv1_(0, 64)_64":{ + "init_args":{ + "num_channels":64, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.640625 + }, + "backbone.layer1.1.conv1_(0, 64)_64":{ + "init_args":{ + "num_channels":64, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.640625 + }, + "backbone.layer2.0.conv1_(0, 128)_128":{ + "init_args":{ + "num_channels":128, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer2.0.conv2_(0, 128)_128":{ + "init_args":{ + "num_channels":128, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.59375 + }, + "backbone.layer2.1.conv1_(0, 128)_128":{ + "init_args":{ + "num_channels":128, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer3.0.conv1_(0, 256)_256":{ + "init_args":{ + "num_channels":256, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer3.0.conv2_(0, 256)_256":{ + "init_args":{ + "num_channels":256, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.59765625 + }, + "backbone.layer3.1.conv1_(0, 256)_256":{ + "init_args":{ + "num_channels":256, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer4.0.conv1_(0, 512)_512":{ + "init_args":{ + "num_channels":512, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.69921875 + }, + "backbone.layer4.0.conv2_(0, 512)_512":{ + "init_args":{ + "num_channels":512, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.69921875 + }, + "backbone.layer4.1.conv1_(0, 512)_512":{ + "init_args":{ + "num_channels":512, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.69921874 + } + } + }, + "parse_cfg":{ + "type":"ChannelAnalyzer", + "demo_input":[ + 1, + 3, + 224, + 224 + ], + "tracer_type":"BackwardTracer" + } +} diff --git a/configs/pruning/mmseg/dcff/resnet_seg.json b/configs/pruning/mmseg/dcff/resnet_seg.json deleted file mode 100644 index 317fba020..000000000 --- a/configs/pruning/mmseg/dcff/resnet_seg.json +++ /dev/null @@ -1,496 +0,0 @@ -{ - "backbone.conv1_(0, 3)_3":{ - "init_args":{ - "num_channels":3, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 3 - ], - "choice_mode":"number" - }, - "choice":3 - }, - "backbone.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 64 - ], - "choice_mode":"number" - }, - "choice":64 - }, - "backbone.layer1.0.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 41 - ], - "choice_mode":"number" - }, - "choice":41 - }, - "backbone.layer1.0.conv2_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 38 - ], - "choice_mode":"number" - }, - "choice":38 - }, - "backbone.layer1.0.conv3_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 230 - ], - "choice_mode":"number" - }, - "choice":230 - }, - "backbone.layer1.1.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 41 - ], - "choice_mode":"number" - }, - "choice":41 - }, - "backbone.layer1.1.conv2_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 38 - ], - "choice_mode":"number" - }, - "choice":38 - }, - "backbone.layer1.2.conv1_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 41 - ], - "choice_mode":"number" - }, - "choice":41 - }, - "backbone.layer1.2.conv2_(0, 64)_64":{ - "init_args":{ - "num_channels":64, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 38 - ], - "choice_mode":"number" - }, - "choice":38 - }, - "backbone.layer2.0.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 83 - ], - "choice_mode":"number" - }, - "choice":83 - }, - "backbone.layer2.0.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 76 - ], - "choice_mode":"number" - }, - "choice":76 - }, - "backbone.layer2.0.conv3_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 460 - ], - "choice_mode":"number" - }, - "choice":460 - }, - "backbone.layer2.1.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 83 - ], - "choice_mode":"number" - }, - "choice":83 - }, - "backbone.layer2.1.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 76 - ], - "choice_mode":"number" - }, - "choice":76 - }, - "backbone.layer2.2.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 83 - ], - "choice_mode":"number" - }, - "choice":83 - }, - "backbone.layer2.2.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 76 - ], - "choice_mode":"number" - }, - "choice":76 - }, - "backbone.layer2.3.conv1_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 83 - ], - "choice_mode":"number" - }, - "choice":83 - }, - "backbone.layer2.3.conv2_(0, 128)_128":{ - "init_args":{ - "num_channels":128, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 76 - ], - "choice_mode":"number" - }, - "choice":76 - }, - "backbone.layer3.0.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 166 - ], - "choice_mode":"number" - }, - "choice":166 - }, - "backbone.layer3.0.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 153 - ], - "choice_mode":"number" - }, - "choice":153 - }, - "backbone.layer3.0.conv3_(0, 1024)_1024":{ - "init_args":{ - "num_channels":1024, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 921 - ], - "choice_mode":"number" - }, - "choice":921 - }, - "backbone.layer3.1.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 166 - ], - "choice_mode":"number" - }, - "choice":166 - }, - "backbone.layer3.1.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 153 - ], - "choice_mode":"number" - }, - "choice":153 - }, - "backbone.layer3.2.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 166 - ], - "choice_mode":"number" - }, - "choice":166 - }, - "backbone.layer3.2.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 153 - ], - "choice_mode":"number" - }, - "choice":153 - }, - "backbone.layer3.3.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer3.3.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer3.4.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer3.4.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer3.5.conv1_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer3.5.conv2_(0, 256)_256":{ - "init_args":{ - "num_channels":256, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 179 - ], - "choice_mode":"number" - }, - "choice":179 - }, - "backbone.layer4.0.conv1_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.0.conv2_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.0.conv3_(0, 2048)_2048":{ - "init_args":{ - "num_channels":2048, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 1843 - ], - "choice_mode":"number" - }, - "choice":1843 - }, - "backbone.layer4.1.conv1_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.1.conv2_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.2.conv1_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - }, - "backbone.layer4.2.conv2_(0, 512)_512":{ - "init_args":{ - "num_channels":512, - "divisor":1, - "min_value":1, - "min_ratio":0.9, - "candidate_choices":[ - 358 - ], - "choice_mode":"number" - }, - "choice":358 - } -} diff --git a/mmrazor/engine/runner/__init__.py b/mmrazor/engine/runner/__init__.py index cda61fca2..0f2b88d27 100644 --- a/mmrazor/engine/runner/__init__.py +++ b/mmrazor/engine/runner/__init__.py @@ -2,6 +2,7 @@ from .darts_loop import DartsEpochBasedTrainLoop, DartsIterBasedTrainLoop from .distill_val_loop import SelfDistillValLoop, SingleTeacherDistillValLoop from .evolution_search_loop import EvolutionSearchLoop +from .iteprune_val_loop import ItePruneValLoop from .slimmable_val_loop import SlimmableValLoop from .subnet_sampler_loop import GreedySamplerTrainLoop from .subnet_val_loop import SubnetValLoop @@ -9,5 +10,6 @@ __all__ = [ 'SingleTeacherDistillValLoop', 'DartsEpochBasedTrainLoop', 'DartsIterBasedTrainLoop', 'SlimmableValLoop', 'EvolutionSearchLoop', - 'GreedySamplerTrainLoop', 'SubnetValLoop', 'SelfDistillValLoop' + 'GreedySamplerTrainLoop', 'SubnetValLoop', 'SelfDistillValLoop', + 'ItePruneValLoop' ] diff --git a/mmrazor/engine/runner/iteprune_val_loop.py b/mmrazor/engine/runner/iteprune_val_loop.py new file mode 100644 index 000000000..07d40c884 --- /dev/null +++ b/mmrazor/engine/runner/iteprune_val_loop.py @@ -0,0 +1,55 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import json +import os.path as osp + +import torch +from mmengine.runner import ValLoop + +from mmrazor.registry import LOOPS +from mmrazor.structures import export_fix_subnet + + +@LOOPS.register_module() +class ItePruneValLoop(ValLoop): + """Pruning loop for validation. Export fixed subnet configs. + + Args: + runner (Runner): A reference of runner. + dataloader (Dataloader or dict): A dataloader object or a dict to + build a dataloader. + evaluator (Evaluator or dict or list): Used for computing metrics. + fp16 (bool): Whether to enable fp16 validation. Defaults to + False. + """ + + def run(self): + """Launch validation.""" + self.runner.call_hook('before_val') + self.runner.call_hook('before_val_epoch') + self.runner.model.eval() + for idx, data_batch in enumerate(self.dataloader): + self.run_iter(idx, data_batch) + + # compute metrics + metrics = self.evaluator.evaluate(len(self.dataloader.dataset)) + self._save_fix_subnet() + self.runner.call_hook('after_val_epoch', metrics=metrics) + self.runner.call_hook('after_val') + return metrics + + def _save_fix_subnet(self): + """Save model subnet config.""" + # TO DO: Modify export_fix_subnet's output. Might contain weight return + fix_subnet, static_model = export_fix_subnet( + self.model, export_subnet_mode='mutator', slice_weight=True) + fix_subnet = json.dumps(fix_subnet, indent=4, separators=(',', ':')) + subnet_name = 'fix_subnet.json' + weight_name = 'fix_subnet_weight.pth' + with open(osp.join(self.runner.work_dir, subnet_name), 'w') as file: + file.write(fix_subnet) + torch.save({'state_dict': static_model.state_dict()}, + osp.join(self.runner.work_dir, weight_name)) + self.runner.logger.info( + 'export finished and ' + f'{subnet_name}, ' + f'{weight_name} saved in {self.runner.work_dir}.') diff --git a/mmrazor/models/algorithms/pruning/dcff.py b/mmrazor/models/algorithms/pruning/dcff.py index 12c827556..71b669c09 100644 --- a/mmrazor/models/algorithms/pruning/dcff.py +++ b/mmrazor/models/algorithms/pruning/dcff.py @@ -8,10 +8,9 @@ from mmengine.model import BaseModel from mmengine.structures import BaseDataElement -from mmrazor.models.mutables import BaseMutable from mmrazor.models.mutators import DCFFChannelMutator from mmrazor.registry import MODELS -from mmrazor.structures.subnet.fix_subnet import _dynamic_to_static +from mmrazor.utils import ValidFixMutable from .ite_prune_algorithm import ItePruneAlgorithm, ItePruneConfigManager LossResults = Dict[str, torch.Tensor] @@ -30,8 +29,8 @@ class DCFF(ItePruneAlgorithm): Args: architecture (Union[BaseModel, Dict]): The model to be pruned. mutator_cfg (Union[Dict, ChannelMutator], optional): The config - of a mutator. Defaults to dict( type='ChannelMutator', - channel_unit_cfg=dict( type='SequentialMutableChannelUnit')). + of a mutator. Defaults to dict( type='DCFFChannelMutator', + channel_unit_cfg=dict( type='DCFFChannelUnit')). data_preprocessor (Optional[Union[Dict, nn.Module]], optional): Defaults to None. target_pruning_ratio (dict, optional): The prune-target. The template @@ -47,8 +46,6 @@ class DCFF(ItePruneAlgorithm): Defaults to None. linear_schedule (bool, optional): flag to set linear ratio schedule. Defaults to False due to dcff fixed pruning rate. - is_deployed (bool, optional): flag to set deployed algorithm. - Defaults to False. """ def __init__(self, @@ -56,35 +53,17 @@ def __init__(self, mutator_cfg: Union[Dict, DCFFChannelMutator] = dict( type=' DCFFChannelMutator', channel_unit_cfg=dict(type='DCFFChannelUnit')), + fix_subnet: Optional[ValidFixMutable] = None, data_preprocessor: Optional[Union[Dict, nn.Module]] = None, target_pruning_ratio: Optional[Dict[str, float]] = None, step_freq=1, prune_times=0, init_cfg: Optional[Dict] = None, - linear_schedule=False, - is_deployed=False) -> None: + linear_schedule=False) -> None: # invalid param prune_times, reset after message_hub get [max_epoch] - super().__init__(architecture, mutator_cfg, data_preprocessor, - target_pruning_ratio, step_freq, prune_times, - init_cfg, linear_schedule) - self.is_deployed = is_deployed - if (self.is_deployed): - # To static ops for loaded pruned network. - self._deploy() - - def _fix_archtecture(self): - for module in self.architecture.modules(): - if isinstance(module, BaseMutable): - if not module.is_fixed: - module.fix_chosen(None) - - def _deploy(self): - config = self.prune_config_manager.prune_at(self._iter) - self.mutator.set_choices(config) - self.mutator.fix_channel_mutables() - self._fix_archtecture() - _dynamic_to_static(self.architecture) - self.is_deployed = True + super().__init__(architecture, mutator_cfg, fix_subnet, + data_preprocessor, target_pruning_ratio, step_freq, + prune_times, init_cfg, linear_schedule) def _calc_temperature(self, cur_num: int, max_num: int): """Calculate temperature param.""" diff --git a/mmrazor/models/algorithms/pruning/ite_prune_algorithm.py b/mmrazor/models/algorithms/pruning/ite_prune_algorithm.py index d0aab73fd..88d2e6067 100644 --- a/mmrazor/models/algorithms/pruning/ite_prune_algorithm.py +++ b/mmrazor/models/algorithms/pruning/ite_prune_algorithm.py @@ -10,6 +10,7 @@ from mmrazor.models.mutables import MutableChannelUnit from mmrazor.models.mutators import ChannelMutator from mmrazor.registry import MODELS +from mmrazor.utils import ValidFixMutable from ..base import BaseAlgorithm LossResults = Dict[str, torch.Tensor] @@ -97,6 +98,8 @@ class ItePruneAlgorithm(BaseAlgorithm): mutator_cfg (Union[Dict, ChannelMutator], optional): The config of a mutator. Defaults to dict( type='ChannelMutator', channel_unit_cfg=dict( type='SequentialMutableChannelUnit')). + fix_subnet (str | dict | :obj:`FixSubnet`): The path of yaml file or + loaded dict or built :obj:`FixSubnet`. Defaults to None. data_preprocessor (Optional[Union[Dict, nn.Module]], optional): Defaults to None. target_pruning_ratio (dict, optional): The prune-target. The template @@ -118,10 +121,11 @@ def __init__(self, type='ChannelMutator', channel_unit_cfg=dict( type='SequentialMutableChannelUnit')), + fix_subnet: Optional[ValidFixMutable] = None, data_preprocessor: Optional[Union[Dict, nn.Module]] = None, target_pruning_ratio: Optional[Dict[str, float]] = None, - step_freq=-1, - prune_times=-1, + step_freq=1, + prune_times=1, init_cfg: Optional[Dict] = None, linear_schedule=True) -> None: @@ -133,7 +137,6 @@ def __init__(self, self.prune_times = prune_times self.linear_schedule = linear_schedule - # mutator self.mutator: ChannelMutator = MODELS.build(mutator_cfg) self.mutator.prepare_from_supernet(self.architecture) diff --git a/mmrazor/models/architectures/backbones/searchable_shufflenet_v2.py b/mmrazor/models/architectures/backbones/searchable_shufflenet_v2.py index 2d3e6b2e5..db9e300a4 100644 --- a/mmrazor/models/architectures/backbones/searchable_shufflenet_v2.py +++ b/mmrazor/models/architectures/backbones/searchable_shufflenet_v2.py @@ -50,7 +50,7 @@ class SearchableShuffleNetV2(BaseBackbone): 6 initializers, including ``Constant``, ``Xavier``, ``Normal``, ``Uniform``, ``Kaiming``, and ``Pretrained``. - Excamples: + Examples: >>> mutable_cfg = dict( ... type='OneShotMutableOP', ... candidates=dict( diff --git a/mmrazor/models/mutables/mutable_channel/units/mutable_channel_unit.py b/mmrazor/models/mutables/mutable_channel/units/mutable_channel_unit.py index 9963f671b..dabe41fab 100644 --- a/mmrazor/models/mutables/mutable_channel/units/mutable_channel_unit.py +++ b/mmrazor/models/mutables/mutable_channel/units/mutable_channel_unit.py @@ -41,6 +41,16 @@ def __init__(self, num_channels: int, **kwargs) -> None: super().__init__(num_channels) + @classmethod + def init_from_cfg(cls, model: nn.Module, config: Dict): + """init a Channel using a config which can be generated by + self.config_template(), include init choice.""" + unit = super().init_from_cfg(model, config) + # TO DO: add illegal judgement here? + if 'choice' in config: + unit.current_choice = config['choice'] + return unit + @classmethod def init_from_mutable_channel(cls, mutable_channel: BaseMutableChannel): unit = cls(mutable_channel.num_channels) diff --git a/mmrazor/registry/registry.py b/mmrazor/registry/registry.py index 684aa8116..d3a5c5423 100644 --- a/mmrazor/registry/registry.py +++ b/mmrazor/registry/registry.py @@ -5,7 +5,7 @@ More details can be found at https://mmengine.readthedocs.io/en/latest/tutorials/registry.html. """ -from typing import Any, Optional, Union +from typing import Any, Dict, Optional, Union from mmengine.config import Config, ConfigDict from mmengine.registry import DATA_SAMPLERS as MMENGINE_DATA_SAMPLERS @@ -107,10 +107,32 @@ def build_razor_model_from_cfg( # manage sub models for downstream repos @MODELS.register_module() -def sub_model(cfg, fix_subnet, prefix='', extra_prefix=''): +def sub_model(cfg, + fix_subnet, + mode: str = 'mutable', + prefix: str = '', + extra_prefix: str = '', + init_weight_from_supernet: bool = False, + init_cfg: Optional[Dict] = None): model = MODELS.build(cfg) + # Save path type cfg process, set init_cfg directly. + if init_cfg: + # update init_cfg when init_cfg is valid. + model.init_cfg = init_cfg + if init_weight_from_supernet: + # Supernet is modified after load_fix_subnet(), init weight here. + model.init_weights() from mmrazor.structures import load_fix_subnet load_fix_subnet( - model, fix_subnet, prefix=prefix, extra_prefix=extra_prefix) + model, + fix_subnet, + load_subnet_mode=mode, + prefix=prefix, + extra_prefix=extra_prefix) + + if init_weight_from_supernet: + # Supernet is modified after load_fix_subnet(). + model.init_cfg = None + return model diff --git a/mmrazor/structures/subnet/fix_subnet.py b/mmrazor/structures/subnet/fix_subnet.py index 97566ee77..311dc8936 100644 --- a/mmrazor/structures/subnet/fix_subnet.py +++ b/mmrazor/structures/subnet/fix_subnet.py @@ -3,8 +3,10 @@ from typing import Dict, Optional, Tuple from mmengine import fileio +from mmengine.logging import print_log from torch import nn +from mmrazor.registry import MODELS from mmrazor.utils import FixMutable, ValidFixMutable from mmrazor.utils.typing import DumpChosen @@ -29,6 +31,7 @@ def traverse_children(module: nn.Module) -> None: def load_fix_subnet(model: nn.Module, fix_mutable: ValidFixMutable, + load_subnet_mode: str = 'mutable', prefix: str = '', extra_prefix: str = '') -> None: """Load fix subnet.""" @@ -45,6 +48,22 @@ def load_fix_subnet(model: nn.Module, if isinstance(model, DynamicMixin): raise RuntimeError('Root model can not be dynamic op.') + if load_subnet_mode == 'mutable': + _load_fix_subnet_by_mutable(model, fix_mutable, prefix, extra_prefix) + elif load_subnet_mode == 'mutator': + _load_fix_subnet_by_mutator(model, fix_mutable) + else: + raise ValueError(f'Invalid load_subnet_mode {load_subnet_mode}, ' + 'only mutable or mutator is supported.') + + # convert dynamic op to static op + _dynamic_to_static(model) + + +def _load_fix_subnet_by_mutable(model: nn.Module, + fix_mutable: Dict, + prefix: str = '', + extra_prefix: str = '') -> None: # Avoid circular import from mmrazor.models.mutables import DerivedMutable, MutableChannelContainer from mmrazor.models.mutables.base_mutable import BaseMutable @@ -92,19 +111,62 @@ def load_fix_module(module): else: load_fix_module(module) - # convert dynamic op to static op - _dynamic_to_static(model) + +def _load_fix_subnet_by_mutator(model: nn.Module, mutator_cfg: Dict) -> None: + if 'channel_unit_cfg' not in mutator_cfg: + raise ValueError('mutator_cfg must contain key channel_unit_cfg, ' + f'but got mutator_cfg:' + f'{mutator_cfg}') + mutator_cfg['parse_cfg'] = {'type': 'Config'} + mutator = MODELS.build(mutator_cfg) + mutator.prepare_from_supernet(model) + mutator.set_choices(mutator.current_choices) def export_fix_subnet( model: nn.Module, + export_subnet_mode: str = 'mutable', slice_weight: bool = False) -> Tuple[FixMutable, Optional[Dict]]: - """Export subnet config with (optional) the sliced weight. + """Export subnet that can be loaded by :func:`load_fix_subnet`. Include + subnet structure and subnet weight. Args: - slice_weight (bool): Whether to return the sliced subnet. - Defaults to False. + model (nn.Module): The target model to export. + export_subnet_mode (bool): Subnet export method choice. + Export by `mutable.dump_chosen()` when set to 'mutable' (NAS) + Export by `mutator.config_template()` when set to 'mutator' (Prune) + slice_weight (bool): Export subnet weight. Default to False. + + Return: + fix_subnet (ValidFixMutable): Exported subnet choice config. + static_model (Optional[Dict]): Exported static model state_dict. + Valid when `slice_weight`=True. """ + + static_model = copy.deepcopy(model) + + fix_subnet = dict() + if export_subnet_mode == 'mutable': + fix_subnet = _export_subnet_by_mutable(static_model) + elif export_subnet_mode == 'mutator': + fix_subnet = _export_subnet_by_mutator(static_model) + else: + raise ValueError(f'Invalid export_subnet_mode {export_subnet_mode}, ' + 'only mutable or mutator is supported.') + + if slice_weight: + # export subnet ckpt + print_log('Exporting fixed subnet weight') + _dynamic_to_static(static_model) + if next(static_model.parameters()).is_cuda: + static_model.cuda() + return fix_subnet, static_model + else: + return fix_subnet, None + + +def _export_subnet_by_mutable(model: nn.Module) -> Dict: + # Avoid circular import from mmrazor.models.mutables import DerivedMutable, MutableChannelContainer from mmrazor.models.mutables.base_mutable import BaseMutable @@ -125,14 +187,14 @@ def module_dump_chosen(module, fix_subnet): module_dump_chosen(source_mutable, fix_subnet) else: module_dump_chosen(module, fix_subnet) + return fix_subnet - if slice_weight: - copied_model = copy.deepcopy(model) - load_fix_subnet(copied_model, fix_subnet) - - if next(copied_model.parameters()).is_cuda: - copied_model.cuda() - return fix_subnet, copied_model +def _export_subnet_by_mutator(model: nn.Module) -> Dict: + if not hasattr(model, 'mutator'): + raise ValueError('model should contain `mutator` attribute, but got ' + f'{type(model)} model') + fix_subnet = model.mutator.config_template( + with_channels=False, with_unit_init_args=True) - return fix_subnet, None + return fix_subnet diff --git a/tests/data/test_registry/subnet.json b/tests/data/test_registry/subnet.json new file mode 100644 index 000000000..4fe63bda2 --- /dev/null +++ b/tests/data/test_registry/subnet.json @@ -0,0 +1,141 @@ +{ + "type":"DCFFChannelMutator", + "channel_unit_cfg":{ + "type":"DCFFChannelUnit", + "default_args":{ + "choice_mode":"ratio" + }, + "units":{ + "backbone.conv1_(0, 64)_64":{ + "init_args":{ + "num_channels":64, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":1.0 + }, + "backbone.layer1.0.conv1_(0, 64)_64":{ + "init_args":{ + "num_channels":64, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.640625 + }, + "backbone.layer1.1.conv1_(0, 64)_64":{ + "init_args":{ + "num_channels":64, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.640625 + }, + "backbone.layer2.0.conv1_(0, 128)_128":{ + "init_args":{ + "num_channels":128, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer2.0.conv2_(0, 128)_128":{ + "init_args":{ + "num_channels":128, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.59375 + }, + "backbone.layer2.1.conv1_(0, 128)_128":{ + "init_args":{ + "num_channels":128, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer3.0.conv1_(0, 256)_256":{ + "init_args":{ + "num_channels":256, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer3.0.conv2_(0, 256)_256":{ + "init_args":{ + "num_channels":256, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.59765625 + }, + "backbone.layer3.1.conv1_(0, 256)_256":{ + "init_args":{ + "num_channels":256, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.6484375 + }, + "backbone.layer4.0.conv1_(0, 512)_512":{ + "init_args":{ + "num_channels":512, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.69921875 + }, + "backbone.layer4.0.conv2_(0, 512)_512":{ + "init_args":{ + "num_channels":512, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.69921875 + }, + "backbone.layer4.1.conv1_(0, 512)_512":{ + "init_args":{ + "num_channels":512, + "choice_mode":"ratio", + "divisor":1, + "min_value":1, + "min_ratio":0.9 + }, + "choice":0.69921875 + } + } + }, + "parse_cfg":{ + "type":"ChannelAnalyzer", + "demo_input":[ + 1, + 3, + 224, + 224 + ], + "tracer_type":"BackwardTracer" + } +} \ No newline at end of file diff --git a/tests/test_models/test_algorithms/test_dcff_network.py b/tests/test_models/test_algorithms/test_dcff_network.py index fd108a172..9d369f3f2 100644 --- a/tests/test_models/test_algorithms/test_dcff_network.py +++ b/tests/test_models/test_algorithms/test_dcff_network.py @@ -1,6 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import copy +import json import os +import os.path as osp import unittest import torch @@ -12,6 +14,7 @@ from mmrazor.models.algorithms.pruning.ite_prune_algorithm import \ ItePruneConfigManager from mmrazor.registry import MODELS +from mmrazor.structures import export_fix_subnet # @TASK_UTILS.register_module() @@ -229,3 +232,94 @@ def test_group_target_ratio(self): algorithm.forward( data['inputs'], data['data_samples'], mode='loss') self.assertEqual(algorithm.step_freq, epoch_step * iter_per_epoch) + + def test_export_subnet(self): + + model = MODELS.build(MODEL_CFG) + mutator = MODELS.build(MUTATOR_CONFIG_FLOAT) + mutator.prepare_from_supernet(model) + mutator.set_choices(mutator.sample_choices()) + + custom_groups = [[ + 'backbone.layer1.0.conv1_(0, 64)_64', + 'backbone.layer1.1.conv1_(0, 64)_64' + ]] + mutator_cfg = copy.deepcopy(MUTATOR_CONFIG_FLOAT) + mutator_cfg['custom_groups'] = custom_groups + + iter_per_epoch = 10 + epoch_step = 2 + epoch = 6 + data = self.fake_cifar_data() + + stage_ratio_1 = 0.65 + stage_ratio_2 = 0.6 + stage_ratio_3 = 0.9 + stage_ratio_4 = 0.7 + + target_pruning_ratio = { + 'backbone.layer1.0.conv1_(0, 64)_64': stage_ratio_1, + 'backbone.layer1.0.conv2_(0, 64)_64': stage_ratio_2, + 'backbone.layer1.0.conv3_(0, 256)_256': stage_ratio_3, + 'backbone.layer1.1.conv1_(0, 64)_64': stage_ratio_1, + 'backbone.layer1.1.conv2_(0, 64)_64': stage_ratio_2, + 'backbone.layer1.2.conv1_(0, 64)_64': stage_ratio_1, + 'backbone.layer1.2.conv2_(0, 64)_64': stage_ratio_2, + # block 1 [0.65, 0.6] downsample=[0.9] + 'backbone.layer2.0.conv1_(0, 128)_128': stage_ratio_1, + 'backbone.layer2.0.conv2_(0, 128)_128': stage_ratio_2, + 'backbone.layer2.0.conv3_(0, 512)_512': stage_ratio_3, + 'backbone.layer2.1.conv1_(0, 128)_128': stage_ratio_1, + 'backbone.layer2.1.conv2_(0, 128)_128': stage_ratio_2, + 'backbone.layer2.2.conv1_(0, 128)_128': stage_ratio_1, + 'backbone.layer2.2.conv2_(0, 128)_128': stage_ratio_2, + 'backbone.layer2.3.conv1_(0, 128)_128': stage_ratio_1, + 'backbone.layer2.3.conv2_(0, 128)_128': stage_ratio_2, + # block 2 [0.65, 0.6] downsample=[0.9] + 'backbone.layer3.0.conv1_(0, 256)_256': stage_ratio_1, + 'backbone.layer3.0.conv2_(0, 256)_256': stage_ratio_2, + 'backbone.layer3.0.conv3_(0, 1024)_1024': stage_ratio_3, + 'backbone.layer3.1.conv1_(0, 256)_256': stage_ratio_1, + 'backbone.layer3.1.conv2_(0, 256)_256': stage_ratio_2, + 'backbone.layer3.2.conv1_(0, 256)_256': stage_ratio_1, + 'backbone.layer3.2.conv2_(0, 256)_256': stage_ratio_2, + 'backbone.layer3.3.conv1_(0, 256)_256': stage_ratio_4, + 'backbone.layer3.3.conv2_(0, 256)_256': stage_ratio_4, + 'backbone.layer3.4.conv1_(0, 256)_256': stage_ratio_4, + 'backbone.layer3.4.conv2_(0, 256)_256': stage_ratio_4, + 'backbone.layer3.5.conv1_(0, 256)_256': stage_ratio_4, + 'backbone.layer3.5.conv2_(0, 256)_256': stage_ratio_4, + # block 3 [0.65, 0.6]*2+[0.7, 0.7]*2 downsample=[0.9] + 'backbone.layer4.0.conv1_(0, 512)_512': stage_ratio_4, + 'backbone.layer4.0.conv2_(0, 512)_512': stage_ratio_4, + 'backbone.layer4.0.conv3_(0, 2048)_2048': stage_ratio_3, + 'backbone.layer4.1.conv1_(0, 512)_512': stage_ratio_4, + 'backbone.layer4.1.conv2_(0, 512)_512': stage_ratio_4, + 'backbone.layer4.2.conv1_(0, 512)_512': stage_ratio_4, + 'backbone.layer4.2.conv2_(0, 512)_512': stage_ratio_4 + # block 4 [0.7, 0.7] downsample=[0.9] + } + + algorithm = DCFF( + MODEL_CFG, + target_pruning_ratio=target_pruning_ratio, + mutator_cfg=mutator_cfg, + step_freq=epoch_step).to(DEVICE) + + algorithm.init_weights() + self._set_epoch_ite(0, 0, epoch) + algorithm.forward(data['inputs'], data['data_samples'], mode='loss') + self.assertEqual(algorithm.step_freq, epoch_step * iter_per_epoch) + + fix_subnet, static_model = export_fix_subnet( + algorithm, export_subnet_mode='mutator', slice_weight=True) + fix_subnet = json.dumps(fix_subnet, indent=4, separators=(',', ':')) + subnet_name = 'subnet.json' + weight_name = 'subnet_weight.pth' + with open(osp.join('tests/data/test_registry/', subnet_name), + 'w') as file: + file.write(fix_subnet) + torch.save({ + 'state_dict': static_model.state_dict(), + 'meta': {} + }, osp.join('tests/data/test_registry/', weight_name)) diff --git a/tests/test_registry/test_registry.py b/tests/test_registry/test_registry.py index 9972ae2c2..64de464f2 100644 --- a/tests/test_registry/test_registry.py +++ b/tests/test_registry/test_registry.py @@ -4,6 +4,7 @@ from unittest import TestCase import torch.nn as nn +from mmengine import fileio from mmengine.config import Config from mmengine.model import BaseModel @@ -82,6 +83,24 @@ def test_build_razor_from_cfg(self): model = MODELS.build(cfg.model) self.assertTrue(isinstance(model, BaseModel)) + def test_build_subnet_prune_from_cfg(self): + mutator_cfg = fileio.load('tests/data/test_registry/subnet.json') + init_cfg = dict( + type='Pretrained', + checkpoint='tests/data/test_registry/subnet_weight.pth') + # test fix subnet + model_cfg = dict( + # use mmrazor's build_func + type='mmrazor.sub_model', + cfg=dict( + cfg_path='mmcls::resnet/resnet50_8xb32_in1k.py', + pretrained=False), + fix_subnet=mutator_cfg, + mode='mutator', + init_cfg=init_cfg) + model = MODELS.build(model_cfg) + self.assertTrue(isinstance(model, BaseModel)) + if __name__ == '__main__': unittest.main()