Skip to content

Commit f466830

Browse files
committed
fix(analyze): faithful group-sensitivity for structural pruning
SensitivityAnalyzer's pruning mode isolated each layer by ignoring every other compressible layer, then pruned the target. For residual/skip-coupled layers (ResNet stem conv, block conv2s, downsample) the coupling could not be satisfied — all the output-coupled partners were ignored — so torch-pruning pruned nothing. The layer reported Δ=0.0000 and was ranked 'Most Robust (compressible)', the most dangerous possible output: it recommended compressing exactly the layers that cascade-degrade a real prune. Now each layer is pruned with the exact per-layer target {name: level} that Pruner/PruneCallback use, so the reported Δ is a FAITHFUL predictor — verified to match a real prune to 1e-6 at every level (10/30/50%). Mechanics: - _build_dependency_groups: detect output-coupled sets (torch-pruning prune_out_channels handler) and tag coupled layers with a shared group_id; layers Pruner ignores (output Linear, attention qkv) get no group. - _apply_structural_pruning: prune {name: level} on a fresh copy (dict path), with a channel-signature no-op guard; never evaluates a half-pruned model. - LayerSensitivity gains group_id/group_members/prunable (additive; sparsity and quantization modes keep prior behaviour). - top()/summary() exclude not-prunable layers from the robust ranking and surface them separately; to_layer_targets() collapses each group to one knob so coupled layers aren't double-counted. - analyze() gains a layer_types filter (e.g. (nn.Conv2d,) to skip the classifier Linear), and internal Pruner construction is silenced so the analysis no longer spams 'Ignoring output layer / Using per-layer pruning' once per layer. Adds inline + #| slow ResNet-18 regression tests (coupled layers no longer Δ=0 robust; coupled members share group_id+delta; analysis Δ == real prune Δ).
1 parent eb5500f commit f466830

3 files changed

Lines changed: 1230 additions & 164 deletions

File tree

fasterai/_modidx.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
'fasterai/analyze/sensitivity.py'),
2020
'fasterai.analyze.sensitivity.SensitivityAnalyzer._apply_weight_quantization': ( 'analyze/sensitivity.html#sensitivityanalyzer._apply_weight_quantization',
2121
'fasterai/analyze/sensitivity.py'),
22+
'fasterai.analyze.sensitivity.SensitivityAnalyzer._build_dependency_groups': ( 'analyze/sensitivity.html#sensitivityanalyzer._build_dependency_groups',
23+
'fasterai/analyze/sensitivity.py'),
24+
'fasterai.analyze.sensitivity.SensitivityAnalyzer._channel_signature': ( 'analyze/sensitivity.html#sensitivityanalyzer._channel_signature',
25+
'fasterai/analyze/sensitivity.py'),
2226
'fasterai.analyze.sensitivity.SensitivityAnalyzer._cleanup_sparsifier': ( 'analyze/sensitivity.html#sensitivityanalyzer._cleanup_sparsifier',
2327
'fasterai/analyze/sensitivity.py'),
2428
'fasterai.analyze.sensitivity.SensitivityAnalyzer._clone_model': ( 'analyze/sensitivity.html#sensitivityanalyzer._clone_model',
@@ -33,10 +37,16 @@
3337
'fasterai/analyze/sensitivity.py'),
3438
'fasterai.analyze.sensitivity.SensitivityAnalyzer._fake_quantize_per_tensor': ( 'analyze/sensitivity.html#sensitivityanalyzer._fake_quantize_per_tensor',
3539
'fasterai/analyze/sensitivity.py'),
40+
'fasterai.analyze.sensitivity.SensitivityAnalyzer._fresh_copy': ( 'analyze/sensitivity.html#sensitivityanalyzer._fresh_copy',
41+
'fasterai/analyze/sensitivity.py'),
3642
'fasterai.analyze.sensitivity.SensitivityAnalyzer._get_compressible_layers': ( 'analyze/sensitivity.html#sensitivityanalyzer._get_compressible_layers',
3743
'fasterai/analyze/sensitivity.py'),
3844
'fasterai.analyze.sensitivity.SensitivityAnalyzer._init_sparsifier': ( 'analyze/sensitivity.html#sensitivityanalyzer._init_sparsifier',
3945
'fasterai/analyze/sensitivity.py'),
46+
'fasterai.analyze.sensitivity.SensitivityAnalyzer._out_dim': ( 'analyze/sensitivity.html#sensitivityanalyzer._out_dim',
47+
'fasterai/analyze/sensitivity.py'),
48+
'fasterai.analyze.sensitivity.SensitivityAnalyzer._quiet': ( 'analyze/sensitivity.html#sensitivityanalyzer._quiet',
49+
'fasterai/analyze/sensitivity.py'),
4050
'fasterai.analyze.sensitivity.SensitivityAnalyzer._remove_activation_hooks': ( 'analyze/sensitivity.html#sensitivityanalyzer._remove_activation_hooks',
4151
'fasterai/analyze/sensitivity.py'),
4252
'fasterai.analyze.sensitivity.SensitivityAnalyzer._restore_layer': ( 'analyze/sensitivity.html#sensitivityanalyzer._restore_layer',

0 commit comments

Comments
 (0)