Skip to content

Commit

Permalink
Fix tpcv4 torch (#1150)
Browse files Browse the repository at this point in the history
* Add "multiply" & "subtract" torch functions to TPCv4.
* Set all OpQuantizationConfig inputs as args without default. Change is_signed to signedness with Enum.
  • Loading branch information
elad-c authored Aug 6, 2024
1 parent c95a4f3 commit 8687883
Show file tree
Hide file tree
Showing 21 changed files with 98 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ def __init__(self,
self.activation_n_bits = op_cfg.activation_n_bits
self.relu_bound_to_power_of_2 = qc.relu_bound_to_power_of_2
self.enable_activation_quantization = op_cfg.enable_activation_quantization
self.is_signed = op_cfg.is_signed
self.signedness = op_cfg.signedness
self.activation_channel_equalization = qc.activation_channel_equalization
self.input_scaling = qc.input_scaling
self.min_threshold = qc.min_threshold
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,8 @@
import numpy as np
from typing import Dict, Union

from model_compression_toolkit.target_platform_capabilities.target_platform import QuantizationMethod
from model_compression_toolkit.target_platform_capabilities.target_platform import QuantizationMethod, Signedness
from model_compression_toolkit.core.common.collectors.statistics_collector import BaseStatsCollector
from model_compression_toolkit.constants import SIGNED
from model_compression_toolkit.core.common.quantization import quantization_params_generation
from model_compression_toolkit.core.common.node_prior_info import NodePriorInfo
from model_compression_toolkit.core.common.quantization.node_quantization_config import NodeActivationQuantizationConfig
Expand Down Expand Up @@ -49,8 +48,8 @@ def get_activations_qparams(activation_quant_cfg: NodeActivationQuantizationConf
bins_counts)
min_value, max_value = out_stats_container.get_min_max_values()

if activation_quant_cfg.is_signed is not None:
signed = activation_quant_cfg.is_signed
if activation_quant_cfg.signedness in [Signedness.SIGNED, Signedness.UNSIGNED]:
signed = activation_quant_cfg.signedness == Signedness.SIGNED
elif nodes_prior_info.is_output_bounded():
signed = min_value < 0
else:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@
from model_compression_toolkit.target_platform_capabilities.target_platform.targetplatform2framework.attribute_filter import AttributeFilter
from model_compression_toolkit.target_platform_capabilities.target_platform.targetplatform2framework import TargetPlatformCapabilities, OperationsSetToLayers, Smaller, SmallerEq, NotEq, Eq, GreaterEq, Greater, LayerFilterParams, OperationsToLayers, get_current_tpc
from model_compression_toolkit.target_platform_capabilities.target_platform.target_platform_model import get_default_quantization_config_options, TargetPlatformModel
from model_compression_toolkit.target_platform_capabilities.target_platform.op_quantization_config import OpQuantizationConfig, QuantizationConfigOptions, AttributeQuantizationConfig
from model_compression_toolkit.target_platform_capabilities.target_platform.op_quantization_config import \
OpQuantizationConfig, QuantizationConfigOptions, AttributeQuantizationConfig, Signedness
from model_compression_toolkit.target_platform_capabilities.target_platform.operators import OperatorsSet, OperatorSetConcat

from mct_quantizers import QuantizationMethod
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,26 @@

import copy
from typing import List, Dict, Union, Any, Tuple
from enum import Enum

from mct_quantizers import QuantizationMethod
from model_compression_toolkit.constants import FLOAT_BITWIDTH
from model_compression_toolkit.logger import Logger


class Signedness(Enum):
"""
An enum for choosing the signedness of the quantization method:
AUTO - Signedness decided automatically by quantization.
SIGNED - Force signed quantization.
UNSIGNED - Force unsigned quantization.
"""
AUTO = 0
SIGNED = 1
UNSIGNED = 2


def clone_and_edit_object_params(obj: Any, **kwargs: Dict) -> Any:
"""
Clones the given object and edit some of its parameters.
Expand Down Expand Up @@ -120,7 +134,7 @@ def __init__(self,
fixed_scale: float,
fixed_zero_point: int,
simd_size: int,
is_signed: bool = None
signedness: Signedness
):
"""
Expand All @@ -134,8 +148,8 @@ def __init__(self,
quantization_preserving (bool): Whether quantization parameters should be the same for an operator's input and output.
fixed_scale (float): Scale to use for an operator quantization parameters.
fixed_zero_point (int): Zero-point to use for an operator quantization parameters.
is_signed (bool): Force activation quantization signedness (None means don't force).
simd_size (int): Per op integer representing the Single Instruction, Multiple Data (SIMD) width of an operator. It indicates the number of data elements that can be fetched and processed simultaneously in a single instruction.
signedness (bool): Set activation quantization signedness.
"""

Expand All @@ -154,7 +168,7 @@ def __init__(self,
self.quantization_preserving = quantization_preserving
self.fixed_scale = fixed_scale
self.fixed_zero_point = fixed_zero_point
self.is_signed = is_signed
self.signedness = signedness
self.simd_size = simd_size

def get_info(self):
Expand Down Expand Up @@ -206,7 +220,7 @@ def __eq__(self, other):
self.activation_n_bits == other.activation_n_bits and \
self.supported_input_activation_n_bits == other.supported_input_activation_n_bits and \
self.enable_activation_quantization == other.enable_activation_quantization and \
self.is_signed == other.is_signed and \
self.signedness == other.signedness and \
self.simd_size == other.simd_size

@property
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from model_compression_toolkit.constants import FLOAT_BITWIDTH
from model_compression_toolkit.target_platform_capabilities.constants import KERNEL_ATTR, BIAS_ATTR, WEIGHTS_N_BITS
from model_compression_toolkit.target_platform_capabilities.target_platform import OpQuantizationConfig, \
TargetPlatformModel
TargetPlatformModel, Signedness
from model_compression_toolkit.target_platform_capabilities.target_platform.op_quantization_config import \
AttributeQuantizationConfig

Expand Down Expand Up @@ -98,7 +98,8 @@ def get_op_quantization_configs() -> Tuple[OpQuantizationConfig, List[OpQuantiza
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# We define an 8-bit config for linear operations quantization, that include a kernel and bias attributes.
linear_eight_bits = tp.OpQuantizationConfig(
Expand All @@ -111,7 +112,8 @@ def get_op_quantization_configs() -> Tuple[OpQuantizationConfig, List[OpQuantiza
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# To quantize a model using mixed-precision, create
# a list with more than one OpQuantizationConfig.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from model_compression_toolkit.target_platform_capabilities.constants import KERNEL_ATTR, BIAS_ATTR, WEIGHTS_N_BITS, \
WEIGHTS_QUANTIZATION_METHOD
from model_compression_toolkit.target_platform_capabilities.target_platform import OpQuantizationConfig, \
TargetPlatformModel
TargetPlatformModel, Signedness
from model_compression_toolkit.target_platform_capabilities.target_platform.op_quantization_config import \
AttributeQuantizationConfig

Expand Down Expand Up @@ -94,7 +94,8 @@ def get_op_quantization_configs() -> Tuple[OpQuantizationConfig, List[OpQuantiza
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# We define an 8-bit config for linear operations quantization, that include a kernel and bias attributes.
linear_eight_bits = tp.OpQuantizationConfig(
Expand All @@ -107,7 +108,8 @@ def get_op_quantization_configs() -> Tuple[OpQuantizationConfig, List[OpQuantiza
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# To quantize a model using mixed-precision, create
# a list with more than one OpQuantizationConfig.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from model_compression_toolkit.constants import FLOAT_BITWIDTH
from model_compression_toolkit.target_platform_capabilities.constants import KERNEL_ATTR, BIAS_ATTR, WEIGHTS_N_BITS
from model_compression_toolkit.target_platform_capabilities.target_platform import OpQuantizationConfig, \
TargetPlatformModel
TargetPlatformModel, Signedness
from model_compression_toolkit.target_platform_capabilities.target_platform.op_quantization_config import \
AttributeQuantizationConfig

Expand Down Expand Up @@ -94,7 +94,8 @@ def get_op_quantization_configs() -> Tuple[OpQuantizationConfig, List[OpQuantiza
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# We define an 8-bit config for linear operations quantization, that include a kernel and bias attributes.
linear_eight_bits = tp.OpQuantizationConfig(
Expand All @@ -107,7 +108,8 @@ def get_op_quantization_configs() -> Tuple[OpQuantizationConfig, List[OpQuantiza
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# To quantize a model using mixed-precision, create
# a list with more than one OpQuantizationConfig.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from model_compression_toolkit.constants import FLOAT_BITWIDTH
from model_compression_toolkit.target_platform_capabilities.constants import KERNEL_ATTR, BIAS_ATTR, WEIGHTS_N_BITS
from model_compression_toolkit.target_platform_capabilities.target_platform import OpQuantizationConfig, \
TargetPlatformModel
TargetPlatformModel, Signedness
from model_compression_toolkit.target_platform_capabilities.target_platform.op_quantization_config import \
AttributeQuantizationConfig

Expand Down Expand Up @@ -100,7 +100,8 @@ def get_op_quantization_configs() -> \
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# We define an 8-bit config for linear operations quantization, that include a kernel and bias attributes.
linear_eight_bits = tp.OpQuantizationConfig(
Expand All @@ -113,7 +114,8 @@ def get_op_quantization_configs() -> \
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# To quantize a model using mixed-precision, create
# a list with more than one OpQuantizationConfig.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from model_compression_toolkit.target_platform_capabilities.constants import KERNEL_ATTR, BIAS_ATTR, WEIGHTS_N_BITS, \
WEIGHTS_QUANTIZATION_METHOD
from model_compression_toolkit.target_platform_capabilities.target_platform import OpQuantizationConfig, \
TargetPlatformModel
TargetPlatformModel, Signedness
from model_compression_toolkit.target_platform_capabilities.target_platform.op_quantization_config import \
AttributeQuantizationConfig

Expand Down Expand Up @@ -96,7 +96,8 @@ def get_op_quantization_configs() -> \
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# We define an 8-bit config for linear operations quantization, that include a kernel and bias attributes.
linear_eight_bits = tp.OpQuantizationConfig(
Expand All @@ -109,7 +110,8 @@ def get_op_quantization_configs() -> \
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# To quantize a model using mixed-precision, create
# a list with more than one OpQuantizationConfig.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from model_compression_toolkit.constants import FLOAT_BITWIDTH
from model_compression_toolkit.target_platform_capabilities.constants import KERNEL_ATTR, BIAS_ATTR, WEIGHTS_N_BITS
from model_compression_toolkit.target_platform_capabilities.target_platform import OpQuantizationConfig, \
TargetPlatformModel
TargetPlatformModel, Signedness
from model_compression_toolkit.target_platform_capabilities.target_platform.op_quantization_config import \
AttributeQuantizationConfig

Expand Down Expand Up @@ -100,7 +100,8 @@ def get_op_quantization_configs() -> \
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# We define an 8-bit config for linear operations quantization, that include a kernel and bias attributes.
linear_eight_bits = tp.OpQuantizationConfig(
Expand All @@ -113,7 +114,8 @@ def get_op_quantization_configs() -> \
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# To quantize a model using mixed-precision, create
# a list with more than one OpQuantizationConfig.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from model_compression_toolkit.target_platform_capabilities.constants import KERNEL_ATTR, BIAS_ATTR, WEIGHTS_N_BITS, \
WEIGHTS_QUANTIZATION_METHOD
from model_compression_toolkit.target_platform_capabilities.target_platform import OpQuantizationConfig, \
TargetPlatformModel
TargetPlatformModel, Signedness
from model_compression_toolkit.target_platform_capabilities.target_platform.op_quantization_config import \
AttributeQuantizationConfig

Expand Down Expand Up @@ -96,7 +96,8 @@ def get_op_quantization_configs() -> \
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# We define an 8-bit config for linear operations quantization, that include a kernel and bias attributes.
linear_eight_bits = tp.OpQuantizationConfig(
Expand All @@ -109,7 +110,8 @@ def get_op_quantization_configs() -> \
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# To quantize a model using mixed-precision, create
# a list with more than one OpQuantizationConfig.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from model_compression_toolkit.constants import FLOAT_BITWIDTH
from model_compression_toolkit.target_platform_capabilities.constants import KERNEL_ATTR, BIAS_ATTR, WEIGHTS_N_BITS
from model_compression_toolkit.target_platform_capabilities.target_platform import OpQuantizationConfig, \
TargetPlatformModel
TargetPlatformModel, Signedness
from model_compression_toolkit.target_platform_capabilities.target_platform.op_quantization_config import \
AttributeQuantizationConfig

Expand Down Expand Up @@ -100,7 +100,8 @@ def get_op_quantization_configs() -> \
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# We define an 8-bit config for linear operations quantization, that include a kernel and bias attributes.
linear_eight_bits = tp.OpQuantizationConfig(
Expand All @@ -113,7 +114,8 @@ def get_op_quantization_configs() -> \
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# To quantize a model using mixed-precision, create
# a list with more than one OpQuantizationConfig.
Expand Down Expand Up @@ -170,7 +172,7 @@ def generate_tp_model(default_config: OpQuantizationConfig,
const_config_input16 = const_config.clone_and_edit(
supported_input_activation_n_bits=(8, 16))
const_config_input16_output16 = const_config_input16.clone_and_edit(
activation_n_bits=16, is_signed=True)
activation_n_bits=16, signedness=Signedness.SIGNED)
const_configuration_options_inout16 = tp.QuantizationConfigOptions([const_config_input16_output16,
const_config_input16],
base_config=const_config_input16)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

import torch
from torch import add, sub, mul, div, flatten, reshape, split, unsqueeze, dropout, sigmoid, tanh, chunk, unbind, topk, \
gather, equal, transpose, permute, argmax, squeeze
gather, equal, transpose, permute, argmax, squeeze, multiply, subtract
from torch.nn import Conv2d, Linear, ConvTranspose2d, MaxPool2d
from torch.nn import Dropout, Flatten, Hardtanh, Identity
from torch.nn import ReLU, ReLU6, PReLU, SiLU, Sigmoid, Tanh, Hardswish, LeakyReLU
Expand Down Expand Up @@ -101,8 +101,8 @@ def generate_pytorch_tpc(name: str, tp_model: tp.TargetPlatformModel):
tp.LayerFilterParams(hardtanh, min_val=0)])

tp.OperationsSetToLayers("Add", [operator.add, add])
tp.OperationsSetToLayers("Sub", [operator.sub, sub])
tp.OperationsSetToLayers("Mul", [operator.mul, mul])
tp.OperationsSetToLayers("Sub", [operator.sub, sub, subtract])
tp.OperationsSetToLayers("Mul", [operator.mul, mul, multiply])
tp.OperationsSetToLayers("Div", [operator.truediv, div])
tp.OperationsSetToLayers("PReLU", [PReLU, prelu])
tp.OperationsSetToLayers("Swish", [SiLU, silu, Hardswish, hardswish])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from model_compression_toolkit.constants import FLOAT_BITWIDTH
from model_compression_toolkit.target_platform_capabilities.constants import KERNEL_ATTR, BIAS_ATTR
from model_compression_toolkit.target_platform_capabilities.target_platform import OpQuantizationConfig, \
TargetPlatformModel
TargetPlatformModel, Signedness
from model_compression_toolkit.target_platform_capabilities.target_platform.op_quantization_config import \
AttributeQuantizationConfig

Expand Down Expand Up @@ -95,7 +95,8 @@ def get_op_quantization_configs() -> Tuple[OpQuantizationConfig, List[OpQuantiza
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=32)
simd_size=32,
signedness=Signedness.AUTO)

# We define an 8-bit config for linear operations quantization, that include a kernel and bias attributes.
linear_eight_bits = tp.OpQuantizationConfig(
Expand All @@ -108,8 +109,8 @@ def get_op_quantization_configs() -> Tuple[OpQuantizationConfig, List[OpQuantiza
quantization_preserving=False,
fixed_scale=None,
fixed_zero_point=None,
simd_size=None
)
simd_size=None,
signedness=Signedness.AUTO)

mixed_precision_cfg_list = [] # No mixed precision

Expand Down
Loading

0 comments on commit 8687883

Please sign in to comment.