quic / aimet

AIMET is a library that provides advanced quantization and compression techniques for trained neural network models.
https://quic.github.io/aimet-pages/index.html
Other
2.12k stars 380 forks source link

Error when concatnating features in network #732

Closed Asahi678 closed 1 year ago

Asahi678 commented 3 years ago

Hi, recently I get some error when I use aimet to compress my model. I take several trials and I find two problems I can't fix.

  1. when I concatnate two features in network(this step isn't the first layer or last layer in network), the compressing code get error like below. I took some trials with and without using "torch.cat" and I am sure the error caused by this operation.

2021-09-06 21:03:10,541 - root - INFO - aimetpro-release-1.17.0_Build_Id_0.128.0.1175.torch-gpu-2 2021-09-06 21:03:14,028 - CompRatioSelect - INFO - Analyzing compression ratio: 0.1 =====================> Traceback (most recent call last): File "compress_demo.py", line 162, in main() File "compress_demo.py", line 149, in main compressed_model, stats = aimet_channel_pruning(model=net, evaluator=evaluate, data_loader=dataloader) File "compress_demo.py", line 82, in aimet_channel_pruning parameters=params) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_torch/compress.py", line 113, in compress_model compressed_layer_db, stats = algo.compress_model(cost_metric, trainer) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/compression_algo.py", line 87, in compress_model layer_comp_ratio_list, stats = self._comp_ratio_select_algo.select_per_layer_comp_ratios() File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/comp_ratio_select.py", line 222, in select_per_layer_comp_ratios eval_scores_dict = self._construct_eval_dict() File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/comp_ratio_select.py", line 213, in _construct_eval_dict eval_scores_dict = self._compute_eval_scores_for_all_comp_ratio_candidates() File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/comp_ratio_select.py", line 399, in _compute_eval_scores_for_all_comp_ratio_candidates progress_bar, layer) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/comp_ratio_select.py", line 428, in _compute_layerwise_eval_score_per_comp_ratio_candidate trainer=None) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_torch/channel_pruning/channel_pruner.py", line 251, in prune_model layer_comp_ratio_list, cost_metric, trainer) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/pruner.py", line 75, in prune_model self._prune_layer(layer_db, comp_layer_db, layer, comp_ratio, cost_metric) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_torch/channel_pruning/channel_pruner.py", line 218, in _prune_layer self._winnow_and_reconstruct_layer(orig_layer_db, comp_layer_db, layer, comp_ratio, True) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_torch/channel_pruning/channel_pruner.py", line 180, in _winnow_and_reconstruct_layer in_place=True) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_torch/winnow/winnow.py", line 70, in winnow_model in_place, verbose) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_torch/winnow/mask_propagation_winnower.py", line 101, in init self._mask_propagator = MaskPropagator(self._graph, ModelApi.pytorch) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/winnow/mask_propagator.py", line 77, in init self._create_masks() File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/winnow/mask_propagator.py", line 93, in _create_masks self._create_masks_for_op_and_all_ancestors(op) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/winnow/mask_propagator.py", line 118, in _create_masks_for_op_and_all_ancestors self._op_to_mask_dict[current_op] = Mask(current_op, self._model_api) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/winnow/mask.py", line 467, in init self._set_default_input_output_masks(self._num_in_channels, self._num_out_channels) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/winnow/mask.py", line 694, in _set_default_input_output_masks self._set_default_masks_for_conv_and_linear() File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/winnow/mask.py", line 605, in _set_default_masks_for_conv_and_linear self._internal_connectivity = NullInternalConnectivity(in_mask_length_list, out_mask_length_list) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/winnow/mask.py", line 165, in init assert len(input_mask_and_length_tuple) == len(output_mask_and_length_tuple) == 1 AssertionError

===================================================================

  1. In my trials, I also found error occured when the first layer in network is max_pooling. My network is just like U-net. I use multi-scale feature map to predict. When network input enter the first layer of max-pooling straightly. The error occured like below:

2021-09-06 21:17:55,422 - root - INFO - aimetpro-release-1.17.0_Build_Id_0.128.0.1175.torch-gpu-2 2021-09-06 21:17:58,049 - CompRatioSelect - INFO - Analyzing compression ratio: 0.1 =====================> Traceback (most recent call last): File "compress_demo.py", line 162, in main() File "compress_demo.py", line 149, in main compressed_model, stats = aimet_channel_pruning(model=net, evaluator=evaluate, data_loader=dataloader) File "compress_demo.py", line 82, in aimet_channel_pruning parameters=params) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_torch/compress.py", line 113, in compress_model compressed_layer_db, stats = algo.compress_model(cost_metric, trainer) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/compression_algo.py", line 87, in compress_model layer_comp_ratio_list, stats = self._comp_ratio_select_algo.select_per_layer_comp_ratios() File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/comp_ratio_select.py", line 222, in select_per_layer_comp_ratios eval_scores_dict = self._construct_eval_dict() File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/comp_ratio_select.py", line 213, in _construct_eval_dict eval_scores_dict = self._compute_eval_scores_for_all_comp_ratio_candidates() File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/comp_ratio_select.py", line 399, in _compute_eval_scores_for_all_comp_ratio_candidates progress_bar, layer) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/comp_ratio_select.py", line 428, in _compute_layerwise_eval_score_per_comp_ratio_candidate trainer=None) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_torch/channel_pruning/channel_pruner.py", line 251, in prune_model layer_comp_ratio_list, cost_metric, trainer) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/pruner.py", line 75, in prune_model self._prune_layer(layer_db, comp_layer_db, layer, comp_ratio, cost_metric) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_torch/channel_pruning/channel_pruner.py", line 218, in _prune_layer self._winnow_and_reconstruct_layer(orig_layer_db, comp_layer_db, layer, comp_ratio, True) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_torch/channel_pruning/channel_pruner.py", line 180, in _winnow_and_reconstruct_layer in_place=True) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_torch/winnow/winnow.py", line 71, in winnow_model new_model, ordered_modules_list = mask_winnower.propagate_masks_and_winnow() File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_torch/winnow/mask_propagation_winnower.py", line 110, in propagate_masks_and_winnow self._propagate_masks() File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_torch/winnow/mask_propagation_winnower.py", line 139, in _propagate_masks self._mask_propagator.propagate_masks() File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/winnow/mask_propagator.py", line 136, in propagate_masks self._propagate_intra_module_masks() File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/winnow/mask_propagator.py", line 156, in _propagate_intra_module_masks self._op_to_mask_dict[op].propagate_internal_connectivity_out_channels_to_in_channels() File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/winnow/mask.py", line 823, in propagate_internal_connectivity_out_channels_to_in_channels self._input_channel_masks) File "/home/ubuntu/anaconda3/envs/aimet/lib/python3.6/site-packages/aimet_common/winnow/mask.py", line 223, in backward_propagate_the_masks original_in_mask = input_mask_list[0] IndexError: list index out of range

=================================================================

I am so sorry the error info is so long and it's not easy to read. But I think complete info may help you to verify problems. I will also upload my demo network and compressing configure soon. Could you give me some advice and help me to solve these problems?

Asahi678 commented 3 years ago

` import torch import torch.nn as nn

class model(nn.Module): def init(self, in_channel, out_channel): super(model, self).init() self.conv1 = nn.Conv2d(in_channel, 32, 3, 1) self.conv2 = nn.Conv2d(32, 32, 3, 2) self.tmp_conv = nn.Conv2d(3, 3, 3, 1) self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2) self.maxpool_conv = nn.Conv2d(3, 32, 3, 1) self.cat_conv = nn.Conv2d(64, 32, 3, 1) self.out_conv = nn.Conv2d(32, out_channel, 3, 1)

def forward(self, x):
    out1 = self.conv1(x)
    out1 = self.conv2(out1)

    # out2 = self.tmp_conv(x)
    out2 = self.maxpool(x)
    out2 = self.maxpool_conv(out2)

    # out = torch.cat([out1, out1], dim=1)
    out = torch.cat([out1, out2], dim=1)
    out = self.cat_conv(out2)
    out = self.out_conv(out)

    return out

`

Asahi678 commented 3 years ago

2021-09-06 21-42-54屏幕截图

quic-ssiddego commented 3 years ago

@quic-sundarr could you please take a look at this.

xingmimfl commented 1 year ago

same problems.

quic-mangal commented 1 year ago

Closing this issue due to inactivity. Please re-open it/ create a new issue if you need further help.