Skip to content

the problems of torch-pruning on yolov12n:MemoryError #525

@muzili-pengyang

Description

@muzili-pengyang

pruning on yolov12,have this problem:

Traceback (most recent call last):
File "E:\code\Python\big thesis\yolov12-main\ultralytics\yolov12_pruning.py", line 418, in
prune(args)
File "E:\code\Python\big thesis\yolov12-main\ultralytics\yolov12_pruning.py", line 346, in prune
pruner = tp.pruner.BNScalePruner(
^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\anaconda3\envs\yolov12\Lib\site-packages\torch_pruning\pruner\algorithms\batchnorm_scale_pruner.py", line 85, in init
super(BNScalePruner, self).init(
File "D:\anaconda3\envs\yolov12\Lib\site-packages\torch_pruning\pruner\algorithms\base_pruner.py", line 253, in init
for group in self.DG.get_all_groups(ignored_layers=self.ignored_layers, root_module_types=self.root_module_types):
File "D:\anaconda3\envs\yolov12\Lib\site-packages\torch_pruning\dependency\graph.py", line 314, in get_all_groups
group = self.get_pruning_group(
^^^^^^^^^^^^^^^^^^^^^^^
File "D:\anaconda3\envs\yolov12\Lib\site-packages\torch_pruning\dependency\graph.py", line 251, in get_pruning_group
_fix_dependency_graph_non_recursive(*group[0])
File "D:\anaconda3\envs\yolov12\Lib\site-packages\torch_pruning\dependency\graph.py", line 236, in _fix_dependency_graph_non_recursive
new_indices = mapping(new_indices)
^^^^^^^^^^^^^^^^^^^^
File "D:\anaconda3\envs\yolov12\Lib\site-packages\torch_pruning\dependency\index_mapping.py", line 37, in call
new_idxs.append( _helpers._HybridIndex( idx = (i.idx // self._stride), root_idx=i.root_idx ) )
MemoryError

I have tried to change code,like this:
for i in range(args.iterative_steps):

    model.model.train()
    for name, param in model.model.named_parameters():
        param.requires_grad = True

    ignored_layers = []
    unwrapped_parameters = []
    # for m in model.model.modules():
    #     if isinstance(m, (Detect,)):
    #         ignored_layers.append(m)
    for m in model.model.modules():
        if isinstance(m, (Detect, C2f, SPPF)):
            ignored_layers.append(m)

    example_inputs = example_inputs.to(model.device)
    # pruner = tp.pruner.GroupNormPruner(
    #     model.model,
    #     example_inputs,
    #     importance=tp.importance.GroupMagnitudeImportance(),  # L2 norm pruning,
    #     iterative_steps=1,
    #     pruning_ratio=pruning_ratio,
    #     ignored_layers=ignored_layers,
    #     unwrapped_parameters=unwrapped_parameters
    # )

    # 1. 建议明确指定 root_module_types,避免剪枝器尝试分析不必要的层
    # 2. importance 建议使用 MagnitudeImportance,这是基于 BN 层 gamma 值剪枝的标准做法
    pruner = tp.pruner.BNScalePruner(
        model.model,  # 【修改点1】建议保持使用 model.model (即 nn.Module 对象)
        example_inputs,
        ignored_layers=ignored_layers,
        importance=tp.importance.MagnitudeImportance(p=2),  # 【修改点2】替换 GroupMagnitudeImportance
        pruning_ratio=0.5,
        root_module_types=[nn.Conv2d]  # 【建议新增】只针对卷积层进行修剪
    )

but it is still in trouble,can you help me?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions