mmrazor icon indicating copy to clipboard operation
mmrazor copied to clipboard

[Bug] Got "'NoneType' object has no attribute 'next_functions'" error in running autoslim

Open dercaft opened this issue 2 years ago • 1 comments

Describe the bug

I wanna train the supernet of autoslim from scratch. And I got bug informations: AttributeError: 'NoneType' object has no attribute 'next_functions'.

It seems like the recursion of conv_grad_fn.next_functions[0][0] do not perform as we expected.

To Reproduce

I run command in configs/pruning/autoslim/readme.md

python ./tools/mmcls/train_mmcls.py \
  configs/pruning/autoslim/autoslim_mbv2_supernet_8xb256_in1k.py \
  --work-dir <your_work_dir>

Post related information

I use the latest mmrazor-master repo.

  1. The output of pip list | grep "mmcv\|mm*\|^torch"
mmcls                  0.23.2
mmcv-full              1.6.0
mmdet                  2.25.1
mmsegmentation         0.28.0
torch                  1.12.1
torchvision            0.13.1
  1. Your train log file if you meet the problem during training.
Traceback (most recent call last):
  File "/root/miniconda3/envs/wyh_graduate/lib/python3.10/site-packages/mmcv/utils/registry.py", line 69, in build_from_cfg
    return obj_cls(**args)
  File "/root/compression/mmrazor/mmrazor/models/algorithms/autoslim.py", line 42, in __init__
    super(AutoSlim, self).__init__(**kwargs)
  File "/root/compression/mmrazor/mmrazor/models/algorithms/base.py", line 56, in __init__
    self._init_pruner(pruner)
  File "/root/compression/mmrazor/mmrazor/models/algorithms/autoslim.py", line 69, in _init_pruner
    pseudo_pruner.prepare_from_supernet(pseudo_architecture)
  File "/root/compression/mmrazor/mmrazor/models/pruners/ratio_pruning.py", line 49, in prepare_from_supernet
    super(RatioPruner, self).prepare_from_supernet(supernet)
  File "/root/compression/mmrazor/mmrazor/models/pruners/structure_pruning.py", line 185, in prepare_from_supernet
    self.trace_norm_conv_links(pseudo_loss.grad_fn, module2name,
  File "/root/compression/mmrazor/mmrazor/models/pruners/structure_pruning.py", line 741, in trace_norm_conv_links
    self.trace_norm_conv_links(parent, module2name,
  File "/root/compression/mmrazor/mmrazor/models/pruners/structure_pruning.py", line 741, in trace_norm_conv_links
    self.trace_norm_conv_links(parent, module2name,
  File "/root/compression/mmrazor/mmrazor/models/pruners/structure_pruning.py", line 741, in trace_norm_conv_links
    self.trace_norm_conv_links(parent, module2name,
  [Previous line repeated 4 more times]
  File "/root/compression/mmrazor/mmrazor/models/pruners/structure_pruning.py", line 710, in trace_norm_conv_links
    conv_grad_fn = conv_grad_fn.next_functions[0][0]
AttributeError: 'NoneType' object has no attribute 'next_functions'

Additional context

Add any other context about the problem here.

[here]

dercaft avatar Sep 16 '22 08:09 dercaft

Thanks for your issue, we will check it as soon.

humu789 avatar Sep 16 '22 09:09 humu789

Sorry for the inconvenience. Two new backward ops are added in torch 1.11 and 1.12. Please add the following two lines to https://github.com/open-mmlab/mmrazor/blob/master/mmrazor/models/pruners/structure_pruning.py#L750 and try again:

@register_parser(BACKWARD_PARSER_DICT, 'ConvolutionBackward')
@register_parser(BACKWARD_PARSER_DICT, 'SlowConv2DBackward')

If there is still a bug, please let me know. BTW, Branch dev-1.x is available now. The backward tracer is optimized in this branch.

HIT-cwh avatar Sep 21 '22 10:09 HIT-cwh

I did the same steps as him and still encountered the same problem after adding the following code.

@register_parser(BACKWARD_PARSER_DICT, 'ConvolutionBackward')
@register_parser(BACKWARD_PARSER_DICT, 'SlowConv2DBackward')

Here is my environment

mccabe                    0.7.0 
mmcls                     0.24.1  
mmcv-full                 1.5.0  
mmdet                     2.25.3 
mmrazor                   0.3.1  
mmsegmentation            0.29.1  
torch                     1.12.1+cu116        
torchvision               0.13.1+cu116  

My train log file

Traceback (most recent call last):
  File "C:\Users\lovea\anaconda3\envs\python3.9\lib\site-packages\mmcv\utils\registry.py", line 52, in build_from_cfg
    return obj_cls(**args)
  File "C:\Users\lovea\anaconda3\envs\python3.9\lib\site-packages\mmrazor\models\algorithms\autoslim.py", line 42, in __init__
    super(AutoSlim, self).__init__(**kwargs)
  File "C:\Users\lovea\anaconda3\envs\python3.9\lib\site-packages\mmrazor\models\algorithms\base.py", line 56, in __init__
    self._init_pruner(pruner)
  File "C:\Users\lovea\anaconda3\envs\python3.9\lib\site-packages\mmrazor\models\algorithms\autoslim.py", line 69, in _init_pruner
    pseudo_pruner.prepare_from_supernet(pseudo_architecture)
  File "C:\Users\lovea\anaconda3\envs\python3.9\lib\site-packages\mmrazor\models\pruners\ratio_pruning.py", line 49, in prepare_from_supernet
    super(RatioPruner, self).prepare_from_supernet(supernet)
  File "C:\Users\lovea\anaconda3\envs\python3.9\lib\site-packages\mmrazor\models\pruners\structure_pruning.py", line 184, in prepare_from_supernet
    self.trace_norm_conv_links(pseudo_loss.grad_fn, module2name,
  File "C:\Users\lovea\anaconda3\envs\python3.9\lib\site-packages\mmrazor\models\pruners\structure_pruning.py", line 730, in trace_norm_conv_links
    main()
  File "D:\code_remote\High performance computing\mmrazor\tools\mmcls\train_mmcls.py", line 173, in main
    algorithm = build_algorithm(cfg.algorithm)
  File "C:\Users\lovea\anaconda3\envs\python3.9\lib\site-packages\mmrazor\models\builder.py", line 20, in build_algorithm
    return ALGORITHMS.build(cfg)
  File "C:\Users\lovea\anaconda3\envs\python3.9\lib\site-packages\mmcv\utils\registry.py", line 215, in build
    return self.build_func(*args, **kwargs, registry=self)
  File "C:\Users\lovea\anaconda3\envs\python3.9\lib\site-packages\mmcv\cnn\builder.py", line 27, in build_model_from_cfg
    return build_from_cfg(cfg, registry, default_args)
  File "C:\Users\lovea\anaconda3\envs\python3.9\lib\site-packages\mmcv\utils\registry.py", line 55, in build_from_cfg
    raise type(e)(f'{obj_cls.__name__}: {e}')
AttributeError: AutoSlim: 'NoneType' object has no attribute 'next_functions'

usbser avatar Nov 20 '22 13:11 usbser

Under settings and versions in my question. I followed your reply, and added Back ward name to CONV. As the result, I solved this problem. Thanks for helping. Details are listed at the end.

Sorry for the inconvenience. Two new backward ops are added in torch 1.11 and 1.12. Please add the following two lines to https://github.com/open-mmlab/mmrazor/blob/master/mmrazor/models/pruners/structure_pruning.py#L750 and try again:

@register_parser(BACKWARD_PARSER_DICT, 'ConvolutionBackward')
@register_parser(BACKWARD_PARSER_DICT, 'SlowConv2DBackward')

If there is still a bug, please let me know. BTW, Branch dev-1.x is available now. The backward tracer is optimized in this branch.

**AFTER Added and changed: ** file: mmrazor/models/pruners/structure_pruning.py

# ... Line 21
CONV = ('ConvolutionBackward','SlowConv2DBackward','ThnnConv2DBackward', 'CudnnConvolutionBackward',
        'MkldnnConvolutionBackward','SlowConvDilated2DBackward')
# ... Line 748
    @register_parser(BACKWARD_PARSER_DICT, 'ConvolutionBackward')
    @register_parser(BACKWARD_PARSER_DICT, 'SlowConv2DBackward')
    @register_parser(BACKWARD_PARSER_DICT, 'ThnnConv2DBackward')
    @register_parser(BACKWARD_PARSER_DICT, 'CudnnConvolutionBackward')
    @register_parser(BACKWARD_PARSER_DICT, 'MkldnnConvolutionBackward')
    @register_parser(BACKWARD_PARSER_DICT, 'SlowConvDilated2DBackward')
    def conv_backward_parser(self, grad_fn, module2name, var2module, cur_path,
                             result_paths, visited):

dercaft avatar Feb 21 '23 05:02 dercaft