ai-edge-quantizer-nightly 0.3.0.dev20250805__py3-none-any.whl → 0.3.0.dev20250807__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -119,6 +119,7 @@ MIN_MAX_OP_NAME_MATERIALIZE_FUNC_DICT = {
119
119
  _TFLOpName.DIV: common_quantize.materialize_div,
120
120
  _TFLOpName.BROADCAST_TO: common_quantize.materialize_broadcast_to,
121
121
  _TFLOpName.SQRT: common_quantize.materialize_sqrt,
122
+ _TFLOpName.GATHER: common_quantize.materialize_gather,
122
123
  }
123
124
  for op_name, materialize_func in MIN_MAX_OP_NAME_MATERIALIZE_FUNC_DICT.items():
124
125
  register_quantized_op(
@@ -264,6 +265,7 @@ _OCTAV_OP_NAME_MATERIALIZE_FUNC_DICT = immutabledict({
264
265
  _TFLOpName.DIV: common_quantize.materialize_div,
265
266
  _TFLOpName.BROADCAST_TO: common_quantize.materialize_broadcast_to,
266
267
  _TFLOpName.SQRT: common_quantize.materialize_sqrt,
268
+ _TFLOpName.GATHER: common_quantize.materialize_gather,
267
269
  })
268
270
 
269
271
  for op_name, materialize_func in _OCTAV_OP_NAME_MATERIALIZE_FUNC_DICT.items():
@@ -841,6 +841,23 @@ def materialize_sqrt(
841
841
  )
842
842
 
843
843
 
844
+ def materialize_gather(
845
+ get_tensor_quant_params_fn: qtyping.GetTensorQuantParamsFuncSignature,
846
+ op_info: qtyping.OpInfo,
847
+ graph_info: qtyping.GraphInfo,
848
+ tensor_name_to_qsv: dict[str, Any],
849
+ ) -> list[qtyping.TensorTransformationParams]:
850
+ """Materialize tensors in tfl.gather."""
851
+ return common_utils.materialize_standard_op(
852
+ op_info,
853
+ graph_info,
854
+ tensor_name_to_qsv,
855
+ get_tensor_quant_params_fn,
856
+ constraint=_OpQuantConstraint.SAME_AS_INPUT_SCALE,
857
+ inputs_to_ignore=[1], # Indices do not need to be quantized.
858
+ )
859
+
860
+
844
861
  def _get_tensor_shape_for_blockwise(
845
862
  tensor_shape: Sequence[int], quantized_dim: int, block_size: int
846
863
  ) -> list[int]:
@@ -166,6 +166,7 @@ def min_max_calibrate(
166
166
  tensor_content_map: dict[str, np.ndarray],
167
167
  inputs_to_ignore: Optional[list[int]] = None,
168
168
  outputs_to_ignore: Optional[list[int]] = None,
169
+ valid_range: tuple[float, float] = (-3e38, 3e38),
169
170
  ) -> dict[str, qtyping.QSV]:
170
171
  """Collect quantization statistics variable (QSV, e.g., min/max) for the op.
171
172
 
@@ -175,11 +176,18 @@ def min_max_calibrate(
175
176
  tensor_content_map: A map of tensor name to tensor content.
176
177
  inputs_to_ignore: Input tensor indices to ignore.
177
178
  outputs_to_ignore: Output tensor indices to ignore.
179
+ valid_range: The valid range for tensor content, excluding the boundaries.
180
+ Tensor values outside this range are ignored during calibration. Defaults
181
+ to an approximate bfloat16 range. This range is chosen to address issues
182
+ with `padv2` where a bfloat16 -inf padding constant can cause problems.
183
+ Values exceeding this range can lead to quantization issues and are
184
+ therefore excluded from min/max calibration.
178
185
 
179
186
  Returns:
180
187
  A dictionary with key as tensor name and value as the collected QSV.
181
188
  """
182
189
  op_qsvs = {}
190
+ min_val, max_val = valid_range
183
191
 
184
192
  def _collect_activation_tensor_min_max(tensor_idx):
185
193
  tensor = graph_info.subgraph_tensors[tensor_idx]
@@ -191,9 +199,16 @@ def min_max_calibrate(
191
199
  return
192
200
  tensor_name = tfl_flatbuffer_utils.get_tensor_name(tensor)
193
201
  tensor_content = tensor_content_map[tensor_name]
202
+ qsv_shape = (1,) * tensor_content.ndim
203
+ filter_mask = (tensor_content > min_val) & (tensor_content < max_val)
204
+ if np.any(filter_mask):
205
+ tensor_content = tensor_content[filter_mask]
206
+ # Reshape is needed to ensure the scalar min/max have the same number of
207
+ # dimensions as the input tensor array, for compatibility with subsequent
208
+ # operations.
194
209
  op_qsvs[tensor_name] = {
195
- "min": np.min(tensor_content, axis=None, keepdims=True),
196
- "max": np.max(tensor_content, axis=None, keepdims=True),
210
+ "min": np.min(tensor_content, axis=None).reshape(qsv_shape),
211
+ "max": np.max(tensor_content, axis=None).reshape(qsv_shape),
197
212
  }
198
213
 
199
214
  inputs_to_ignore = inputs_to_ignore or []
@@ -200,6 +200,41 @@ class NaiveMinMaxQuantizeTest(parameterized.TestCase):
200
200
  self.assertEqual(quant_params.block_size, 2)
201
201
  self.assertEqual(quant_params.quantized_dimension, 1)
202
202
 
203
+ def test_calibrate_ignores_inf_min_max(self):
204
+ """Tests that calibration ignores infinity values."""
205
+ # Sample input/output data for the fc op.
206
+ input_tensor_name = "sequential/flatten/Reshape"
207
+ output_tensor_name = (
208
+ "sequential/dense/MatMul;sequential/dense/Relu;sequential/dense/BiasAdd"
209
+ )
210
+ bloat16_inf = 3.39e38
211
+ tensor_content_map = {
212
+ input_tensor_name: np.array(
213
+ [[-np.inf, 1.0, 5.0, np.inf, bloat16_inf]], dtype=np.float32
214
+ ),
215
+ output_tensor_name: np.array(
216
+ [[6.0, 7.0, -bloat16_inf, 9.0, np.inf]], dtype=np.float32
217
+ ),
218
+ }
219
+ # Read from Model Explorer.
220
+ subgraph0 = self._test_model.subgraphs[0]
221
+ fc_op = subgraph0.operators[3]
222
+ op_qsvs = naive_min_max_quantize.min_max_calibrate(
223
+ fc_op,
224
+ self._graph_info,
225
+ tensor_content_map,
226
+ inputs_to_ignore=[1, 2], # Ignore weight and bias.
227
+ outputs_to_ignore=[],
228
+ )
229
+
230
+ self.assertIn(input_tensor_name, op_qsvs)
231
+ self.assertEqual(op_qsvs[input_tensor_name]["min"], 1.0)
232
+ self.assertEqual(op_qsvs[input_tensor_name]["max"], 5.0)
233
+
234
+ self.assertIn(output_tensor_name, op_qsvs)
235
+ self.assertEqual(op_qsvs[output_tensor_name]["min"], 6.0)
236
+ self.assertEqual(op_qsvs[output_tensor_name]["max"], 9.0)
237
+
203
238
 
204
239
  if __name__ == "__main__":
205
240
  googletest.main()
@@ -256,8 +256,15 @@ def uniform_quantize(
256
256
  inverse_scales = 1.0 / scales
257
257
  # TODO: b/332574603 - support unsigned data type.
258
258
  qtype = IntType(quantization_params.num_bits, signed=True)
259
- # Symmetric means narrow range (e.g., -127 to 127)
260
- narrow_range = quantization_params.symmetric
259
+ # For quantization with more than 8 bits, symmetric narrow-range quantization
260
+ # is required due to assumptions made by legacy TFLite kernels. However, this
261
+ # method is not ideal for low-bit quantization (e.g., 2-bit quantization,
262
+ # which only has 4 bins), as it wastes a bin and there are no kernel
263
+ # requirements for a narrow range when < 8 bits because the data is unpacked
264
+ # to int8 before being used in the kernel.
265
+ narrow_range = (
266
+ quantization_params.symmetric and quantization_params.num_bits >= 8
267
+ )
261
268
  required_dtype = np.signedinteger if qtype.signed else np.unsignedinteger
262
269
  if not np.issubdtype(zero_points.dtype, required_dtype):
263
270
  raise ValueError(
@@ -123,6 +123,14 @@ class TensorUtilsTest(parameterized.TestCase):
123
123
  False,
124
124
  [-24, 10, 19, 127],
125
125
  ),
126
+ (
127
+ [-16.0, 1.3, 2.4, 16.0],
128
+ [0.12598425],
129
+ [0],
130
+ 8,
131
+ True,
132
+ [-127, 10, 19, 127], # int8 symmetric is narrow range, -127 to 127
133
+ ),
126
134
  (
127
135
  [-3.0, 1.3, 2.4, 16.0],
128
136
  [1.2666667],
@@ -137,7 +145,7 @@ class TensorUtilsTest(parameterized.TestCase):
137
145
  [-6],
138
146
  4,
139
147
  True,
140
- [-7, -5, -4, 7],
148
+ [-8, -5, -4, 7], # int4 symmetric is not narrow range, -8 to 7
141
149
  ),
142
150
  )
143
151
  def test_uniform_quantize(
@@ -192,7 +192,8 @@ DEFAULT_JSON_POLICY = """
192
192
  "UNPACK",
193
193
  "DIV",
194
194
  "BROADCAST_TO",
195
- "SQRT"
195
+ "SQRT",
196
+ "GATHER"
196
197
  ],
197
198
  "static_wi8_ai8": [
198
199
  "ADD",
@@ -233,7 +234,8 @@ DEFAULT_JSON_POLICY = """
233
234
  "UNPACK",
234
235
  "DIV",
235
236
  "BROADCAST_TO",
236
- "SQRT"
237
+ "SQRT",
238
+ "GATHER"
237
239
  ],
238
240
  "static_wi4_ai8": ["FULLY_CONNECTED", "CONV_2D", "INPUT", "OUTPUT", "EMBEDDING_LOOKUP"],
239
241
  "static_wi4_ai16": ["FULLY_CONNECTED", "CONV_2D", "INPUT", "OUTPUT", "EMBEDDING_LOOKUP"],
@@ -72,6 +72,7 @@ class TFLOperationName(str, enum.Enum):
72
72
  DIV = 'DIV'
73
73
  BROADCAST_TO = 'BROADCAST_TO'
74
74
  SQRT = 'SQRT'
75
+ GATHER = 'GATHER'
75
76
 
76
77
 
77
78
  class QuantizeMode(enum.Enum):
@@ -18,8 +18,10 @@
18
18
  from collections.abc import Iterable
19
19
  import dataclasses
20
20
  import json
21
+ import logging
21
22
  import os
22
23
  from typing import Any, Optional, Union
24
+
23
25
  from ai_edge_quantizer import algorithm_manager
24
26
  from ai_edge_quantizer import calibrator
25
27
  from ai_edge_quantizer import default_policy
@@ -57,49 +59,61 @@ class QuantizationResult:
57
59
  recipe: _QuantRecipe
58
60
  quantized_model: Optional[bytearray]
59
61
 
60
- def save(self, save_folder: str, model_name: str) -> None:
62
+ def save(
63
+ self, save_folder: str, model_name: str, overwrite: bool = False
64
+ ) -> None:
61
65
  """Saves the quantized model and the quantization recipe.
62
66
 
63
67
  Args:
64
68
  save_folder: Path to the folder to save the quantized model and the
65
69
  quantization recipe.
66
70
  model_name: Name of the model.
71
+ overwrite: Whether to overwrite the model if it already exists.
67
72
 
68
73
  Raises:
69
74
  RuntimeError: If no quantized model is available.
70
- FileExistsError: If the model already exists in the folder.
71
75
  """
72
- if self.quantized_model is None:
73
- raise RuntimeError(
74
- 'No quantized model to save. Make sure .quantize() is called.'
75
- )
76
+ if not gfile.Exists(save_folder):
77
+ gfile.MakeDirs(save_folder)
78
+
76
79
  model_save_path = os.path.join(save_folder, f'{model_name}.tflite')
77
- if gfile.Exists(model_save_path):
78
- raise FileExistsError(
79
- f'The model {model_save_path} already exists in the folder.'
80
- )
81
- with gfile.GFile(model_save_path, 'wb') as output_file_handle:
82
- output_file_handle.write(self.quantized_model)
80
+ self.export_model(model_save_path, overwrite)
83
81
 
84
- recipe = json.dumps(self.recipe)
85
82
  recipe_save_path = os.path.join(save_folder, model_name + '_recipe.json')
83
+ recipe = json.dumps(self.recipe)
86
84
  with gfile.GFile(recipe_save_path, 'w') as output_file_handle:
87
85
  output_file_handle.write(recipe)
88
86
 
89
- def export_model(self, filepath: str) -> None:
87
+ def export_model(self, filepath: str, overwrite: bool = False) -> None:
90
88
  """Exports the quantized model to a .tflite flatbuffer.
91
89
 
92
90
  Args:
93
91
  filepath: Path (including file name) that the exported model should be
94
92
  serialized to.
93
+ overwrite: Whether to overwrite the model if it already exists.
95
94
 
96
95
  Raises:
97
96
  RuntimeError: If no quantized model is available.
97
+ ValueError: If the model already exists in the folder and overwrite is
98
+ False.
98
99
  """
99
100
  if self.quantized_model is None:
100
101
  raise RuntimeError(
101
102
  'No quantized model to save. Make sure .quantize() is called.'
102
103
  )
104
+ if gfile.Exists(filepath):
105
+ if overwrite:
106
+ logging.warning(
107
+ 'The model %s already exists in the folder. Overwriting the model'
108
+ ' since overwrite=True.',
109
+ filepath,
110
+ )
111
+ else:
112
+ raise ValueError(
113
+ f'The model {filepath} already exists in the folder. Please'
114
+ ' consider change the model name or specify overwrite=True to'
115
+ ' overwrite the model if needed.'
116
+ )
103
117
  with gfile.GFile(filepath, 'wb') as output_file_handle:
104
118
  output_file_handle.write(self.quantized_model)
105
119
 
@@ -66,6 +66,7 @@ TFL_OP_NAME_TO_CODE = immutabledict.immutabledict({
66
66
  _TFLOpName.DIV: schema.BuiltinOperator.DIV,
67
67
  _TFLOpName.BROADCAST_TO: schema.BuiltinOperator.BROADCAST_TO,
68
68
  _TFLOpName.SQRT: schema.BuiltinOperator.SQRT,
69
+ _TFLOpName.GATHER: schema.BuiltinOperator.GATHER,
69
70
  })
70
71
 
71
72
  TFL_OP_CODE_TO_NAME = immutabledict.immutabledict(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ai-edge-quantizer-nightly
3
- Version: 0.3.0.dev20250805
3
+ Version: 0.3.0.dev20250807
4
4
  Summary: A quantizer for advanced developers to quantize converted AI Edge models.
5
5
  Home-page: https://github.com/google-ai-edge/ai-edge-quantizer
6
6
  Keywords: On-Device ML,AI,Google,TFLite,Quantization,LLMs,GenAI
@@ -1,19 +1,19 @@
1
1
  ai_edge_quantizer/__init__.py,sha256=4pFSkukSwahYyzwqia0yPRyz8TnFQfGRthVJhYpMWas,793
2
- ai_edge_quantizer/algorithm_manager.py,sha256=wgC3g7hHvEM1fXARQsT3UgR5YLJqdQ4BLIPicn_bTvM,12932
2
+ ai_edge_quantizer/algorithm_manager.py,sha256=40dFnpjsFKeEYL6eJ_oPwciU-rZ6hPw-esrc3hifvx8,13050
3
3
  ai_edge_quantizer/algorithm_manager_api.py,sha256=u903TG0s1uIDhJqfeJne3CFl8A93phZrwgV2-hwdcXU,9247
4
4
  ai_edge_quantizer/algorithm_manager_api_test.py,sha256=w6bSONvXkX6bzXAGc0-7b6gNDt9oz9ieq97KP8Sg_JU,7666
5
5
  ai_edge_quantizer/calibrator.py,sha256=Sms7_AIHPH9G5xFaz5Ef3a5gPhxuIWQI8d2LUM8C96I,12071
6
6
  ai_edge_quantizer/calibrator_test.py,sha256=ejKc5YC7id8J1Ll9HAYCzMnKzxd0FUENSD06zkSSV0c,11900
7
7
  ai_edge_quantizer/conftest.py,sha256=SxCz-5LlRD_lQm4hQc4c6IGG7DS8d7IyEWY9gnscPN0,794
8
- ai_edge_quantizer/default_policy.py,sha256=djOEFPStjcDLoqNwK4RH_lfWJmdCLLixhCLwa3mN8pQ,11438
8
+ ai_edge_quantizer/default_policy.py,sha256=qrEkZpe1OfzR2VvsQvzdsBzga1R5k6LyktarY9ETp7U,11470
9
9
  ai_edge_quantizer/model_modifier.py,sha256=teGa8I6kGvn6TQY6Xv53YFIc_pQEhNvM9Zb4bvhezyw,7110
10
10
  ai_edge_quantizer/model_modifier_test.py,sha256=cJd04SLOG-fQZZNZPcisoBLx3cLtWEwGqUBbLb-pif4,4751
11
11
  ai_edge_quantizer/model_validator.py,sha256=Hj0_5o-Oa3dSlJ3ryVjRhvsyelHNyek1GrtG9buMczg,13153
12
12
  ai_edge_quantizer/model_validator_test.py,sha256=EeqOP_mrZsnZ3rug756s0ryDDqd2KgIDld5Lm_gDuWY,13020
13
13
  ai_edge_quantizer/params_generator.py,sha256=hcgMHJlERZERUyIAEi6AHJcLJ8gsKIBAEojzFFz-tqk,20098
14
14
  ai_edge_quantizer/params_generator_test.py,sha256=RDYoRZDJfEZRtjlTAU2kZ_4t3JHOqEHxfJX9V4ETAhg,40597
15
- ai_edge_quantizer/qtyping.py,sha256=8sCBPI3IuIHaT4NrMZrLH6Hp_fkrVP8NEQC5zvHG-UU,16702
16
- ai_edge_quantizer/quantizer.py,sha256=g3DMqFMrMpt9jQttCE0WcdNbMtk0JZnmN5MmCHrNdyM,13202
15
+ ai_edge_quantizer/qtyping.py,sha256=t7S5wTjg6VFmKYzeM_qymu36tT18rnkmY-4YOXMQxzc,16722
16
+ ai_edge_quantizer/quantizer.py,sha256=WeKwhh8cYZ07DUwvS0S1EdNzEZSfPODlynqIBvJ-Br4,13624
17
17
  ai_edge_quantizer/quantizer_test.py,sha256=K_HBA56JkFI3HL8VLWCqGEfC0ISh5ldMKoNyBdGRAJg,20368
18
18
  ai_edge_quantizer/recipe.py,sha256=FR0uJceumZrnle2VRSOQZ1uXup4S1cTYKRH-N53mWRo,2919
19
19
  ai_edge_quantizer/recipe_manager.py,sha256=qcGUD7e7BISKdsY9WH2rdaRR3acmzSA5qMezGNbzlpo,8931
@@ -28,18 +28,18 @@ ai_edge_quantizer/algorithms/nonlinear_quantize/__init__.py,sha256=lpq1g2ayg3lCP
28
28
  ai_edge_quantizer/algorithms/nonlinear_quantize/float_casting.py,sha256=Bs9CK7wZAw6jNaZ8xEtbwO2vM34VYXNZSMVWvxJo9nw,9297
29
29
  ai_edge_quantizer/algorithms/nonlinear_quantize/float_casting_test.py,sha256=EqIHGEZ1LgUrTN7zf880RuAzEv3Qy7kgh5ivObJGHSo,22646
30
30
  ai_edge_quantizer/algorithms/uniform_quantize/__init__.py,sha256=lpq1g2ayg3lCPLy79t2VicYcnGKw64FfYIj1V7J-4m8,676
31
- ai_edge_quantizer/algorithms/uniform_quantize/common_quantize.py,sha256=BUrGoC1TU6hD0QzqjblIs56Il7PKRfaz6s1G6nTXoio,33239
31
+ ai_edge_quantizer/algorithms/uniform_quantize/common_quantize.py,sha256=Ip9qF_P1LsTuTo0P6XnmWOqnXwxo6IKkzbRuveDKL8Q,33803
32
32
  ai_edge_quantizer/algorithms/uniform_quantize/common_quantize_test.py,sha256=GGf_n3wIeg3GB_eGsmyNJ0fTcxgpeMMbugTMRONK6TQ,3553
33
33
  ai_edge_quantizer/algorithms/uniform_quantize/dequantized_weight_recovery.py,sha256=BDdn_uBZakfHyzdMJPKadsOqxqyC-s6W2ZzFH99L4fE,8652
34
34
  ai_edge_quantizer/algorithms/uniform_quantize/dequantized_weight_recovery_test.py,sha256=sT5eX5TLZEHTtPfnSkCPDlS0sQxlTFWbCsbvOuj--yY,8889
35
35
  ai_edge_quantizer/algorithms/uniform_quantize/hadamard_rotation.py,sha256=U3h5scCHSOdqHA-pb1C3pNgwumT4ydGbtkCSM0ORhrs,12740
36
36
  ai_edge_quantizer/algorithms/uniform_quantize/hadamard_rotation_test.py,sha256=5VUxlaKP1jz4HV-LcKxXMMtmb6eWamq0A6qWJd63cR4,10179
37
- ai_edge_quantizer/algorithms/uniform_quantize/naive_min_max_quantize.py,sha256=8_tNLTbOWTKId4DfHBjkOR9RvELUyIpxlGxKu7tv5Ko,7556
38
- ai_edge_quantizer/algorithms/uniform_quantize/naive_min_max_quantize_test.py,sha256=zoF_EHjYqsKkuev8wfuutIITEmp_maa70IpJI_Df3ck,7431
37
+ ai_edge_quantizer/algorithms/uniform_quantize/naive_min_max_quantize.py,sha256=1sB2j1vlvvWDKyjcGvA_JLCpN2KbCmMslGCBUc4--V4,8461
38
+ ai_edge_quantizer/algorithms/uniform_quantize/naive_min_max_quantize_test.py,sha256=nscKDvNb14ErZdAfG0aXRWyRs6bTvhMqMjKx2vxvUK0,8725
39
39
  ai_edge_quantizer/algorithms/uniform_quantize/octav.py,sha256=Umxh4kJyeHddZf-Wd4aXE5MTI1XWFa5KRuM17uYU714,6922
40
40
  ai_edge_quantizer/algorithms/uniform_quantize/octav_test.py,sha256=sha1d99Xk87bI87tgz0g5LeDC-EeE4WMfM5rRC98-m4,9140
41
- ai_edge_quantizer/algorithms/uniform_quantize/uniform_quantize_tensor.py,sha256=3zq2AO_PRYKHuNvHzwg0pVDZT7kcpaMgXx6OEyEl6co,16103
42
- ai_edge_quantizer/algorithms/uniform_quantize/uniform_quantize_tensor_test.py,sha256=JlX3fLHiknGH1osu6gwWEGUizLrEsE6d8iRpzDODmXo,12510
41
+ ai_edge_quantizer/algorithms/uniform_quantize/uniform_quantize_tensor.py,sha256=0d5XdNbjR2pVsAc-gWX3ik_pAIL-bZ-zemEz_jS2d0c,16531
42
+ ai_edge_quantizer/algorithms/uniform_quantize/uniform_quantize_tensor_test.py,sha256=7kHluzpteMv36hFD6LD_qnwwMoE1GKUP4bGmGMFbOdA,12755
43
43
  ai_edge_quantizer/algorithms/utils/__init__.py,sha256=lpq1g2ayg3lCPLy79t2VicYcnGKw64FfYIj1V7J-4m8,676
44
44
  ai_edge_quantizer/algorithms/utils/common_utils.py,sha256=QrEeCuvA7gY_vK1nbKtqassNDClyAjN1ClZIiw63k5U,35895
45
45
  ai_edge_quantizer/algorithms/utils/common_utils_test.py,sha256=zqapGEfYhjQWe9cNGPLmdbwtEUUYQRhlO_kNe0cXX6E,18104
@@ -62,14 +62,14 @@ ai_edge_quantizer/utils/__init__.py,sha256=lpq1g2ayg3lCPLy79t2VicYcnGKw64FfYIj1V
62
62
  ai_edge_quantizer/utils/calibration_utils.py,sha256=e3dG7Nm94Ix0hkTWTWPUhEG6a8QR_cAM3PSwblfJV5g,15106
63
63
  ai_edge_quantizer/utils/calibration_utils_test.py,sha256=4BlksXl7b4yptL8xPR67hmJCnjhN9V10a2PunzfHrUE,9372
64
64
  ai_edge_quantizer/utils/test_utils.py,sha256=a4Nk-wbeB09dFjTDZiA0K67d26j5DD0UDH_GIVmVG_4,8685
65
- ai_edge_quantizer/utils/tfl_flatbuffer_utils.py,sha256=LPk8yWBjLt_saKobjAvtBR9q_Ets6-3HrfMxPt064Ig,11158
65
+ ai_edge_quantizer/utils/tfl_flatbuffer_utils.py,sha256=TdbqU_BuXh6jLDpxQ9u9SJ70SsTl6l-Fzh_JoU8ru7o,11212
66
66
  ai_edge_quantizer/utils/tfl_flatbuffer_utils_test.py,sha256=K1SbK8q92qYVtiVj0I0GtugsPTkpIpEKv9zakvFV_Sc,8555
67
67
  ai_edge_quantizer/utils/tfl_interpreter_utils.py,sha256=EoVjI_hplX_Rml3hfRsGmQOihexmizeJqt4SQcET9aA,14925
68
68
  ai_edge_quantizer/utils/tfl_interpreter_utils_test.py,sha256=6fjkM-rycZ95L4yfvlr0TN6RlrhfPzxNUYrZaYO_F0A,12013
69
69
  ai_edge_quantizer/utils/validation_utils.py,sha256=oYw33Sg547AqtGw-choPUJmp9SAKkV46J_ddqSsum2Q,3950
70
70
  ai_edge_quantizer/utils/validation_utils_test.py,sha256=V_qNDikPD4OPB-siOLQCWNVWTAu87h2IgNYt7teFd-o,2934
71
- ai_edge_quantizer_nightly-0.3.0.dev20250805.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
72
- ai_edge_quantizer_nightly-0.3.0.dev20250805.dist-info/METADATA,sha256=i9lfVhxOotUrkT9sZ-1KqzhpiQUMWGC9lT3uLJv3RSY,1528
73
- ai_edge_quantizer_nightly-0.3.0.dev20250805.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
74
- ai_edge_quantizer_nightly-0.3.0.dev20250805.dist-info/top_level.txt,sha256=8QTfPnFXNVUhScFLaa-NWZMFWMn72M50DVPubpwWB1g,18
75
- ai_edge_quantizer_nightly-0.3.0.dev20250805.dist-info/RECORD,,
71
+ ai_edge_quantizer_nightly-0.3.0.dev20250807.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
72
+ ai_edge_quantizer_nightly-0.3.0.dev20250807.dist-info/METADATA,sha256=zDKLqFrxvrjKJM46l8OaqwP7YriogP6dqsvY_8Y3O-I,1528
73
+ ai_edge_quantizer_nightly-0.3.0.dev20250807.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
74
+ ai_edge_quantizer_nightly-0.3.0.dev20250807.dist-info/top_level.txt,sha256=8QTfPnFXNVUhScFLaa-NWZMFWMn72M50DVPubpwWB1g,18
75
+ ai_edge_quantizer_nightly-0.3.0.dev20250807.dist-info/RECORD,,