mmrazor
mmrazor copied to clipboard
[Bug] Got "'NoneType' object has no attribute 'next_functions'" error in running autoslim
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.
- 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
- 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]
Thanks for your issue, we will check it as soon.
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.
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'
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):