[Fix]Dcff Deploy Revision (#383)

* dcff deploy revision

* tempsave

* update fix_subnet

* update mutator load

* export/load_fix_subnet revision for mutator

* update fix_subnet with dev-1.x

* update comments

* update docs

* update registry
pull/402/head
zengyi 2022-12-16 20:53:30 +08:00 committed by GitHub
parent 42e8de73af
commit 82e9549dff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
27 changed files with 1057 additions and 2118 deletions

View File

@ -1,5 +1,13 @@
_base_ = ['dcff_resnet_8xb32_in1k.py'] _base_ = ['dcff_resnet_8xb32_in1k.py']
# model settings # model settings
model = _base_.model model_cfg = dict(
model['is_deployed'] = True _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'))

View File

@ -76,7 +76,10 @@ model = dict(
type='ChannelAnalyzer', type='ChannelAnalyzer',
demo_input=(1, 3, 224, 224), demo_input=(1, 3, 224, 224),
tracer_type='BackwardTracer')), tracer_type='BackwardTracer')),
fix_subnet=None,
data_preprocessor=None,
target_pruning_ratio=target_pruning_ratio, target_pruning_ratio=target_pruning_ratio,
step_freq=1, step_freq=1,
linear_schedule=False, linear_schedule=False)
is_deployed=False)
val_cfg = dict(_delete_=True, type='mmrazor.ItePruneValLoop')

View File

@ -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"
}
}

View File

@ -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
}
}

View File

@ -1,5 +1,12 @@
_base_ = ['dcff_faster_rcnn_resnet50_8xb4_coco.py'] _base_ = ['dcff_faster_rcnn_resnet50_8xb4_coco.py']
# model settings # model settings
model = _base_.model model_cfg = dict(
model['is_deployed'] = True _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'))

View File

@ -65,10 +65,6 @@ param_scheduler = dict(
_delete_=True) _delete_=True)
train_cfg = dict(max_epochs=120, val_interval=1) train_cfg = dict(max_epochs=120, val_interval=1)
# !dataset config
# ==========================================================================
# data preprocessor
model = dict( model = dict(
_scope_='mmrazor', _scope_='mmrazor',
type='DCFF', type='DCFF',
@ -76,18 +72,16 @@ model = dict(
mutator_cfg=dict( mutator_cfg=dict(
type='DCFFChannelMutator', type='DCFFChannelMutator',
channel_unit_cfg=dict( channel_unit_cfg=dict(
type='DCFFChannelUnit', type='DCFFChannelUnit', default_args=dict(choice_mode='ratio')),
units='configs/pruning/mmdet/dcff/resnet_det.json'),
parse_cfg=dict( parse_cfg=dict(
type='ChannelAnalyzer', type='ChannelAnalyzer',
demo_input=(1, 3, 224, 224), demo_input=(1, 3, 224, 224),
tracer_type='BackwardTracer')), tracer_type='BackwardTracer')),
target_pruning_ratio=target_pruning_ratio, target_pruning_ratio=target_pruning_ratio,
step_freq=1, step_freq=1,
linear_schedule=False, linear_schedule=False)
is_deployed=False)
model_wrapper = dict( model_wrapper = dict(
type='mmcv.MMDistributedDataParallel', find_unused_parameters=True) type='mmcv.MMDistributedDataParallel', find_unused_parameters=True)
val_cfg = dict(_delete_=True) val_cfg = dict(_delete_=True, type='mmrazor.ItePruneValLoop')

View File

@ -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"
}
}

View File

@ -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
}
}

View File

@ -1,5 +1,12 @@
_base_ = ['dcff_topdown_heatmap_resnet50_coco.py'] _base_ = ['dcff_topdown_heatmap_resnet50_coco.py']
# model settings # model settings
model = _base_.model model_cfg = dict(
model['is_deployed'] = True _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'))

View File

@ -108,25 +108,22 @@ target_pruning_ratio = {
model = dict( model = dict(
_scope_='mmrazor', _scope_='mmrazor',
type='DCFF', type='DCFF',
architecture=dict( architecture=architecture,
cfg_path='mmcls::resnet/resnet50_8xb32_in1k.py', pretrained=False),
mutator_cfg=dict( mutator_cfg=dict(
type='DCFFChannelMutator', type='DCFFChannelMutator',
channel_unit_cfg=dict( channel_unit_cfg=dict(
type='DCFFChannelUnit', type='DCFFChannelUnit', default_args=dict(choice_mode='ratio')),
units='configs/pruning/mmpose/dcff/resnet_pose.json'),
parse_cfg=dict( parse_cfg=dict(
type='ChannelAnalyzer', type='ChannelAnalyzer',
demo_input=(1, 3, 224, 224), demo_input=(1, 3, 224, 224),
tracer_type='BackwardTracer')), tracer_type='BackwardTracer')),
target_pruning_ratio=target_pruning_ratio, target_pruning_ratio=target_pruning_ratio,
step_freq=1, step_freq=1,
linear_schedule=False, linear_schedule=False)
is_deployed=False)
dataset_type = 'CocoDataset' dataset_type = 'CocoDataset'
data_mode = 'topdown' data_mode = 'topdown'
data_root = 'data/coco' data_root = 'data/coco/'
file_client_args = dict(backend='disk') file_client_args = dict(backend='disk')
@ -187,3 +184,5 @@ val_evaluator = dict(
type='mmpose.CocoMetric', type='mmpose.CocoMetric',
ann_file=data_root + 'annotations/person_keypoints_val2017.json') ann_file=data_root + 'annotations/person_keypoints_val2017.json')
test_evaluator = val_evaluator test_evaluator = val_evaluator
val_cfg = dict(_delete_=True, type='mmrazor.ItePruneValLoop')

View File

@ -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"
}
}

View File

@ -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
}
}

View File

@ -1,5 +1,12 @@
_base_ = ['dcff_pointrend_resnet50_8xb2_cityscapes.py'] _base_ = ['dcff_pointrend_resnet50_8xb2_cityscapes.py']
# model settings # model settings
model = _base_.model model_cfg = dict(
model['is_deployed'] = True _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'))

View File

@ -80,21 +80,20 @@ target_pruning_ratio = {
model = dict( model = dict(
_scope_='mmrazor', _scope_='mmrazor',
type='DCFF', type='DCFF',
architecture=dict( architecture=_base_.architecture,
cfg_path='mmcls::resnet/resnet50_8xb32_in1k.py', pretrained=False),
mutator_cfg=dict( mutator_cfg=dict(
type='DCFFChannelMutator', type='DCFFChannelMutator',
channel_unit_cfg=dict( channel_unit_cfg=dict(
type='DCFFChannelUnit', type='DCFFChannelUnit', default_args=dict(choice_mode='ratio')),
units='configs/pruning/mmseg/dcff/resnet_seg.json'),
parse_cfg=dict( parse_cfg=dict(
type='ChannelAnalyzer', type='ChannelAnalyzer',
demo_input=(1, 3, 224, 224), demo_input=(1, 3, 224, 224),
tracer_type='BackwardTracer')), tracer_type='BackwardTracer')),
target_pruning_ratio=target_pruning_ratio, target_pruning_ratio=target_pruning_ratio,
step_freq=200, step_freq=200,
linear_schedule=False, linear_schedule=False)
is_deployed=False)
model_wrapper = dict( model_wrapper = dict(
type='mmcv.MMDistributedDataParallel', find_unused_parameters=True) type='mmcv.MMDistributedDataParallel', find_unused_parameters=True)
val_cfg = dict(_delete_=True, type='mmrazor.ItePruneValLoop')

View File

@ -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"
}
}

View File

@ -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
}
}

View File

@ -2,6 +2,7 @@
from .darts_loop import DartsEpochBasedTrainLoop, DartsIterBasedTrainLoop from .darts_loop import DartsEpochBasedTrainLoop, DartsIterBasedTrainLoop
from .distill_val_loop import SelfDistillValLoop, SingleTeacherDistillValLoop from .distill_val_loop import SelfDistillValLoop, SingleTeacherDistillValLoop
from .evolution_search_loop import EvolutionSearchLoop from .evolution_search_loop import EvolutionSearchLoop
from .iteprune_val_loop import ItePruneValLoop
from .slimmable_val_loop import SlimmableValLoop from .slimmable_val_loop import SlimmableValLoop
from .subnet_sampler_loop import GreedySamplerTrainLoop from .subnet_sampler_loop import GreedySamplerTrainLoop
from .subnet_val_loop import SubnetValLoop from .subnet_val_loop import SubnetValLoop
@ -9,5 +10,6 @@ from .subnet_val_loop import SubnetValLoop
__all__ = [ __all__ = [
'SingleTeacherDistillValLoop', 'DartsEpochBasedTrainLoop', 'SingleTeacherDistillValLoop', 'DartsEpochBasedTrainLoop',
'DartsIterBasedTrainLoop', 'SlimmableValLoop', 'EvolutionSearchLoop', 'DartsIterBasedTrainLoop', 'SlimmableValLoop', 'EvolutionSearchLoop',
'GreedySamplerTrainLoop', 'SubnetValLoop', 'SelfDistillValLoop' 'GreedySamplerTrainLoop', 'SubnetValLoop', 'SelfDistillValLoop',
'ItePruneValLoop'
] ]

View File

@ -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}.')

View File

@ -8,10 +8,9 @@ from mmengine import MMLogger
from mmengine.model import BaseModel from mmengine.model import BaseModel
from mmengine.structures import BaseDataElement from mmengine.structures import BaseDataElement
from mmrazor.models.mutables import BaseMutable
from mmrazor.models.mutators import DCFFChannelMutator from mmrazor.models.mutators import DCFFChannelMutator
from mmrazor.registry import MODELS 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 from .ite_prune_algorithm import ItePruneAlgorithm, ItePruneConfigManager
LossResults = Dict[str, torch.Tensor] LossResults = Dict[str, torch.Tensor]
@ -30,8 +29,8 @@ class DCFF(ItePruneAlgorithm):
Args: Args:
architecture (Union[BaseModel, Dict]): The model to be pruned. architecture (Union[BaseModel, Dict]): The model to be pruned.
mutator_cfg (Union[Dict, ChannelMutator], optional): The config mutator_cfg (Union[Dict, ChannelMutator], optional): The config
of a mutator. Defaults to dict( type='ChannelMutator', of a mutator. Defaults to dict( type='DCFFChannelMutator',
channel_unit_cfg=dict( type='SequentialMutableChannelUnit')). channel_unit_cfg=dict( type='DCFFChannelUnit')).
data_preprocessor (Optional[Union[Dict, nn.Module]], optional): data_preprocessor (Optional[Union[Dict, nn.Module]], optional):
Defaults to None. Defaults to None.
target_pruning_ratio (dict, optional): The prune-target. The template target_pruning_ratio (dict, optional): The prune-target. The template
@ -47,8 +46,6 @@ class DCFF(ItePruneAlgorithm):
Defaults to None. Defaults to None.
linear_schedule (bool, optional): flag to set linear ratio schedule. linear_schedule (bool, optional): flag to set linear ratio schedule.
Defaults to False due to dcff fixed pruning rate. Defaults to False due to dcff fixed pruning rate.
is_deployed (bool, optional): flag to set deployed algorithm.
Defaults to False.
""" """
def __init__(self, def __init__(self,
@ -56,35 +53,17 @@ class DCFF(ItePruneAlgorithm):
mutator_cfg: Union[Dict, DCFFChannelMutator] = dict( mutator_cfg: Union[Dict, DCFFChannelMutator] = dict(
type=' DCFFChannelMutator', type=' DCFFChannelMutator',
channel_unit_cfg=dict(type='DCFFChannelUnit')), channel_unit_cfg=dict(type='DCFFChannelUnit')),
fix_subnet: Optional[ValidFixMutable] = None,
data_preprocessor: Optional[Union[Dict, nn.Module]] = None, data_preprocessor: Optional[Union[Dict, nn.Module]] = None,
target_pruning_ratio: Optional[Dict[str, float]] = None, target_pruning_ratio: Optional[Dict[str, float]] = None,
step_freq=1, step_freq=1,
prune_times=0, prune_times=0,
init_cfg: Optional[Dict] = None, init_cfg: Optional[Dict] = None,
linear_schedule=False, linear_schedule=False) -> None:
is_deployed=False) -> None:
# invalid param prune_times, reset after message_hub get [max_epoch] # invalid param prune_times, reset after message_hub get [max_epoch]
super().__init__(architecture, mutator_cfg, data_preprocessor, super().__init__(architecture, mutator_cfg, fix_subnet,
target_pruning_ratio, step_freq, prune_times, data_preprocessor, target_pruning_ratio, step_freq,
init_cfg, linear_schedule) 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
def _calc_temperature(self, cur_num: int, max_num: int): def _calc_temperature(self, cur_num: int, max_num: int):
"""Calculate temperature param.""" """Calculate temperature param."""

View File

@ -10,6 +10,7 @@ from mmengine.structures import BaseDataElement
from mmrazor.models.mutables import MutableChannelUnit from mmrazor.models.mutables import MutableChannelUnit
from mmrazor.models.mutators import ChannelMutator from mmrazor.models.mutators import ChannelMutator
from mmrazor.registry import MODELS from mmrazor.registry import MODELS
from mmrazor.utils import ValidFixMutable
from ..base import BaseAlgorithm from ..base import BaseAlgorithm
LossResults = Dict[str, torch.Tensor] LossResults = Dict[str, torch.Tensor]
@ -97,6 +98,8 @@ class ItePruneAlgorithm(BaseAlgorithm):
mutator_cfg (Union[Dict, ChannelMutator], optional): The config mutator_cfg (Union[Dict, ChannelMutator], optional): The config
of a mutator. Defaults to dict( type='ChannelMutator', of a mutator. Defaults to dict( type='ChannelMutator',
channel_unit_cfg=dict( type='SequentialMutableChannelUnit')). 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): data_preprocessor (Optional[Union[Dict, nn.Module]], optional):
Defaults to None. Defaults to None.
target_pruning_ratio (dict, optional): The prune-target. The template target_pruning_ratio (dict, optional): The prune-target. The template
@ -118,10 +121,11 @@ class ItePruneAlgorithm(BaseAlgorithm):
type='ChannelMutator', type='ChannelMutator',
channel_unit_cfg=dict( channel_unit_cfg=dict(
type='SequentialMutableChannelUnit')), type='SequentialMutableChannelUnit')),
fix_subnet: Optional[ValidFixMutable] = None,
data_preprocessor: Optional[Union[Dict, nn.Module]] = None, data_preprocessor: Optional[Union[Dict, nn.Module]] = None,
target_pruning_ratio: Optional[Dict[str, float]] = None, target_pruning_ratio: Optional[Dict[str, float]] = None,
step_freq=-1, step_freq=1,
prune_times=-1, prune_times=1,
init_cfg: Optional[Dict] = None, init_cfg: Optional[Dict] = None,
linear_schedule=True) -> None: linear_schedule=True) -> None:
@ -133,7 +137,6 @@ class ItePruneAlgorithm(BaseAlgorithm):
self.prune_times = prune_times self.prune_times = prune_times
self.linear_schedule = linear_schedule self.linear_schedule = linear_schedule
# mutator
self.mutator: ChannelMutator = MODELS.build(mutator_cfg) self.mutator: ChannelMutator = MODELS.build(mutator_cfg)
self.mutator.prepare_from_supernet(self.architecture) self.mutator.prepare_from_supernet(self.architecture)

View File

@ -50,7 +50,7 @@ class SearchableShuffleNetV2(BaseBackbone):
6 initializers, including ``Constant``, ``Xavier``, ``Normal``, 6 initializers, including ``Constant``, ``Xavier``, ``Normal``,
``Uniform``, ``Kaiming``, and ``Pretrained``. ``Uniform``, ``Kaiming``, and ``Pretrained``.
Excamples: Examples:
>>> mutable_cfg = dict( >>> mutable_cfg = dict(
... type='OneShotMutableOP', ... type='OneShotMutableOP',
... candidates=dict( ... candidates=dict(

View File

@ -41,6 +41,16 @@ class MutableChannelUnit(ChannelUnit):
super().__init__(num_channels) 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 @classmethod
def init_from_mutable_channel(cls, mutable_channel: BaseMutableChannel): def init_from_mutable_channel(cls, mutable_channel: BaseMutableChannel):
unit = cls(mutable_channel.num_channels) unit = cls(mutable_channel.num_channels)

View File

@ -5,7 +5,7 @@ Each node is a child of the root registry in MMEngine.
More details can be found at More details can be found at
https://mmengine.readthedocs.io/en/latest/tutorials/registry.html. 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.config import Config, ConfigDict
from mmengine.registry import DATA_SAMPLERS as MMENGINE_DATA_SAMPLERS from mmengine.registry import DATA_SAMPLERS as MMENGINE_DATA_SAMPLERS
@ -107,10 +107,32 @@ VISBACKENDS = Registry('vis_backend', parent=MMENGINE_VISBACKENDS)
# manage sub models for downstream repos # manage sub models for downstream repos
@MODELS.register_module() @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) 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 from mmrazor.structures import load_fix_subnet
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 return model

View File

@ -3,8 +3,10 @@ import copy
from typing import Dict, Optional, Tuple from typing import Dict, Optional, Tuple
from mmengine import fileio from mmengine import fileio
from mmengine.logging import print_log
from torch import nn from torch import nn
from mmrazor.registry import MODELS
from mmrazor.utils import FixMutable, ValidFixMutable from mmrazor.utils import FixMutable, ValidFixMutable
from mmrazor.utils.typing import DumpChosen from mmrazor.utils.typing import DumpChosen
@ -29,6 +31,7 @@ def _dynamic_to_static(model: nn.Module) -> None:
def load_fix_subnet(model: nn.Module, def load_fix_subnet(model: nn.Module,
fix_mutable: ValidFixMutable, fix_mutable: ValidFixMutable,
load_subnet_mode: str = 'mutable',
prefix: str = '', prefix: str = '',
extra_prefix: str = '') -> None: extra_prefix: str = '') -> None:
"""Load fix subnet.""" """Load fix subnet."""
@ -45,6 +48,22 @@ def load_fix_subnet(model: nn.Module,
if isinstance(model, DynamicMixin): if isinstance(model, DynamicMixin):
raise RuntimeError('Root model can not be dynamic op.') 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 # Avoid circular import
from mmrazor.models.mutables import DerivedMutable, MutableChannelContainer from mmrazor.models.mutables import DerivedMutable, MutableChannelContainer
from mmrazor.models.mutables.base_mutable import BaseMutable from mmrazor.models.mutables.base_mutable import BaseMutable
@ -92,19 +111,62 @@ def load_fix_subnet(model: nn.Module,
else: else:
load_fix_module(module) 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( def export_fix_subnet(
model: nn.Module, model: nn.Module,
export_subnet_mode: str = 'mutable',
slice_weight: bool = False) -> Tuple[FixMutable, Optional[Dict]]: 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: Args:
slice_weight (bool): Whether to return the sliced subnet. model (nn.Module): The target model to export.
Defaults to False. 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 # Avoid circular import
from mmrazor.models.mutables import DerivedMutable, MutableChannelContainer from mmrazor.models.mutables import DerivedMutable, MutableChannelContainer
from mmrazor.models.mutables.base_mutable import BaseMutable from mmrazor.models.mutables.base_mutable import BaseMutable
@ -125,14 +187,14 @@ def export_fix_subnet(
module_dump_chosen(source_mutable, fix_subnet) module_dump_chosen(source_mutable, fix_subnet)
else: else:
module_dump_chosen(module, fix_subnet) 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: def _export_subnet_by_mutator(model: nn.Module) -> Dict:
copied_model.cuda() 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, copied_model return fix_subnet
return fix_subnet, None

View File

@ -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"
}
}

View File

@ -1,6 +1,8 @@
# Copyright (c) OpenMMLab. All rights reserved. # Copyright (c) OpenMMLab. All rights reserved.
import copy import copy
import json
import os import os
import os.path as osp
import unittest import unittest
import torch import torch
@ -12,6 +14,7 @@ from mmrazor.models.algorithms.pruning.dcff import DCFF
from mmrazor.models.algorithms.pruning.ite_prune_algorithm import \ from mmrazor.models.algorithms.pruning.ite_prune_algorithm import \
ItePruneConfigManager ItePruneConfigManager
from mmrazor.registry import MODELS from mmrazor.registry import MODELS
from mmrazor.structures import export_fix_subnet
# @TASK_UTILS.register_module() # @TASK_UTILS.register_module()
@ -229,3 +232,94 @@ class TestDCFFAlgorithm(unittest.TestCase):
algorithm.forward( algorithm.forward(
data['inputs'], data['data_samples'], mode='loss') data['inputs'], data['data_samples'], mode='loss')
self.assertEqual(algorithm.step_freq, epoch_step * iter_per_epoch) 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))

View File

@ -4,6 +4,7 @@ from typing import Dict, Optional, Union
from unittest import TestCase from unittest import TestCase
import torch.nn as nn import torch.nn as nn
from mmengine import fileio
from mmengine.config import Config from mmengine.config import Config
from mmengine.model import BaseModel from mmengine.model import BaseModel
@ -82,6 +83,24 @@ class TestRegistry(TestCase):
model = MODELS.build(cfg.model) model = MODELS.build(cfg.model)
self.assertTrue(isinstance(model, BaseModel)) 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__': if __name__ == '__main__':
unittest.main() unittest.main()