2from typing
import Dict, List, Optional
3from typeguard
import typechecked
16 @brief Configuration for calibration during quantization.
18 @details Defines calibration and quantization parameterization used to derive activation/weight scales and related
19 statistics during quantized compilation.
23 method_list = [
"WChALayer",
"WChAMulti",
"WChALayerZeropoint",
"WChAMultiZeropoint"]
24 output_list = [
"Layer",
"Ch",
"Sigmoid"]
35 "quantization_method": 1,
36 "quantization_output": 0,
37 "quantization_mode": 2,
44 "hist_num_cluster": 4,
45 "hist_search_percentile_min": 0.9999,
47 "hist_adjust_coeff": 0.5,
48 "act_scale_min": 0.0005,
49 "weight_scale_min": 1e-6,
51 "layer_overrides": {
"actScaleMin": {
"0.0005": []}},
55 "quantization_method":
"method",
56 "quantization_output":
"output",
57 "quantization_mode":
"mode",
58 "percentile":
"percentile",
59 "topk_ratio":
"topKRatio",
60 "max_each":
"maxEach",
61 "max_total":
"maxTotal",
62 "kernel_size":
"kernelSize",
63 "stack_size":
"stackSize",
64 "hist_num_cluster":
"numCluster",
65 "hist_search_percentile_min":
"searchPercentileMin",
66 "hist_epsilon":
"epsilon",
67 "hist_adjust_coeff":
"adjustCoeff",
68 "act_scale_min":
"actScaleMin",
69 "weight_scale_min":
"weightScaleMin",
70 "min_clip_ratio":
"minClipRatio",
74 "quantization_method": [0, 3],
75 "quantization_output": [0, 2],
76 "quantization_mode": [0, 5],
79 "max_each": [0,
None],
80 "max_total": [0,
None],
81 "kernel_size": [0,
None],
82 "stack_size": [0,
None],
83 "hist_num_cluster": [0,
None],
84 "hist_search_percentile_min": [0, 1],
85 "hist_epsilon": [0, 1],
86 "hist_adjust_coeff": [0,
None],
87 "act_scale_min": [0, 1],
88 "weight_scale_min": [0, 1],
89 "min_clip_ratio": [-1, 1],
94 quantization_method: int,
95 quantization_output: int,
96 quantization_mode: int,
97 percentile: numbers.Number,
98 topk_ratio: numbers.Number,
103 hist_num_cluster: int,
104 hist_search_percentile_min: numbers.Number,
105 hist_epsilon: numbers.Number,
106 hist_adjust_coeff: numbers.Number,
107 act_scale_min: numbers.Number,
108 weight_scale_min: numbers.Number,
109 min_clip_ratio: numbers.Number,
110 layer_overrides: Dict,
111 optional: bool = optional,
114 @brief Initialize the CalibrationConfig.
116 @param quantization_method int. Calibration method index:<br>
117 0: WChALayer - Weight per-channel, Activation per-layer.<br>
118 1: WChAMulti - Weight per-channel, Activation multi-layer.<br>
119 2: WChALayerZeropoint - Weight per-channel, Activation per-layer with zeropoint.<br>
120 3: WChAMultiZeropoint - Weight per-channel, Activation multi-layer with zeropoint.<br>
121 @param quantization_output int. Output quantization type index:<br>
122 0: Layer - Per-layer quantization.<br>
123 1: Ch - Per-channel quantization.<br>
124 2: Sigmoid - Sigmoid-based quantization.<br>
125 @param quantization_mode int. Quantization mode index:<br>
128 2: maxPercentile.<br>
129 3: fastPercentile.<br>
132 @param percentile float. Percentile value used when @p quantization_mode is 0 (percentile).
133 @param topk_ratio float. Top-k ratio used when @p quantization_mode is 2 (maxPercentile).
134 @param max_each int. Maximum number of samples processed per iteration.
135 @param max_total int. Total maximum number of samples processed across all iterations.
136 @param kernel_size int. Kernel size used for fast distribution estimation (typically for @p quantization_mode 3).
137 @param stack_size int. Stack size used for fast distribution estimation (typically for @p quantization_mode 3).
138 @param hist_num_cluster int. Number of clusters/bins used in histogram-based calibration modes.
139 @param hist_search_percentile_min float. Minimum search percentile for histogram-based calibration.
140 @param hist_epsilon float. Numerical epsilon used in histogram-based calibration to avoid instability.
141 @param hist_adjust_coeff float. Adjustment coefficient applied in histogram-based calibration.
142 @param act_scale_min float. Minimum allowed activation scale (lower bound clamp).
143 @param weight_scale_min float. Minimum allowed weight scale (lower bound clamp).
144 @param min_clip_ratio float. Minimum clip ratio constraint applied during calibration.
145 @param layer_overrides Dict. Layer-specific override settings. Keys are layer identifiers; values override one or more
146 calibration parameters for the specified layer.
147 @param optional bool. Indicates whether this config is optional. Use the default value defined as a class variable.
167 self.check_valid(except_list=[
"optional",
"layer_overrides"])
170 def default_config(cls):
174 def from_kwargs(cls, **kwargs):
176 updated_kwargs = dict()
179 updated_kwargs[key] = kwargs[key]
180 params[key] = kwargs[key]
183 return cls(**params, optional=cls.
optional)
186 f
"Please review the configuration kwargs passed to {cls.__name__}. These kwargs were updated and will be used: {updated_kwargs}"
191 """Create CalibrationConfig from dictionary (JSON structure)"""
195 if "method" in config_dict:
196 params[
"quantization_method"] = config_dict[
"method"]
197 if "output" in config_dict:
198 params[
"quantization_output"] = config_dict[
"output"]
199 if "mode" in config_dict:
200 params[
"quantization_mode"] = config_dict[
"mode"]
203 if "percentile" in config_dict:
204 percentile_config = config_dict[
"percentile"]
205 if "percentile" in percentile_config:
206 params[
"percentile"] = percentile_config[
"percentile"]
207 if "max" in percentile_config:
208 max_config = percentile_config[
"max"]
209 if "topKRatio" in max_config:
210 params[
"topk_ratio"] = max_config[
"topKRatio"]
211 if "maxEach" in max_config:
212 params[
"max_each"] = max_config[
"maxEach"]
213 if "maxTotal" in max_config:
214 params[
"max_total"] = max_config[
"maxTotal"]
217 if "fastDist" in config_dict:
218 fast_dist = config_dict[
"fastDist"]
219 if "kernelSize" in fast_dist:
220 params[
"kernel_size"] = fast_dist[
"kernelSize"]
221 if "stackSize" in fast_dist:
222 params[
"stack_size"] = fast_dist[
"stackSize"]
225 if "histogram" in config_dict:
226 histogram = config_dict[
"histogram"]
227 if "numCluster" in histogram:
228 params[
"hist_num_cluster"] = histogram[
"numCluster"]
229 if "searchPercentileMin" in histogram:
230 params[
"hist_search_percentile_min"] = histogram[
"searchPercentileMin"]
231 if "epsilon" in histogram:
232 params[
"hist_epsilon"] = histogram[
"epsilon"]
233 if "adjustCoeff" in histogram:
234 params[
"hist_adjust_coeff"] = histogram[
"adjustCoeff"]
237 if "actScaleMin" in config_dict:
238 params[
"act_scale_min"] = config_dict[
"actScaleMin"]
239 if "weightScaleMin" in config_dict:
240 params[
"weight_scale_min"] = config_dict[
"weightScaleMin"]
241 if "minclipRatio" in config_dict:
242 params[
"min_clip_ratio"] = config_dict[
"minclipRatio"]
243 if "layerOverrides" in config_dict:
244 params[
"layer_overrides"] = config_dict[
"layerOverrides"]
278 "percentileMin": 0.9999,
279 "percentileMax": 0.999999,
281 "kurtosisMax": 1000.0,
292 @brief Configuration for bit precision.
293 @details Defines bit-width parameterization for activations and weights used in mixed-precision quantization (e.g., attention and FFN components).
302 "output_act_bits": 16,
305 "query_weight_bits": 8,
306 "key_weight_bits": 8,
307 "value_weight_bits": 8,
308 "output_weight_bits": 8,
309 "ffn_weight_bits": 8,
310 "head_weight_bits": 8,
311 "mixed_precision_apply":
False,
314 "activation_16bits": [],
319 "query_act_bits":
"queryActBits",
320 "key_act_bits":
"keyActBits",
321 "value_act_bits":
"valueActBits",
322 "output_act_bits":
"outputActBits",
323 "ffn_act_bits":
"ffnActBits",
324 "head_act_bits":
"headActBits",
325 "query_weight_bits":
"queryWeightBits",
326 "key_weight_bits":
"keyWeightBits",
327 "value_weight_bits":
"valueWeightBits",
328 "output_weight_bits":
"outputWeightBits",
329 "ffn_weight_bits":
"ffnWeightBits",
330 "head_weight_bits":
"headWeightBits",
331 "mixed_precision_apply":
"mixedPrecisionApply",
332 "save_path":
"savePath",
333 "load_path":
"loadPath",
338 "query_act_bits": [1,
None],
339 "key_act_bits": [1,
None],
340 "value_act_bits": [1,
None],
341 "output_act_bits": [1,
None],
342 "ffn_act_bits": [1,
None],
343 "head_act_bits": [1,
None],
344 "query_weight_bits": [1,
None],
345 "key_weight_bits": [1,
None],
346 "value_weight_bits": [1,
None],
347 "output_weight_bits": [1,
None],
348 "ffn_weight_bits": [1,
None],
349 "head_weight_bits": [1,
None],
357 output_act_bits: int,
360 query_weight_bits: int,
361 key_weight_bits: int,
362 value_weight_bits: int,
363 output_weight_bits: int,
364 ffn_weight_bits: int,
365 head_weight_bits: int,
366 mixed_precision_apply: bool,
369 activation_16bits: List[str],
370 weight_16bits: List[str],
371 optional: bool = optional,
374 @brief Initialize the BitConfig.
376 @param query_act_bits int. Query activation bit-width.
377 @param key_act_bits int. Key activation bit-width.
378 @param value_act_bits int. Value activation bit-width.
379 @param output_act_bits int. Output activation bit-width.
380 @param ffn_act_bits int. FFN activation bit-width.
381 @param head_act_bits int. Head activation bit-width.
382 @param query_weight_bits int. Query weight bit-width.
383 @param key_weight_bits int. Key weight bit-width.
384 @param value_weight_bits int. Value weight bit-width.
385 @param output_weight_bits int. Output weight bit-width.
386 @param ffn_weight_bits int. FFN weight bit-width.
387 @param head_weight_bits int. Head weight bit-width.
388 @param mixed_precision_apply bool. If true, apply mixed-precision according to the specified bit-widths.
389 @param save_path str. (optional) Path to save the bit allocation. If empty, the allocation is not saved.
390 @param load_path str. (optional) Path to load the bit allocation. If empty, allocation is not loaded.
391 @param activation_16bits List[str]. (optional) Layer names to force 16-bit activations.
392 @param weight_16bits List[str]. (optional) Layer names to force 16-bit weights.
412 self.check_valid(except_list=[
"optional",
"activation_16bits",
"weight_16bits"])
415 def default_config(cls):
419 def from_kwargs(cls, **kwargs):
421 updated_kwargs = dict()
424 updated_kwargs[key] = kwargs[key]
425 params[key] = kwargs[key]
428 return cls(**params, optional=cls.
optional)
431 f
"Please review the configuration kwargs passed to {cls.__name__}. These kwargs were updated and will be used: {updated_kwargs}"
436 """Create BitConfig from dictionary (JSON structure)"""
440 if "transformer" in config_dict:
441 transformer = config_dict[
"transformer"]
444 if "activation" in transformer:
445 activation = transformer[
"activation"]
446 if "query" in activation:
447 params[
"query_act_bits"] = activation[
"query"]
448 if "key" in activation:
449 params[
"key_act_bits"] = activation[
"key"]
450 if "value" in activation:
451 params[
"value_act_bits"] = activation[
"value"]
452 if "output" in activation:
453 params[
"output_act_bits"] = activation[
"output"]
454 if "ffn" in activation:
455 params[
"ffn_act_bits"] = activation[
"ffn"]
456 if "head" in activation:
457 params[
"head_act_bits"] = activation[
"head"]
460 if "weight" in transformer:
461 weight = transformer[
"weight"]
462 if "query" in weight:
463 params[
"query_weight_bits"] = weight[
"query"]
465 params[
"key_weight_bits"] = weight[
"key"]
466 if "value" in weight:
467 params[
"value_weight_bits"] = weight[
"value"]
468 if "output" in weight:
469 params[
"output_weight_bits"] = weight[
"output"]
471 params[
"ffn_weight_bits"] = weight[
"ffn"]
473 params[
"head_weight_bits"] = weight[
"head"]
476 if "mixedPrecision" in transformer:
477 mixed_precision = transformer[
"mixedPrecision"]
478 if "apply" in mixed_precision:
479 params[
"mixed_precision_apply"] = mixed_precision[
"apply"]
482 if "saveInfo" in config_dict:
483 save_info = config_dict[
"saveInfo"]
484 if "savePath" in save_info:
485 params[
"save_path"] = save_info[
"savePath"]
486 if "loadPath" in save_info:
487 params[
"load_path"] = save_info[
"loadPath"]
490 if "layerOverrides" in config_dict:
491 layer_overrides = config_dict[
"layerOverrides"]
492 if "activation16Bits" in layer_overrides:
493 params[
"activation_16bits"] = layer_overrides[
"activation16Bits"]
494 if "weight16Bits" in layer_overrides:
495 params[
"weight_16bits"] = layer_overrides[
"weight16Bits"]
525 "importanceThreshold_low": -1,
526 "importanceThreshold_high": -1,
542 @brief Unified quantization configuration.
544 @details Groups calibration and bit-precision configurations into a single configuration.
549 "calibration":
"calibration",
559 calibration: Optional[CalibrationConfig] =
None,
560 bit: Optional[BitConfig] =
None,
563 @brief Initialize the QuantizationConfig.
564 @param calibration CalibrationConfig. Calibration configuration.
565 @param bit BitConfig. Bit precision configuration.
568 self.
calibration = calibration
or CalibrationConfig.default_config()
569 self.
bit = bit
or BitConfig.default_config()
572 def default_config(cls):
574 calibration=CalibrationConfig.default_config(),
575 bit=BitConfig.default_config(),
580 def from_kwargs(cls, **kwargs):
582 calibration=CalibrationConfig.from_kwargs(**kwargs),
583 bit=BitConfig.from_kwargs(**kwargs),
588 def from_dict(cls, config_dict: dict):
589 calibration_dict = config_dict.get(
"calibration", {})
590 bit_dict = config_dict.get(
"bit", {})
593 calibration=CalibrationConfig.from_dict(calibration_dict),
594 bit=BitConfig.from_dict(bit_dict),
601 "bit": self.
bit.to_dict(),
608 @brief Create CalibrationConfig with partial parameters merged with defaults.
610 params = CalibrationConfig.DEFAULTS.copy()
611 params.update(kwargs)
617 @brief Create BitConfig with partial parameters merged with defaults.
619 params = BitConfig.DEFAULTS.copy()
620 params.update(kwargs)
621 return BitConfig(**params, optional=BitConfig.optional)
625 calibration: Optional[CalibrationConfig] =
None,
626 bit: Optional[BitConfig] =
None,
627) -> QuantizationConfig:
629 @brief Create QuantizationConfig with partial parameters merged with defaults.
632 calibration=calibration, bit=bit, optional=QuantizationConfig.optional
Configuration for bit precision.
Configuration for calibration during quantization.
Unified quantization configuration.
from_dict(cls, dict config_dict)
Create BitConfig from dictionary (JSON structure)
hist_search_percentile_min
__init__(self, int query_act_bits, int key_act_bits, int value_act_bits, int output_act_bits, int ffn_act_bits, int head_act_bits, int query_weight_bits, int key_weight_bits, int value_weight_bits, int output_weight_bits, int ffn_weight_bits, int head_weight_bits, bool mixed_precision_apply, str save_path, str load_path, List[str] activation_16bits, List[str] weight_16bits, bool optional=optional)
Initialize the BitConfig.
from_dict(cls, dict config_dict)
Create CalibrationConfig from dictionary (JSON structure)
BitConfig get_bit_config(**kwargs)
Create BitConfig with partial parameters merged with defaults.
CalibrationConfig get_calibration_config(**kwargs)
Create CalibrationConfig with partial parameters merged with defaults.
__init__(self, bool optional, Optional[CalibrationConfig] calibration=None, Optional[BitConfig] bit=None)
Initialize the QuantizationConfig.
QuantizationConfig get_quantization_config(Optional[CalibrationConfig] calibration=None, Optional[BitConfig] bit=None)
Create QuantizationConfig with partial parameters merged with defaults.
__init__(self, int quantization_method, int quantization_output, int quantization_mode, numbers.Number percentile, numbers.Number topk_ratio, int max_each, int max_total, int kernel_size, int stack_size, int hist_num_cluster, numbers.Number hist_search_percentile_min, numbers.Number hist_epsilon, numbers.Number hist_adjust_coeff, numbers.Number act_scale_min, numbers.Number weight_scale_min, numbers.Number min_clip_ratio, Dict layer_overrides, bool optional=optional)
Initialize the CalibrationConfig.