1from typeguard
import typechecked
2from .
import ConfigABC, is_valid_dir_path, check_save_path
3from .resource_management_config
import ResourceManagementConfig
4from .quantization_config
import QuantizationConfig
5from .advanced_quantization_config
import AdvancedQuantizationConfig
6from .llm_config
import LlmConfig
7from .input_process_config
import (
9 get_input_process_config,
13from typing
import List, Optional
17from qbcompiler.calibration.utils_calib
import (
18 list_calib_files_in_json,
19 list_calib_files_in_txt,
22 get_calib_paths_for_multi_shape,
24from qbcompiler.version
import __version__
25from qbcompiler.logging
import get_logger
27logger = get_logger(__name__)
29_OUTDATED_KWARG_CONFIG_WARNING = [
"is_quant_ch"]
31_OUTDATED_KWARG_CONFIG_ERRORS = {
32 "quant_output":
"The 'quant_output' argument has been removed. Use just 'quantization_output' instead \n"
33 "output (int): Output quantization type index\n"
34 "0: Layer - Per-layer quantization\n"
35 "1: Ch - Per-channel quantization\n"
36 "2: Sigmoid - Sigmoid-based quantization\n By default, this option is set to 0 (Layer).",
37 "quantize_percentile":
"The 'quantize_percentile' argument has been removed. Use just 'percentile' instead.",
38 "is_asym_quant":
"'is_asym_quant' is deprecated_option, use 'quantization_method' instead, The quantization_method option only takes integers.\n"
39 "quantization_method (int): Calibration method index\n"
40 "0: Symmetric per tensor quantization\n"
41 "1: Symmetric per channel quantization\n"
42 "2: Asymmetric per tensor quantization \n"
43 "3: Asymmetric per channel quantization \n By default, this option is set to 1.",
44 "is_quant_ch":
"'is_quant_ch' is deprecated_option, use 'quantization_method' instead, The quantization_method option only takes integers. \n"
45 "quantization_method (int): Calibration method index\n"
46 "0: Symmetric per tensor quantization\n"
47 "1: Symmetric per channel quantization\n"
48 "2: Asymmetric per tensor quantization \n"
49 "3: Asymmetric per channel quantization \nIf is_quant_ch is provided, quantization_method is set to 1 when True and 0 when False automatically.",
50 "smooth_factor":
"'smooth_factor' is deprecated and cannot be used anymore.",
51 "quantize_method":
"'quantize_method' is deprecated_option, use 'quantization_mode' instead. The quantization_mode option only takes integers.\n"
52 "quantization_mode (int): Quantization mode index\n"
55 "2: histogram\n By default, this option is set to 1 (maxPercentile).",
68 "calib_data_path":
"calibData",
69 "save_path":
"savePath",
70 "model_nickname":
"modelNickname",
71 "save_msgpack_name":
"saveMsgpackName",
72 "model_path":
"modelPath",
73 "inference_scheme":
"inferenceScheme",
74 "save_sample":
"saveSample",
75 "cpu_offload":
"cpuOffload",
76 "optimize_option":
"optimizeOption",
77 "sample_dtype":
"sampleDtype",
80 min_max_check = {
"optimize_option": [0,
None]}
81 inference_scheme_types = [
"single",
"multi",
"global",
"global4",
"global8",
"all"]
82 sample_dtypes = [
"float",
"int8"]
84 @brief Unified compilation configuration object for Mobilint MXQ compilation.
86 @details This config consolidates compilation-related parameters and sub-config class into a single structure.
92 calib_data_path: str |
None,
93 use_random_calib: bool,
96 save_msgpack_name: str |
None,
97 model_path: str |
None,
98 inference_scheme: str,
101 optimize_option: int,
105 input_shape_dict: dict,
106 resource_management: ResourceManagementConfig,
107 quantization: QuantizationConfig,
108 advanced_quantization: AdvancedQuantizationConfig,
109 llm_config: LlmConfig,
110 input_process: InputProcessConfig,
111 optional: bool = optional,
114 @brief Unified compilation configuration object for Mobilint MXQ compilation.
115 @param calib_data_path str | None.
116 Path to calibration dataset. Accepts either:<br>
117 - a directory containing pre-processed NumPy samples, or<br>
118 - a .txt/.json meta file listing NumPy sample file paths.<br>
119 If @p use_random_calib is True, this may be None. Otherwise, a valid path is expected for
120 quantized compilation workflows.
121 @param use_random_calib bool.
122 When True, uses randomly generated calibration samples (typically for smoke testing and
123 compilability validation). When False, @p calib_data_path is used as the calibration source.
124 @param save_path str.
125 Output MXQ filename/path to generate.
126 @param model_nickname str.
127 Model nickname used as a fallback identifier when intermediate results need to be saved.
128 It is recommended to set this to the filename component of @p save_path.
129 @param save_msgpack_name str | None.
130 filename/path to save an intermediate serialized representation (msgpack) of the
131 high-level compiled model/graph. Primarily intended for debugging and is now rarely used.
132 @param model_path str | None. (deprecated) Outdated argument. Please refer to the model usage in the @p mxq_compile function.
133 @param inference_scheme str.
134 NPU inference scheme string. Must be one of:<br>
135 @c "single", @c "multi", @c "global", @c "global4", @c "global8" (@c "global" and @c "global8" behave identically).
136 @param save_sample bool.
137 When True, saves representative input/output tensors for debugging.
138 @param cpu_offload bool.
139 Enables CPU offload for unsupported operator groups/segments during NPU inference.
140 This is a beta feature and is recommended only for special cases.
141 @param optimize_option int. Compiler optimization selector.
142 @param sample_dtype string. Data type for saved sample inference outputs: "float" or "int8".
143 Primarily intended for debugging and is now rarely used.
144 @param buffer_mode int.
145 Buffer serialization mode for saving .mblt file. Common conventions:<br>
146 - 0: naïve buffer serialization<br>
147 - 1: mmap-backed buffer serialization<br>
148 @param version str. qbcompiler version.
149 @param input_shape_dict dict. Optional HWC input shape dictionary used for multi-shape compilation (for example {"input0": [[224, 224, 3], [256, 256, 3]]}).
150 @param resource_management ResourceManagementConfig.
151 Resource management configuration class.
152 @param quantization QuantizationConfig.
153 Quantization configuration class (e.g., calibration strategy, bit-widths, per-tensor/per-channel
154 settings, quantization scheme/policies).
155 @param advanced_quantization AdvancedQuantizationConfig.
156 Advanced quantization configuration block for fine-grained or experimental controls beyond the basic quantization settings.
157 @param llm_config LlmConfig. LLM-specific configuration class.
158 @param input_process InputProcessConfig. Unified input processing configuration containing
159 uint8 input handling, image channels, and preprocessing pipeline settings.
160 optional bool. Indicates whether this config is optional. Use the default value defined as a class variable.
165 calib_data_path, use_random_calib, input_shape_dict
190 "resource_management",
192 "advanced_quantization",
204 Create default config with optional parameter overrides.
207 **kwargs: Parameters to override defaults
211 "calib_data_path":
None,
212 "use_random_calib":
False,
213 "save_path":
"./tmp.mxq",
214 "save_msgpack_name":
None,
215 "model_nickname":
"temporary",
217 "inference_scheme":
"single",
218 "save_sample":
False,
219 "cpu_offload":
False,
220 "optimize_option": 1,
221 "sample_dtype":
"float",
223 "input_shape_dict": dict(),
224 "version": __version__,
225 "resource_management": ResourceManagementConfig.default_config(),
226 "quantization": QuantizationConfig.default_config(),
227 "advanced_quantization": AdvancedQuantizationConfig.default_config(),
228 "llm_config": LlmConfig.default_config(),
229 "input_process": InputProcessConfig.default_config(),
233 defaults.update({k: v
for k, v
in kwargs.items()
if v
is not None})
240 Load config from JSON file and merge with additional kwargs.
243 json_path: Path to JSON configuration file
244 **kwargs: Additional compile-time parameters (calib_data_path, save_path, etc.)
246 with open(json_path,
"r")
as f:
247 config_dict = json.load(f)
250 resource_management = ResourceManagementConfig.from_dict(
251 config_dict.get(
"resourceManagement", {})
253 quantization = QuantizationConfig.from_dict(config_dict.get(
"quantization", {}))
254 advanced_quantization = AdvancedQuantizationConfig.from_dict(
255 config_dict.get(
"advancedQuantization", {})
257 llm_config = LlmConfig.from_dict(config_dict.get(
"llmConfig", {}))
258 input_process = InputProcessConfig.from_dict(
259 config_dict.get(
"inputProcess", {})
261 input_shape_dict = config_dict.get(
"inputShapeDict", {})
265 resource_management=resource_management,
266 quantization=quantization,
267 advanced_quantization=advanced_quantization,
268 llm_config=llm_config,
269 input_process=kwargs.get(
"input_process", input_process),
270 input_shape_dict=kwargs.get(
"input_shape_dict", input_shape_dict),
273 for k, v
in kwargs.items()
274 if k
not in [
"input_shape_dict",
"input_process"]
278 def check_valid_str_configs(self):
283 if self.
inference_scheme.lower()
not in CompileConfig.inference_scheme_types:
285 f
"Inference_scheme should be one of the {CompileConfig.inference_scheme_types}"
287 if self.
sample_dtype.lower()
not in CompileConfig.sample_dtypes:
289 f
"Sample data type should be one of the {CompileConfig.sample_dtypes}"
292 raise ValueError(f
"buffer mode must be either 0 or 1")
295 compile_config_dict = dict()
296 for py_name, cpp_name
in CompileConfig.py_to_cpp_name.items():
297 value = getattr(self, py_name)
298 if isinstance(value, str)
and py_name
in [
302 value = value.lower()
303 compile_config_dict[cpp_name] = value
306 compile_config_dict[
"quant"] = dict()
308 compile_config_dict[
"quant"].update(self.
quantization.to_dict())
310 compile_config_dict[
"quant"].update(self.
llm_config.to_dict())
311 compile_config_dict[
"quant"].update(self.
input_process.to_dict())
314 return compile_config_dict
316 def _get_calibration_path(
318 calib_data_path: str,
319 use_random_calib: bool,
320 input_shape_dict: dict =
None,
322 if not calib_data_path
and not use_random_calib:
324 "Please use calib_data_path or enable use_random_calib. Do not leave calib_data_path empty while setting use_random_calib to false."
327 not calib_data_path
or use_random_calib
330 calib_data_case = check_calib_data(calib_data_path, input_shape_dict)
331 if calib_data_case == CalibType.SINGLE_DIR:
332 self.
calib_file = tempfile.NamedTemporaryFile(suffix=
".txt")
333 list_calib_files_in_txt(calib_data_path, self.
calib_file.name)
335 elif calib_data_case == CalibType.MULTI_DIR:
336 self.
calib_file = tempfile.NamedTemporaryFile(suffix=
".json")
337 list_calib_files_in_json(calib_data_path, self.
calib_file.name)
339 elif calib_data_case == CalibType.MULTI_SHAPE:
340 calib_data_path = get_calib_paths_for_multi_shape(
341 calib_data_path, input_shape_dict
343 elif calib_data_case
in (CalibType.SINGLE_TXT, CalibType.MULTI_JSON):
346 raise ValueError(f
"Got unexpected calib_data_path={calib_data_path}.")
348 return calib_data_path
352 calib_data_path=None,
353 use_random_calib=False,
354 save_path="./tmp.mxq",
355 save_msgpack_name=None,
356 model_nickname="temporary",
358 inference_scheme="single",
362 sample_dtype="float",
364 input_shape_dict=dict(),
365 resource_management_config: Optional[ResourceManagementConfig] =
None,
366 quantization_config: Optional[QuantizationConfig] =
None,
367 llm_config: Optional[LlmConfig] =
None,
368 advanced_quantization_config: Optional[AdvancedQuantizationConfig] =
None,
369 input_process_config: Optional[InputProcessConfig] =
None,
374 @brief Create Compilation Config with partial parameters merged with defaults.
376 outdated_keys = _OUTDATED_KWARG_CONFIG_ERRORS.keys() & kwargs.keys()
378 messages = [_OUTDATED_KWARG_CONFIG_ERRORS[k]
for k
in sorted(outdated_keys)]
379 full_message =
"\n".join(messages)
380 warning_keys = set(_OUTDATED_KWARG_CONFIG_WARNING)
382 if set(outdated_keys) == warning_keys:
383 for old_argument
in outdated_keys:
384 if old_argument ==
"is_quant_ch":
385 is_quant = bool(kwargs.get(
"is_quant_ch",
False))
386 kwargs[
"quantization_method"] = 1
if is_quant
else 0
388 raise NotImplementedError(
389 f
"{old_argument} should be properly mapped"
391 logger.warning(full_message)
393 error_keys = set(outdated_keys) - warning_keys
398 _OUTDATED_KWARG_CONFIG_ERRORS[k]
for k
in sorted(error_keys)
400 error_message =
"\n".join(error_messages)
401 raise ValueError(error_message)
403 if resource_management_config
is None:
404 resource_management_config = ResourceManagementConfig.from_kwargs(**kwargs)
405 if quantization_config
is None:
406 quantization_config = QuantizationConfig.from_kwargs(**kwargs)
407 if llm_config
is None:
408 llm_config = LlmConfig.from_kwargs(**kwargs)
409 if advanced_quantization_config
is None:
411 advanced_quantization_config = AdvancedQuantizationConfig.default_config()
412 if input_process_config
is None:
413 input_process_config = InputProcessConfig.default_config()
416 optional=CompileConfig.optional,
417 calib_data_path=calib_data_path,
418 use_random_calib=use_random_calib,
420 save_msgpack_name=save_msgpack_name,
421 model_nickname=model_nickname,
422 model_path=model_path,
423 inference_scheme=inference_scheme,
424 save_sample=save_sample,
425 cpu_offload=cpu_offload,
426 optimize_option=optimize_option,
427 sample_dtype=sample_dtype,
428 buffer_mode=buffer_mode,
430 input_shape_dict=input_shape_dict,
431 resource_management=resource_management_config,
432 quantization=quantization_config,
433 advanced_quantization=advanced_quantization_config,
434 llm_config=llm_config,
435 input_process=input_process_config,
from_json(cls, str json_path, **kwargs)
Load config from JSON file and merge with additional kwargs.
default_config(cls, **kwargs)
Create default config with optional parameter overrides.
__init__(self, str|None calib_data_path, bool use_random_calib, str save_path, str model_nickname, str|None save_msgpack_name, str|None model_path, str inference_scheme, bool save_sample, bool cpu_offload, int optimize_option, str sample_dtype, int buffer_mode, str version, dict input_shape_dict, ResourceManagementConfig resource_management, QuantizationConfig quantization, AdvancedQuantizationConfig advanced_quantization, LlmConfig llm_config, InputProcessConfig input_process, bool optional=optional)
Unified compilation configuration object for Mobilint MXQ compilation.
_get_calibration_path(self, str calib_data_path, bool use_random_calib, dict input_shape_dict=None)
get_compile_config(calib_data_path=None, use_random_calib=False, save_path="./tmp.mxq", save_msgpack_name=None, model_nickname="temporary", model_path=None, inference_scheme="single", save_sample=False, cpu_offload=False, optimize_option=1, sample_dtype="float", buffer_mode=1, input_shape_dict=dict(), Optional[ResourceManagementConfig] resource_management_config=None, Optional[QuantizationConfig] quantization_config=None, Optional[LlmConfig] llm_config=None, Optional[AdvancedQuantizationConfig] advanced_quantization_config=None, Optional[InputProcessConfig] input_process_config=None, version=__version__, **kwargs)
Create Compilation Config with partial parameters merged with defaults.