Skip to content

Commit

Permalink
Not quantize AdaptiveMaxPool (openvinotoolkit#2284)
Browse files Browse the repository at this point in the history
### Changes

According to
https://docs.openvino.ai/2023.1/openvino_docs_OV_UG_lpt.html
Placement FQ nodes like in OV backend.


### Related tickets

124839
  • Loading branch information
AlexanderDokuchaev committed Nov 28, 2023
1 parent 08cd0f7 commit cb7f3c1
Show file tree
Hide file tree
Showing 10 changed files with 181 additions and 3 deletions.
2 changes: 2 additions & 0 deletions nncf/experimental/torch/pruning/operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from nncf.experimental.common.pruning.operations import SplitPruningOp
from nncf.experimental.common.pruning.operations import StopMaskForwardPruningOp
from nncf.experimental.common.pruning.operations import TransposePruningOp
from nncf.torch.graph.operator_metatypes import PTAdaptiveMaxPool2dMetatype
from nncf.torch.graph.operator_metatypes import PTAddMetatype
from nncf.torch.graph.operator_metatypes import PTAvgPool2dMetatype
from nncf.torch.graph.operator_metatypes import PTBatchNormMetatype
Expand Down Expand Up @@ -92,6 +93,7 @@ class PTIdentityMaskForwardPruningOp(IdentityMaskForwardPruningOp):
PTSigmoidMetatype,
PTSoftmaxMetatype,
PTAvgPool2dMetatype,
PTAdaptiveMaxPool2dMetatype,
PTMaxPool2dMetatype,
PTMeanMetatype,
PTDropoutMetatype,
Expand Down
23 changes: 20 additions & 3 deletions nncf/torch/graph/operator_metatypes.py
Original file line number Diff line number Diff line change
Expand Up @@ -565,23 +565,40 @@ class PTAvgPool3dMetatype(PTOperatorMetatype):
hw_config_names = [HWConfigOpName.AVGPOOL]


class PTAdaptiveMaxPool1dMetatype(PTOperatorMetatype):
name = "AdaptiveMaxPool1DOp"
module_to_function_names = {NamespaceTarget.TORCH_NN_FUNCTIONAL: ["adaptive_max_pool1d"]}


@PT_OPERATOR_METATYPES.register()
class PTAdaptiveMaxPool2dMetatype(PTOperatorMetatype):
name = "AdaptiveMaxPool2DOp"
module_to_function_names = {NamespaceTarget.TORCH_NN_FUNCTIONAL: ["adaptive_max_pool2d"]}


@PT_OPERATOR_METATYPES.register()
class PTAdaptiveMaxPool3dMetatype(PTOperatorMetatype):
name = "AdaptiveMaxPool3DOp"
module_to_function_names = {NamespaceTarget.TORCH_NN_FUNCTIONAL: ["adaptive_max_pool3d"]}


class PTMaxPool1dMetatype(PTOperatorMetatype):
name = "MaxPool1DOp"
module_to_function_names = {NamespaceTarget.TORCH_NN_FUNCTIONAL: ["max_pool1d", "adaptive_max_pool1d"]}
module_to_function_names = {NamespaceTarget.TORCH_NN_FUNCTIONAL: ["max_pool1d"]}
hw_config_names = [HWConfigOpName.MAXPOOL]


@PT_OPERATOR_METATYPES.register()
class PTMaxPool2dMetatype(PTOperatorMetatype):
name = "MaxPool2DOp"
module_to_function_names = {NamespaceTarget.TORCH_NN_FUNCTIONAL: ["max_pool2d", "adaptive_max_pool2d"]}
module_to_function_names = {NamespaceTarget.TORCH_NN_FUNCTIONAL: ["max_pool2d"]}
hw_config_names = [HWConfigOpName.MAXPOOL]


@PT_OPERATOR_METATYPES.register()
class PTMaxPool3dMetatype(PTOperatorMetatype):
name = "MaxPool3DOp"
module_to_function_names = {NamespaceTarget.TORCH_NN_FUNCTIONAL: ["max_pool3d", "adaptive_max_pool3d"]}
module_to_function_names = {NamespaceTarget.TORCH_NN_FUNCTIONAL: ["max_pool3d"]}
hw_config_names = [HWConfigOpName.MAXPOOL]


Expand Down
4 changes: 4 additions & 0 deletions nncf/torch/pruning/operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@
from nncf.common.pruning.utils import PruningOperationsMetatypeRegistry
from nncf.common.pruning.utils import get_input_masks
from nncf.common.pruning.utils import is_prunable_depthwise_conv
from nncf.torch.graph.operator_metatypes import PTAdaptiveMaxPool2dMetatype
from nncf.torch.graph.operator_metatypes import PTAdaptiveMaxPool3dMetatype
from nncf.torch.graph.operator_metatypes import PTAddMetatype
from nncf.torch.graph.operator_metatypes import PTAvgPool2dMetatype
from nncf.torch.graph.operator_metatypes import PTAvgPool3dMetatype
Expand Down Expand Up @@ -167,8 +169,10 @@ class PTIdentityMaskForwardPruningOp(IdentityMaskForwardPruningOp, PTPruner):
PTGELUMetatype,
PTSigmoidMetatype,
PTSoftmaxMetatype,
PTAdaptiveMaxPool2dMetatype,
PTAvgPool2dMetatype,
PTMaxPool2dMetatype,
PTAdaptiveMaxPool3dMetatype,
PTAvgPool3dMetatype,
PTMaxPool3dMetatype,
PTMeanMetatype,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
strict digraph {
"0 /nncf_model_input_0" [id=0, type=nncf_model_input];
"1 SymmetricQuantizer/symmetric_quantize_0" [id=1, type=symmetric_quantize];
"2 TestModel/NNCFConv1d[_conv1]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" [id=2, type=symmetric_quantize];
"3 TestModel/NNCFConv1d[_conv1]/conv1d_0" [id=3, type=conv1d];
"4 TestModel/AdaptiveMaxPool1d[_layer]/adaptive_max_pool1d_0" [id=4, type=adaptive_max_pool1d];
"5 TestModel/AdaptiveMaxPool1d[_layer]/SymmetricQuantizer/symmetric_quantize_0" [id=5, type=symmetric_quantize];
"6 TestModel/NNCFConv1d[_conv2]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" [id=6, type=symmetric_quantize];
"7 TestModel/NNCFConv1d[_conv2]/conv1d_0" [id=7, type=conv1d];
"8 /nncf_model_output_0" [id=8, type=nncf_model_output];
"0 /nncf_model_input_0" -> "1 SymmetricQuantizer/symmetric_quantize_0";
"1 SymmetricQuantizer/symmetric_quantize_0" -> "3 TestModel/NNCFConv1d[_conv1]/conv1d_0";
"2 TestModel/NNCFConv1d[_conv1]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" -> "3 TestModel/NNCFConv1d[_conv1]/conv1d_0";
"3 TestModel/NNCFConv1d[_conv1]/conv1d_0" -> "4 TestModel/AdaptiveMaxPool1d[_layer]/adaptive_max_pool1d_0";
"4 TestModel/AdaptiveMaxPool1d[_layer]/adaptive_max_pool1d_0" -> "5 TestModel/AdaptiveMaxPool1d[_layer]/SymmetricQuantizer/symmetric_quantize_0";
"5 TestModel/AdaptiveMaxPool1d[_layer]/SymmetricQuantizer/symmetric_quantize_0" -> "7 TestModel/NNCFConv1d[_conv2]/conv1d_0";
"6 TestModel/NNCFConv1d[_conv2]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" -> "7 TestModel/NNCFConv1d[_conv2]/conv1d_0";
"7 TestModel/NNCFConv1d[_conv2]/conv1d_0" -> "8 /nncf_model_output_0";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
strict digraph {
"0 /nncf_model_input_0" [id=0, type=nncf_model_input];
"1 SymmetricQuantizer/symmetric_quantize_0" [id=1, type=symmetric_quantize];
"2 TestModel/NNCFConv2d[_conv1]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" [id=2, type=symmetric_quantize];
"3 TestModel/NNCFConv2d[_conv1]/conv2d_0" [id=3, type=conv2d];
"4 TestModel/AdaptiveMaxPool2d[_layer]/adaptive_max_pool2d_0" [id=4, type=adaptive_max_pool2d];
"5 TestModel/AdaptiveMaxPool2d[_layer]/SymmetricQuantizer/symmetric_quantize_0" [id=5, type=symmetric_quantize];
"6 TestModel/NNCFConv2d[_conv2]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" [id=6, type=symmetric_quantize];
"7 TestModel/NNCFConv2d[_conv2]/conv2d_0" [id=7, type=conv2d];
"8 /nncf_model_output_0" [id=8, type=nncf_model_output];
"0 /nncf_model_input_0" -> "1 SymmetricQuantizer/symmetric_quantize_0";
"1 SymmetricQuantizer/symmetric_quantize_0" -> "3 TestModel/NNCFConv2d[_conv1]/conv2d_0";
"2 TestModel/NNCFConv2d[_conv1]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" -> "3 TestModel/NNCFConv2d[_conv1]/conv2d_0";
"3 TestModel/NNCFConv2d[_conv1]/conv2d_0" -> "4 TestModel/AdaptiveMaxPool2d[_layer]/adaptive_max_pool2d_0";
"4 TestModel/AdaptiveMaxPool2d[_layer]/adaptive_max_pool2d_0" -> "5 TestModel/AdaptiveMaxPool2d[_layer]/SymmetricQuantizer/symmetric_quantize_0";
"5 TestModel/AdaptiveMaxPool2d[_layer]/SymmetricQuantizer/symmetric_quantize_0" -> "7 TestModel/NNCFConv2d[_conv2]/conv2d_0";
"6 TestModel/NNCFConv2d[_conv2]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" -> "7 TestModel/NNCFConv2d[_conv2]/conv2d_0";
"7 TestModel/NNCFConv2d[_conv2]/conv2d_0" -> "8 /nncf_model_output_0";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
strict digraph {
"0 /nncf_model_input_0" [id=0, type=nncf_model_input];
"1 SymmetricQuantizer/symmetric_quantize_0" [id=1, type=symmetric_quantize];
"2 TestModel/NNCFConv3d[_conv1]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" [id=2, type=symmetric_quantize];
"3 TestModel/NNCFConv3d[_conv1]/conv3d_0" [id=3, type=conv3d];
"4 TestModel/AdaptiveMaxPool3d[_layer]/adaptive_max_pool3d_0" [id=4, type=adaptive_max_pool3d];
"5 TestModel/AdaptiveMaxPool3d[_layer]/SymmetricQuantizer/symmetric_quantize_0" [id=5, type=symmetric_quantize];
"6 TestModel/NNCFConv3d[_conv2]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" [id=6, type=symmetric_quantize];
"7 TestModel/NNCFConv3d[_conv2]/conv3d_0" [id=7, type=conv3d];
"8 /nncf_model_output_0" [id=8, type=nncf_model_output];
"0 /nncf_model_input_0" -> "1 SymmetricQuantizer/symmetric_quantize_0";
"1 SymmetricQuantizer/symmetric_quantize_0" -> "3 TestModel/NNCFConv3d[_conv1]/conv3d_0";
"2 TestModel/NNCFConv3d[_conv1]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" -> "3 TestModel/NNCFConv3d[_conv1]/conv3d_0";
"3 TestModel/NNCFConv3d[_conv1]/conv3d_0" -> "4 TestModel/AdaptiveMaxPool3d[_layer]/adaptive_max_pool3d_0";
"4 TestModel/AdaptiveMaxPool3d[_layer]/adaptive_max_pool3d_0" -> "5 TestModel/AdaptiveMaxPool3d[_layer]/SymmetricQuantizer/symmetric_quantize_0";
"5 TestModel/AdaptiveMaxPool3d[_layer]/SymmetricQuantizer/symmetric_quantize_0" -> "7 TestModel/NNCFConv3d[_conv2]/conv3d_0";
"6 TestModel/NNCFConv3d[_conv2]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" -> "7 TestModel/NNCFConv3d[_conv2]/conv3d_0";
"7 TestModel/NNCFConv3d[_conv2]/conv3d_0" -> "8 /nncf_model_output_0";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
strict digraph {
"0 /nncf_model_input_0" [id=0, type=nncf_model_input];
"1 SymmetricQuantizer/symmetric_quantize_0" [id=1, type=symmetric_quantize];
"2 TestModel/NNCFConv1d[_conv1]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" [id=2, type=symmetric_quantize];
"3 TestModel/NNCFConv1d[_conv1]/conv1d_0" [id=3, type=conv1d];
"4 TestModel/MaxPool1d[_layer]/max_pool1d_0" [id=4, type=max_pool1d];
"5 TestModel/MaxPool1d[_layer]/SymmetricQuantizer/symmetric_quantize_0" [id=5, type=symmetric_quantize];
"6 TestModel/NNCFConv1d[_conv2]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" [id=6, type=symmetric_quantize];
"7 TestModel/NNCFConv1d[_conv2]/conv1d_0" [id=7, type=conv1d];
"8 /nncf_model_output_0" [id=8, type=nncf_model_output];
"0 /nncf_model_input_0" -> "1 SymmetricQuantizer/symmetric_quantize_0";
"1 SymmetricQuantizer/symmetric_quantize_0" -> "3 TestModel/NNCFConv1d[_conv1]/conv1d_0";
"2 TestModel/NNCFConv1d[_conv1]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" -> "3 TestModel/NNCFConv1d[_conv1]/conv1d_0";
"3 TestModel/NNCFConv1d[_conv1]/conv1d_0" -> "4 TestModel/MaxPool1d[_layer]/max_pool1d_0";
"4 TestModel/MaxPool1d[_layer]/max_pool1d_0" -> "5 TestModel/MaxPool1d[_layer]/SymmetricQuantizer/symmetric_quantize_0";
"5 TestModel/MaxPool1d[_layer]/SymmetricQuantizer/symmetric_quantize_0" -> "7 TestModel/NNCFConv1d[_conv2]/conv1d_0";
"6 TestModel/NNCFConv1d[_conv2]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" -> "7 TestModel/NNCFConv1d[_conv2]/conv1d_0";
"7 TestModel/NNCFConv1d[_conv2]/conv1d_0" -> "8 /nncf_model_output_0";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
strict digraph {
"0 /nncf_model_input_0" [id=0, type=nncf_model_input];
"1 SymmetricQuantizer/symmetric_quantize_0" [id=1, type=symmetric_quantize];
"2 TestModel/NNCFConv2d[_conv1]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" [id=2, type=symmetric_quantize];
"3 TestModel/NNCFConv2d[_conv1]/conv2d_0" [id=3, type=conv2d];
"4 TestModel/NNCFConv2d[_conv1]/SymmetricQuantizer/symmetric_quantize_0" [id=4, type=symmetric_quantize];
"5 TestModel/MaxPool2d[_layer]/max_pool2d_0" [id=5, type=max_pool2d];
"6 TestModel/NNCFConv2d[_conv2]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" [id=6, type=symmetric_quantize];
"7 TestModel/NNCFConv2d[_conv2]/conv2d_0" [id=7, type=conv2d];
"8 /nncf_model_output_0" [id=8, type=nncf_model_output];
"0 /nncf_model_input_0" -> "1 SymmetricQuantizer/symmetric_quantize_0";
"1 SymmetricQuantizer/symmetric_quantize_0" -> "3 TestModel/NNCFConv2d[_conv1]/conv2d_0";
"2 TestModel/NNCFConv2d[_conv1]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" -> "3 TestModel/NNCFConv2d[_conv1]/conv2d_0";
"3 TestModel/NNCFConv2d[_conv1]/conv2d_0" -> "4 TestModel/NNCFConv2d[_conv1]/SymmetricQuantizer/symmetric_quantize_0";
"4 TestModel/NNCFConv2d[_conv1]/SymmetricQuantizer/symmetric_quantize_0" -> "5 TestModel/MaxPool2d[_layer]/max_pool2d_0";
"5 TestModel/MaxPool2d[_layer]/max_pool2d_0" -> "7 TestModel/NNCFConv2d[_conv2]/conv2d_0";
"6 TestModel/NNCFConv2d[_conv2]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" -> "7 TestModel/NNCFConv2d[_conv2]/conv2d_0";
"7 TestModel/NNCFConv2d[_conv2]/conv2d_0" -> "8 /nncf_model_output_0";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
strict digraph {
"0 /nncf_model_input_0" [id=0, type=nncf_model_input];
"1 SymmetricQuantizer/symmetric_quantize_0" [id=1, type=symmetric_quantize];
"2 TestModel/NNCFConv3d[_conv1]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" [id=2, type=symmetric_quantize];
"3 TestModel/NNCFConv3d[_conv1]/conv3d_0" [id=3, type=conv3d];
"4 TestModel/NNCFConv3d[_conv1]/SymmetricQuantizer/symmetric_quantize_0" [id=4, type=symmetric_quantize];
"5 TestModel/MaxPool3d[_layer]/max_pool3d_0" [id=5, type=max_pool3d];
"6 TestModel/NNCFConv3d[_conv2]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" [id=6, type=symmetric_quantize];
"7 TestModel/NNCFConv3d[_conv2]/conv3d_0" [id=7, type=conv3d];
"8 /nncf_model_output_0" [id=8, type=nncf_model_output];
"0 /nncf_model_input_0" -> "1 SymmetricQuantizer/symmetric_quantize_0";
"1 SymmetricQuantizer/symmetric_quantize_0" -> "3 TestModel/NNCFConv3d[_conv1]/conv3d_0";
"2 TestModel/NNCFConv3d[_conv1]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" -> "3 TestModel/NNCFConv3d[_conv1]/conv3d_0";
"3 TestModel/NNCFConv3d[_conv1]/conv3d_0" -> "4 TestModel/NNCFConv3d[_conv1]/SymmetricQuantizer/symmetric_quantize_0";
"4 TestModel/NNCFConv3d[_conv1]/SymmetricQuantizer/symmetric_quantize_0" -> "5 TestModel/MaxPool3d[_layer]/max_pool3d_0";
"5 TestModel/MaxPool3d[_layer]/max_pool3d_0" -> "7 TestModel/NNCFConv3d[_conv2]/conv3d_0";
"6 TestModel/NNCFConv3d[_conv2]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize_0" -> "7 TestModel/NNCFConv3d[_conv2]/conv3d_0";
"7 TestModel/NNCFConv3d[_conv2]/conv3d_0" -> "8 /nncf_model_output_0";
}
41 changes: 41 additions & 0 deletions tests/torch/test_compressed_graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -577,6 +577,39 @@ def forward(self, x):
return TestModel(self.tensor_method, **self.model_kwargs)


class ConvLayerConvModelDesc(BaseDesc):
def __init__(
self,
layer: nn.Module,
conv_class: nn.Module,
input_sample_sizes: Union[Tuple[List[int], ...], List[int]] = None,
model_name: str = None,
):
super().__init__(input_sample_sizes, model_name)

self.model_name = model_name
if model_name is None:
self.model_name = f"Conv_{layer.__class__.__name__}_Conv"
self.layer = layer
self.conv_class = conv_class

def get_model(self):
class TestModel(ModelWithDummyParameter):
def __init__(self, layer, conv_class):
super().__init__()
self._conv1 = conv_class(1, 1, 1)
self._layer = layer
self._conv2 = conv_class(1, 1, 1)

def forward(self, x):
x = self._conv1(x)
x = self._layer(x)
x = self._conv2(x)
return x

return TestModel(self.layer, self.conv_class)


shift_scale_models = []
params_combinations = list(itertools.product([True, False], repeat=2))

Expand Down Expand Up @@ -661,6 +694,14 @@ def forward(self, x):
SingleLayerModelDesc(layer=nn.MaxPool1d(1), input_sample_sizes=[1, 1, 1]),
SingleLayerModelDesc(layer=nn.MaxPool2d(1), input_sample_sizes=[1, 1, 1]),
SingleLayerModelDesc(layer=nn.MaxPool3d(1), input_sample_sizes=[1, 1, 1, 1]),
ConvLayerConvModelDesc(layer=nn.AdaptiveMaxPool1d(1), conv_class=nn.Conv1d, input_sample_sizes=[1, 1]),
ConvLayerConvModelDesc(layer=nn.AdaptiveMaxPool2d((1, 1)), conv_class=nn.Conv2d, input_sample_sizes=[1, 1, 1]),
ConvLayerConvModelDesc(
layer=nn.AdaptiveMaxPool3d((1, 1, 1)), conv_class=nn.Conv3d, input_sample_sizes=[1, 1, 1, 1]
),
ConvLayerConvModelDesc(layer=nn.MaxPool1d(1), conv_class=nn.Conv1d, input_sample_sizes=[1, 1]),
ConvLayerConvModelDesc(layer=nn.MaxPool2d((1, 1)), conv_class=nn.Conv2d, input_sample_sizes=[1, 1, 1]),
ConvLayerConvModelDesc(layer=nn.MaxPool3d((1, 1, 1)), conv_class=nn.Conv3d, input_sample_sizes=[1, 1, 1, 1]),
GeneralModelDesc(
model_name="MaxUnpool3d",
model_builder=PoolUnPool,
Expand Down

0 comments on commit cb7f3c1

Please sign in to comment.