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.
- 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
===================================================================
- 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?
`
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
`