diff --git a/model_compression_toolkit/target_platform_capabilities/tpc_models/__init__.py b/model_compression_toolkit/target_platform_capabilities/tpc_models/__init__.py index 21e5c3414..7ed4a3edc 100644 --- a/model_compression_toolkit/target_platform_capabilities/tpc_models/__init__.py +++ b/model_compression_toolkit/target_platform_capabilities/tpc_models/__init__.py @@ -28,7 +28,7 @@ def generate_tpc_func(device_type: str) -> Callable: device_type (str): The type of device for the target platform. Returns: - A function that generates target platform capabilities models. + Callable: A function that generates target platform capabilities models. """ # Organize all device types into device_type_dict. diff --git a/model_compression_toolkit/target_platform_capabilities/tpc_models/get_target_platform_capabilities.py b/model_compression_toolkit/target_platform_capabilities/tpc_models/get_target_platform_capabilities.py index 0a3d58d43..1421e295a 100644 --- a/model_compression_toolkit/target_platform_capabilities/tpc_models/get_target_platform_capabilities.py +++ b/model_compression_toolkit/target_platform_capabilities/tpc_models/get_target_platform_capabilities.py @@ -27,7 +27,7 @@ def get_target_platform_capabilities(tpc_version: str = '1.0', device_type (str): The type of device for the target platform. Returns: - The TargetPlatformCapabilities object. + TargetPlatformCapabilities: The TargetPlatformCapabilities object. """ # Generate a function containing tpc configurations for the specified device type. tpc_func = generate_tpc_func(device_type=device_type) @@ -44,11 +44,11 @@ def get_tpc_model(name: str, tpc: TargetPlatformCapabilities): This is a utility method that just returns the TargetPlatformCapabilities that it receives, to support existing TPC API. Args: - name: the name of the TargetPlatformCapabilities (not used in this function). - tpc: a TargetPlatformCapabilities to return. + name (str): the name of the TargetPlatformCapabilities (not used in this function). + tpc (TargetPlatformCapabilities): a TargetPlatformCapabilities to return. Returns: - The given TargetPlatformCapabilities object. + TargetPlatformCapabilities: The given TargetPlatformCapabilities object. """ diff --git a/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/__init__.py b/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/__init__.py index 588286f35..01cca7acb 100644 --- a/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/__init__.py +++ b/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/__init__.py @@ -30,7 +30,7 @@ def generate_imx500_tpc(tpc_version: str) -> TargetPlatformCapabilities: tpc_version (str): The version of the TPC to use. Returns: - None (TargetPlatformCapabilities): The TargetPlatformCapabilities object based on the specified version. + TargetPlatformCapabilities: The TargetPlatformCapabilities object based on the specified version. """ # Organize all tpc versions into tpcs_dict. diff --git a/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v1_0/tpc.py b/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v1_0/tpc.py index d2392cd79..9ce930ae7 100644 --- a/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v1_0/tpc.py +++ b/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v1_0/tpc.py @@ -32,7 +32,8 @@ def get_tpc() -> TargetPlatformCapabilities: (for tests, experiments, etc.), use this method implementation as a test-case, i.e., override the 'get_op_quantization_configs' method and use its output to call 'generate_tpc' with your configurations. - Returns: A TargetPlatformCapabilities object. + Returns: + TargetPlatformCapabilities: A TargetPlatformCapabilities object. """ base_config, mixed_precision_cfg_list, default_config = get_op_quantization_configs() @@ -48,7 +49,9 @@ def get_op_quantization_configs() -> Tuple[OpQuantizationConfig, List[OpQuantiza In addition, creates a default configuration objects list (with 8, 4 and 2 bit quantization) to be used as default configuration for mixed-precision quantization. - Returns: An OpQuantizationConfig config object and a list of OpQuantizationConfig objects. + Returns: + Tuple[OpQuantizationConfig, List[OpQuantizationConfig], OpQuantizationConfig]: + An OpQuantizationConfig config object and a list of OpQuantizationConfig objects. """ @@ -138,14 +141,15 @@ def generate_tpc(default_config: OpQuantizationConfig, Generates TargetPlatformCapabilities with default defined Operators Sets, based on the given base configuration and mixed-precision configurations options list. - Args - default_config: A default OpQuantizationConfig to set as the TP model default configuration. - base_config: An OpQuantizationConfig to set as the TargetPlatformCapabilities base configuration for mixed-precision purposes only. - mixed_precision_cfg_list: A list of OpQuantizationConfig to be used as the TP model mixed-precision - quantization configuration options. - name: The name of the TargetPlatformCapabilities. + Args: + default_config (OpQuantizationConfig): A default OpQuantizationConfig to set as the TP model default configuration. + base_config (OpQuantizationConfig): An OpQuantizationConfig to set as the TargetPlatformCapabilities base configuration for mixed-precision purposes only. + mixed_precision_cfg_list (List[OpQuantizationConfig]): A list of OpQuantizationConfig to be used as the TP model mixed-precision + quantization configuration options. + name (str): The name of the TargetPlatformCapabilities. - Returns: A TargetPlatformCapabilities object. + Returns: + TargetPlatformCapabilities: A TargetPlatformCapabilities object. """ # Create a QuantizationConfigOptions, which defines a set diff --git a/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v4_0/tpc.py b/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v4_0/tpc.py index f78c4ff63..4f7eea4a5 100644 --- a/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v4_0/tpc.py +++ b/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v4_0/tpc.py @@ -32,7 +32,7 @@ def get_tpc() -> TargetPlatformCapabilities: 'get_op_quantization_configs' method and use its output to call 'generate_tpc' with your configurations. Returns: - None (TargetPlatformCapabilities): A TargetPlatformCapabilities object. + TargetPlatformCapabilities: A TargetPlatformCapabilities object. """ base_config, mixed_precision_cfg_list, default_config = get_op_quantization_configs() @@ -49,10 +49,8 @@ def get_op_quantization_configs() -> Tuple[OpQuantizationConfig, List[OpQuantiza default configuration for mixed-precision quantization. Returns: - linear_eight_bits (OpQuantizationConfig), - mixed_precision_cfg_list (List[OpQuantizationConfig]), - eight_bits_default (OpQuantizationConfig) - : An OpQuantizationConfig object and a list of OpQuantizationConfig objects. + Tuple[OpQuantizationConfig, List[OpQuantizationConfig], OpQuantizationConfig]: + An OpQuantizationConfig config object and a list of OpQuantizationConfig objects. """ @@ -150,7 +148,7 @@ def generate_tpc(default_config: OpQuantizationConfig, name (str): The name of the TargetPlatformCapabilities. Returns: - generated_tpc (TargetPlatformCapabilities): A TargetPlatformCapabilities object. + TargetPlatformCapabilities: A TargetPlatformCapabilities object. """ # Create a QuantizationConfigOptions, which defines a set diff --git a/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v5_0/tpc.py b/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v5_0/tpc.py index 51ebedfbd..def43aea3 100644 --- a/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v5_0/tpc.py +++ b/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v5_0/tpc.py @@ -32,7 +32,7 @@ def get_tpc() -> TargetPlatformCapabilities: 'get_op_quantization_configs' method and use its output to call 'generate_tpc' with your configurations. Returns: - None (TargetPlatformCapabilities): A TargetPlatformCapabilities object. + TargetPlatformCapabilities: A TargetPlatformCapabilities object. """ base_config, mixed_precision_cfg_list, default_config = get_op_quantization_configs() @@ -49,10 +49,8 @@ def get_op_quantization_configs() -> Tuple[OpQuantizationConfig, List[OpQuantiza default configuration for mixed-precision quantization. Returns: - linear_eight_bits (OpQuantizationConfig), - mixed_precision_cfg_list (List[OpQuantizationConfig]), - eight_bits_default (OpQuantizationConfig) - : An OpQuantizationConfig object and a list of OpQuantizationConfig objects. + Tuple[OpQuantizationConfig, List[OpQuantizationConfig], OpQuantizationConfig]: + An OpQuantizationConfig config object and a list of OpQuantizationConfig objects. """ @@ -150,7 +148,7 @@ def generate_tpc(default_config: OpQuantizationConfig, name (str): The name of the TargetPlatformCapabilities. Returns: - generated_tpc (TargetPlatformCapabilities): A TargetPlatformCapabilities object. + TargetPlatformCapabilities: A TargetPlatformCapabilities object. """ # Create a QuantizationConfigOptions, which defines a set diff --git a/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v6_0/tpc.py b/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v6_0/tpc.py index 4ef06c638..3942b3461 100644 --- a/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v6_0/tpc.py +++ b/model_compression_toolkit/target_platform_capabilities/tpc_models/imx500_tpc/v6_0/tpc.py @@ -32,7 +32,7 @@ def get_tpc() -> TargetPlatformCapabilities: 'get_op_quantization_configs' method and use its output to call 'generate_tpc' with your configurations. Returns: - None (TargetPlatformCapabilities): A TargetPlatformCapabilities object. + TargetPlatformCapabilities: A TargetPlatformCapabilities object. """ base_config, mixed_precision_cfg_list, default_config = get_op_quantization_configs() @@ -49,10 +49,8 @@ def get_op_quantization_configs() -> Tuple[OpQuantizationConfig, List[OpQuantiza default configuration for mixed-precision quantization. Returns: - linear_eight_bits (OpQuantizationConfig), - mixed_precision_cfg_list (List[OpQuantizationConfig]), - eight_bits_default (OpQuantizationConfig) - : An OpQuantizationConfig object and a list of OpQuantizationConfig objects. + Tuple[OpQuantizationConfig, List[OpQuantizationConfig], OpQuantizationConfig]: + An OpQuantizationConfig config object and a list of OpQuantizationConfig objects. """ @@ -150,7 +148,7 @@ def generate_tpc(default_config: OpQuantizationConfig, name (str): The name of the TargetPlatformCapabilities. Returns: - generated_tpc (TargetPlatformCapabilities): A TargetPlatformCapabilities object. + TargetPlatformCapabilities: A TargetPlatformCapabilities object. """ # Create a QuantizationConfigOptions, which defines a set diff --git a/model_compression_toolkit/target_platform_capabilities/tpc_models/qnnpack_tpc/__init__.py b/model_compression_toolkit/target_platform_capabilities/tpc_models/qnnpack_tpc/__init__.py index d844b8435..fcc08df6f 100644 --- a/model_compression_toolkit/target_platform_capabilities/tpc_models/qnnpack_tpc/__init__.py +++ b/model_compression_toolkit/target_platform_capabilities/tpc_models/qnnpack_tpc/__init__.py @@ -27,7 +27,7 @@ def generate_qnnpack_tpc(tpc_version: str) -> TargetPlatformCapabilities: tpc_version (str): The version of the TPC to use. Returns: - The TargetPlatformCapabilities object based on the specified version. + TargetPlatformCapabilities: The TargetPlatformCapabilities object based on the specified version. """ # Organize all tpc versions into tpcs_dict. diff --git a/model_compression_toolkit/target_platform_capabilities/tpc_models/qnnpack_tpc/v1_0/tpc.py b/model_compression_toolkit/target_platform_capabilities/tpc_models/qnnpack_tpc/v1_0/tpc.py index bf7fe8cbb..284e1a2d6 100644 --- a/model_compression_toolkit/target_platform_capabilities/tpc_models/qnnpack_tpc/v1_0/tpc.py +++ b/model_compression_toolkit/target_platform_capabilities/tpc_models/qnnpack_tpc/v1_0/tpc.py @@ -33,7 +33,8 @@ def get_tpc() -> TargetPlatformCapabilities: (for tests, experiments, etc.), use this method implementation as a test-case, i.e., override the 'get_op_quantization_configs' method and use its output to call 'generate_tpc' with your configurations. - Returns: A TargetPlatformCapabilities object. + Returns: + TargetPlatformCapabilities: A TargetPlatformCapabilities object. """ base_config, mixed_precision_cfg_list, default_config = get_op_quantization_configs() @@ -49,7 +50,9 @@ def get_op_quantization_configs() -> Tuple[OpQuantizationConfig, List[OpQuantiza In addition, creates a default configuration objects list (with 8, 4 and 2 bit quantization) to be used as default configuration for mixed-precision quantization. - Returns: An OpQuantizationConfig config object and a list of OpQuantizationConfig objects. + Returns: + Tuple[OpQuantizationConfig, List[OpQuantizationConfig], OpQuantizationConfig]: + An OpQuantizationConfig config object and a list of OpQuantizationConfig objects. """ @@ -125,14 +128,15 @@ def generate_tpc(default_config: OpQuantizationConfig, Generates TargetPlatformCapabilities with default defined Operators Sets, based on the given base configuration and mixed-precision configurations options list. - Args - default_config: A default OpQuantizationConfig to set as the TP model default configuration. - base_config: An OpQuantizationConfig to set as the TargetPlatformCapabilities base configuration for mixed-precision purposes only. - mixed_precision_cfg_list: A list of OpQuantizationConfig to be used as the TP model mixed-precision + Args: + default_config (OpQuantizationConfig): A default OpQuantizationConfig to set as the TP model default configuration. + base_config (OpQuantizationConfig): An OpQuantizationConfig to set as the TargetPlatformCapabilities base configuration for mixed-precision purposes only. + mixed_precision_cfg_list (List[OpQuantizationConfig]): A list of OpQuantizationConfig to be used as the TP model mixed-precision quantization configuration options. - name: The name of the TargetPlatformCapabilities. + name (str): The name of the TargetPlatformCapabilities. - Returns: A TargetPlatformCapabilities object. + Returns: + TargetPlatformCapabilities: A TargetPlatformCapabilities object. """ # Create a QuantizationConfigOptions, which defines a set diff --git a/model_compression_toolkit/target_platform_capabilities/tpc_models/tflite_tpc/__init__.py b/model_compression_toolkit/target_platform_capabilities/tpc_models/tflite_tpc/__init__.py index 3755e52ec..3a092faed 100644 --- a/model_compression_toolkit/target_platform_capabilities/tpc_models/tflite_tpc/__init__.py +++ b/model_compression_toolkit/target_platform_capabilities/tpc_models/tflite_tpc/__init__.py @@ -27,7 +27,7 @@ def generate_tflite_tpc(tpc_version: str) -> TargetPlatformCapabilities: tpc_version (str): The version of the TPC to use. Returns: - The TargetPlatformCapabilities object based on the specified version. + TargetPlatformCapabilities: The TargetPlatformCapabilities object based on the specified version. """ # Organize all tpc versions into tpcs_dict. diff --git a/model_compression_toolkit/target_platform_capabilities/tpc_models/tflite_tpc/v1_0/tpc.py b/model_compression_toolkit/target_platform_capabilities/tpc_models/tflite_tpc/v1_0/tpc.py index dd93d8e1e..22cb7bc59 100644 --- a/model_compression_toolkit/target_platform_capabilities/tpc_models/tflite_tpc/v1_0/tpc.py +++ b/model_compression_toolkit/target_platform_capabilities/tpc_models/tflite_tpc/v1_0/tpc.py @@ -32,7 +32,8 @@ def get_tpc() -> TargetPlatformCapabilities: (for tests, experiments, etc.), use this method implementation as a test-case, i.e., override the 'get_op_quantization_configs' method and use its output to call 'generate_tpc' with your configurations. - Returns: A TargetPlatformCapabilities object. + Returns: + TargetPlatformCapabilities: A TargetPlatformCapabilities object. """ base_config, mixed_precision_cfg_list, default_config = get_op_quantization_configs() @@ -48,7 +49,9 @@ def get_op_quantization_configs() -> Tuple[OpQuantizationConfig, List[OpQuantiza In addition, creates a default configuration objects list (with 8, 4 and 2 bit quantization) to be used as default configuration for mixed-precision quantization. - Returns: An OpQuantizationConfig config object and a list of OpQuantizationConfig objects. + Returns: + Tuple[OpQuantizationConfig, List[OpQuantizationConfig], OpQuantizationConfig]: + An OpQuantizationConfig config object and a list of OpQuantizationConfig objects. """ @@ -122,14 +125,15 @@ def generate_tpc(default_config: OpQuantizationConfig, Generates TargetPlatformCapabilities with default defined Operators Sets, based on the given base configuration and mixed-precision configurations options list. - Args - default_config: A default OpQuantizationConfig to set as the TP model default configuration. - base_config: An OpQuantizationConfig to set as the TargetPlatformCapabilities base configuration for mixed-precision purposes only. - mixed_precision_cfg_list: A list of OpQuantizationConfig to be used as the TP model mixed-precision + Args: + default_config (OpQuantizationConfig): A default OpQuantizationConfig to set as the TP model default configuration. + base_config (OpQuantizationConfig): An OpQuantizationConfig to set as the TargetPlatformCapabilities base configuration for mixed-precision purposes only. + mixed_precision_cfg_list (List[OpQuantizationConfig]): A list of OpQuantizationConfig to be used as the TP model mixed-precision quantization configuration options. - name: The name of the TargetPlatformCapabilities. + name (str): The name of the TargetPlatformCapabilities. - Returns: A TargetPlatformCapabilities object. + Returns: + TargetPlatformCapabilities: A TargetPlatformCapabilities object. """ # Create a QuantizationConfigOptions, which defines a set diff --git a/tests_pytest/common_tests/unit_tests/target_platform_capabilities/test_tpc_take.py b/tests_pytest/common_tests/unit_tests/target_platform_capabilities/test_tpc_take.py new file mode 100644 index 000000000..e6cce1e0c --- /dev/null +++ b/tests_pytest/common_tests/unit_tests/target_platform_capabilities/test_tpc_take.py @@ -0,0 +1,29 @@ +# Copyright 2025 Sony Semiconductor Solutions, Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +from model_compression_toolkit import get_target_platform_capabilities + + +def test_take(): + + tpc = get_target_platform_capabilities(tpc_version='6.0', device_type='imx500') + assert 'Take' in [opset.name for opset in tpc.operator_set] + + for opset in tpc.operator_set: + if opset.name == 'Take': + for qc in opset.qc_options.quantization_configurations: + assert qc.default_weight_attr_config.enable_weights_quantization == False + assert qc.enable_activation_quantization == False + assert qc.quantization_preserving == True + assert qc.supported_input_activation_n_bits == (8, 16) \ No newline at end of file diff --git a/tests_pytest/network_deployment/network_deployment_tests.py b/tests_pytest/network_deployment/network_deployment_tests.py new file mode 100644 index 000000000..a825a79d8 --- /dev/null +++ b/tests_pytest/network_deployment/network_deployment_tests.py @@ -0,0 +1,109 @@ +# Copyright 2025 Sony Semiconductor Solutions, Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +import os +import shutil +import subprocess +import sys +import numpy as np +from torchvision.models import mobilenet_v2 + +import model_compression_toolkit as mct +from model_compression_toolkit import get_target_platform_capabilities +from model_compression_toolkit.target_platform_capabilities.constants import IMX500_TP_MODEL + + +class NetworkDeploymentBaseTest: + + def __init__(self, + tpc_version, + device_type=IMX500_TP_MODEL, + save_folder='./', + input_shape=(3, 224, 224), + batch_size=1, + num_calibration_iter=1, + num_of_inputs=1): + self.tpc_version = tpc_version + self.device_type = device_type + self.save_folder = save_folder + self.input_shape = (batch_size,) + input_shape + self.num_calibration_iter = num_calibration_iter + self.num_of_inputs = num_of_inputs + + def get_input_shapes(self): + return [self.input_shape for _ in range(self.num_of_inputs)] + + def generate_inputs(self): + return [np.random.randn(*in_shape) for in_shape in self.get_input_shapes()] + + def representative_data_gen(self): + for _ in range(self.num_calibration_iter): + yield self.generate_inputs() + + def get_tpc(self): + return get_target_platform_capabilities(tpc_version=self.tpc_version, device_type=self.device_type) + + def run_mct(self, tpc, float_model, onnx_path): + quantized_model, _ = mct.ptq.pytorch_post_training_quantization(in_module=float_model, + representative_data_gen=self.representative_data_gen, + target_platform_capabilities=tpc) + + # Save ONNX model + mct.exporter.pytorch_export_model(quantized_model, save_model_path=onnx_path, + repr_dataset=self.representative_data_gen) + + def check_libs(self): + # Check if Java is installed + result = subprocess.run(["java", "-version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + if result.returncode != 0: + raise SystemExit("Stopping execution: Java is not installed.") + + # Check if IMX500 Converter is installed + result = subprocess.run(["imxconv-pt", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + if result.returncode != 0: + raise SystemExit("Stopping execution: IMX500 Converter is not installed.") + + def run_test(self, float_model): + os.makedirs(self.save_folder, exist_ok=True) + onnx_path = os.path.join(self.save_folder, 'qmodel.onnx') + + tpc = self.get_tpc() + self.run_mct(tpc=tpc, float_model=float_model, onnx_path=onnx_path) + + # Check if Java and IMX500 Converter is installed + self.check_libs() + + # Run IMX500 Converter + cmd = ["imxconv-pt", "-i", onnx_path, "-o", self.save_folder, "--overwrite-output"] + + env_bin_path = os.path.dirname(sys.executable) + os.environ["PATH"] = f"{env_bin_path}:{os.environ['PATH']}" + env = os.environ.copy() + + subprocess.run(cmd, env=env, check=True) + + os.path.exists(self.save_folder + '/qmodel.pbtxt') + + # Remove the folder for the next test + shutil.rmtree(self.save_folder) + + +def test_network_deployment_tpc_version(): + + tpc_version = os.getenv("TPC_VERSION") # Get version from GitHub CI + float_model = mobilenet_v2() + save_folder = './mobilenet_pt' + + NetworkDeploymentBaseTest(tpc_version=tpc_version, device_type=IMX500_TP_MODEL, + save_folder=save_folder).run_test(float_model) \ No newline at end of file