ai-edge-quantizer-nightly 0.0.1.dev20250311__py3-none-any.whl → 0.0.1.dev20250313__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.
@@ -109,6 +109,8 @@ class QuantTransformation(enum.Enum):
109
109
  # Create pattern for emulated subchannel quantization, only support fully
110
110
  # connected op.
111
111
  EMULATED_SUBCHANNEL = 4
112
+ # Duplicate the buffer.
113
+ DUPLICATE_BUFFER = 5
112
114
 
113
115
 
114
116
  @dataclasses.dataclass(frozen=True)
@@ -18,6 +18,7 @@
18
18
  import numpy as np
19
19
  from ai_edge_quantizer import qtyping
20
20
  from ai_edge_quantizer.transformations import dequant_insert
21
+ from ai_edge_quantizer.transformations import duplicate_buffer
21
22
  from ai_edge_quantizer.transformations import emulated_subchannel
22
23
  from ai_edge_quantizer.transformations import quant_insert
23
24
  from ai_edge_quantizer.transformations import quantize_tensor
@@ -68,6 +69,9 @@ class TransformationPerformer:
68
69
  emulated_subchannel.emulated_subchannel
69
70
  ),
70
71
  qtyping.QuantTransformation.ADD_QUANTIZE: quant_insert.insert_quant,
72
+ qtyping.QuantTransformation.DUPLICATE_BUFFER: (
73
+ duplicate_buffer.duplicate_buffer
74
+ ),
71
75
  }
72
76
  # transformations are seprated in two categories:
73
77
  # op_insertion_transformations are transformations that only insert ops
@@ -77,6 +81,7 @@ class TransformationPerformer:
77
81
  qtyping.QuantTransformation.ADD_DEQUANTIZE,
78
82
  qtyping.QuantTransformation.QUANTIZE_TENSOR,
79
83
  qtyping.QuantTransformation.ADD_QUANTIZE,
84
+ qtyping.QuantTransformation.DUPLICATE_BUFFER,
80
85
  ])
81
86
  self._op_replacement_transformations = set(
82
87
  [qtyping.QuantTransformation.EMULATED_SUBCHANNEL]
@@ -0,0 +1,45 @@
1
+ # Copyright 2024 The AI Edge Quantizer Authors.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+
16
+ """Duplicate buffer transformation."""
17
+
18
+ from ai_edge_quantizer import qtyping
19
+ from ai_edge_quantizer.transformations import transformation_utils
20
+ from ai_edge_quantizer.utils import tfl_flatbuffer_utils
21
+
22
+
23
+ def duplicate_buffer(
24
+ transformation_input: transformation_utils.TransformationInput,
25
+ ) -> qtyping.TransformationInfo:
26
+ """Duplicates the buffer of the tensor."""
27
+ tensor_id = transformation_input.tensor_id
28
+ tensor = transformation_input.subgraph.tensors[tensor_id]
29
+ buffer_data = transformation_input.buffers[tensor.buffer].data
30
+ if buffer_data is None:
31
+ tensor_name = tfl_flatbuffer_utils.get_tensor_name(tensor)
32
+ raise ValueError(
33
+ 'Duplicate Buffer transformation supports only constant tensors.'
34
+ f' Tensor {tensor_name} is not constant.'
35
+ )
36
+
37
+ duplicated_buffer_id = transformation_utils.add_new_constant_buffer(
38
+ data=buffer_data,
39
+ buffers=transformation_input.buffers,
40
+ )
41
+ tensor.buffer = duplicated_buffer_id
42
+
43
+ return qtyping.TransformationInfo(
44
+ op_id=0, num_ops_added=0, output_tensor_id=tensor_id
45
+ )
@@ -0,0 +1,106 @@
1
+ # Copyright 2024 The AI Edge Quantizer Authors.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+
16
+ import os
17
+ import numpy as np
18
+ from tensorflow.python.platform import googletest
19
+ from ai_edge_quantizer import qtyping
20
+ from ai_edge_quantizer.transformations import duplicate_buffer
21
+ from ai_edge_quantizer.transformations import transformation_utils
22
+ from ai_edge_quantizer.utils import test_utils
23
+ from ai_edge_quantizer.utils import tfl_flatbuffer_utils
24
+
25
+ TEST_DATA_PREFIX_PATH = test_utils.get_path_to_datafile('..')
26
+
27
+
28
+ class DuplicateBufferTest(googletest.TestCase):
29
+
30
+ def setUp(self):
31
+ super().setUp()
32
+ model_path = os.path.join(
33
+ TEST_DATA_PREFIX_PATH, 'tests/models/weight_sharing_fcs.tflite'
34
+ )
35
+ self.model = tfl_flatbuffer_utils.read_model(model_path)
36
+
37
+ def _get_transformation_input(
38
+ self, subgraph_idx: int, tensor_idx: int
39
+ ) -> transformation_utils.TransformationInput:
40
+ return transformation_utils.TransformationInput(
41
+ tensor_id=tensor_idx,
42
+ buffers=self.model.buffers,
43
+ # Dummy params below.
44
+ op_codes=self.model.operatorCodes,
45
+ subgraph=self.model.subgraphs[subgraph_idx],
46
+ producer=-1,
47
+ consumers=[],
48
+ quant_params=qtyping.UniformQuantParams(
49
+ num_bits=8,
50
+ quantized_dimension=None,
51
+ scale=np.ones(1),
52
+ zero_point=np.zeros(1),
53
+ ),
54
+ )
55
+
56
+ def test_constant_buffer_is_correctly_duplicated(self):
57
+ # Duplicate the FC weight tensor in the second subgraph.
58
+ subgraph_idx = 1
59
+ subgraph = self.model.subgraphs[subgraph_idx]
60
+ weight_tensor_idx = 1
61
+ prev_buffer_id = subgraph.tensors[weight_tensor_idx].buffer
62
+ prev_num_buffers = len(self.model.buffers)
63
+ transformation_input = self._get_transformation_input(
64
+ subgraph_idx, weight_tensor_idx
65
+ )
66
+ transformation_info = duplicate_buffer.duplicate_buffer(
67
+ transformation_input
68
+ )
69
+ self.assertEqual(transformation_info.op_id, 0)
70
+ self.assertEqual(transformation_info.num_ops_added, 0)
71
+ self.assertEqual(transformation_info.output_tensor_id, 1)
72
+ # Check that a new buffer was added.
73
+ self.assertLen(self.model.buffers, prev_num_buffers + 1)
74
+ # Check that the new buffer is used by the weight tensor.
75
+ new_buffer_id = len(self.model.buffers) - 1
76
+ self.assertEqual(subgraph.tensors[weight_tensor_idx].buffer, new_buffer_id)
77
+ # Check that the new buffer has the same data as the original one.
78
+ self.assertTrue(
79
+ np.all(
80
+ np.frombuffer(
81
+ self.model.buffers[new_buffer_id].data,
82
+ dtype=np.float32,
83
+ )
84
+ == np.frombuffer(
85
+ self.model.buffers[prev_buffer_id].data,
86
+ dtype=np.float32,
87
+ )
88
+ )
89
+ )
90
+
91
+ def test_duplicate_buffer_raises_error_when_tensor_is_not_constant(self):
92
+ # Duplicate the FC input tensor in the second subgraph.
93
+ subgraph_idx = 1
94
+ weight_tensor_idx = 0
95
+ transformation_input = self._get_transformation_input(
96
+ subgraph_idx, weight_tensor_idx
97
+ )
98
+ with self.assertRaisesRegex(
99
+ ValueError,
100
+ 'Duplicate Buffer transformation supports only constant tensors.',
101
+ ):
102
+ duplicate_buffer.duplicate_buffer(transformation_input)
103
+
104
+
105
+ if __name__ == '__main__':
106
+ googletest.main()
@@ -149,7 +149,7 @@ def _perform_blockwise_quantization(
149
149
  transformation_input.subgraph,
150
150
  transformation_input.buffers,
151
151
  )
152
- blockwise_details.scale = scale_tensor_id
152
+ blockwise_details.scales = scale_tensor_id
153
153
  blockwise_details.blockSize = transformation_input.quant_params.block_size
154
154
  # blockwise quantization allows optional zero point.
155
155
  if transformation_input.quant_params.zero_point is not None:
@@ -160,7 +160,7 @@ def _perform_blockwise_quantization(
160
160
  transformation_input.subgraph,
161
161
  transformation_input.buffers,
162
162
  )
163
- blockwise_details.zeroPoint = zero_point_tensor_id
163
+ blockwise_details.zeroPoints = zero_point_tensor_id
164
164
  flatbuffer_quantization.details = blockwise_details
165
165
  return flatbuffer_quantization
166
166
 
@@ -168,8 +168,8 @@ class QuantizeTensorTest(parameterized.TestCase):
168
168
  )
169
169
  self.assertEqual(quant_param.details.blockSize, 32)
170
170
  # Check if the scale and zero point tensors are inserted correctly.
171
- self.assertEqual(quant_param.details.scale, 9)
172
- self.assertEqual(quant_param.details.zeroPoint, 10)
171
+ self.assertEqual(quant_param.details.scales, 9)
172
+ self.assertEqual(quant_param.details.zeroPoints, 10)
173
173
 
174
174
  def test_int4_constant_packed_correctly(self):
175
175
  subgraph = self._model.subgraphs[0]
@@ -69,6 +69,29 @@ def add_op_code(
69
69
  return len(model_op_codes) - 1
70
70
 
71
71
 
72
+ def add_new_constant_buffer(
73
+ data: np.ndarray,
74
+ buffers: list[schema_py_generated.BufferT],
75
+ ) -> int:
76
+ """Add a new constant buffer to the model.
77
+
78
+ Args:
79
+ data: The data of the new tensor.
80
+ buffers: The buffers of the model.
81
+
82
+ Returns:
83
+ The index of the new buffer in the model.
84
+ """
85
+ new_buffer = schema_py_generated.BufferT()
86
+ new_buffer.data = np.frombuffer(data.tobytes(), dtype=np.uint8).flatten()
87
+ new_buffer.offset = 0
88
+ new_buffer.size = 0
89
+ new_buffer_id = len(buffers)
90
+ buffers.append(new_buffer)
91
+
92
+ return new_buffer_id
93
+
94
+
72
95
  def add_new_constant_tensor(
73
96
  tensor_name: str,
74
97
  data: np.ndarray,
@@ -88,16 +111,11 @@ def add_new_constant_tensor(
88
111
  Returns:
89
112
  The index of the new tensor in the subgraph.
90
113
  """
91
- tensor_buffer = schema_py_generated.BufferT()
92
- tensor_buffer.data = np.frombuffer(data.tobytes(), dtype=np.uint8).flatten()
93
- tensor_buffer.offset = 0
94
- tensor_buffer.size = 0
95
- tensor_buffer_id = len(buffers)
96
- buffers.append(tensor_buffer)
114
+ new_buffer_id = add_new_constant_buffer(data, buffers)
97
115
 
98
116
  new_tensor = schema_py_generated.TensorT()
99
117
  new_tensor.shape = data.shape
100
- new_tensor.buffer = tensor_buffer_id
118
+ new_tensor.buffer = new_buffer_id
101
119
  new_tensor.type = tensor_type
102
120
  new_tensor.name = tensor_name
103
121
  new_tensor_id = len(subgraph.tensors)
@@ -55,6 +55,38 @@ class TransformationUtilsTest(parameterized.TestCase):
55
55
  )
56
56
  self.assertEqual(expected, got)
57
57
 
58
+ @parameterized.named_parameters(
59
+ dict(
60
+ testcase_name="float32",
61
+ data=np.array([1.0, 2.0, 3.0, 4.0], dtype=np.float32),
62
+ ),
63
+ dict(
64
+ testcase_name="int8",
65
+ data=np.array([[1, 2], [3, 4]], dtype=np.int8),
66
+ ),
67
+ )
68
+ def test_add_new_constant_buffer(self, data):
69
+ """Tests if the constant buffer is added to the model."""
70
+ prev_num_buffers = len(self.model.buffers) - 1
71
+ new_buffer_idx = transformation_utils.add_new_constant_buffer(
72
+ data=data,
73
+ buffers=self.model.buffers,
74
+ )
75
+ self.assertEqual(new_buffer_idx, prev_num_buffers + 1)
76
+
77
+ expected_buffer_data = (
78
+ np.frombuffer(
79
+ data.tobytes(),
80
+ dtype=np.uint8,
81
+ )
82
+ .flatten()
83
+ .tolist()
84
+ )
85
+ self.assertEqual(
86
+ self.model.buffers[new_buffer_idx].data.tolist(),
87
+ expected_buffer_data,
88
+ )
89
+
58
90
  @parameterized.named_parameters(
59
91
  dict(
60
92
  testcase_name="float32",
@@ -216,8 +216,10 @@ def get_tensor_name_to_details_map(
216
216
  """
217
217
  tensor_name_to_detail = {}
218
218
  for tensor_detail in tflite_interpreter.get_tensor_details(subgraph_index):
219
- # Don't return temporary, unnamed tensors
220
- if not tensor_detail["name"]:
219
+ # Don't return temporary, unnamed tensors or scratch tensors.
220
+ # tensor_detail doesn't include the allocation size (bytes) or an
221
+ # indicator of scratch tensors, so use the name to filter them out.
222
+ if not tensor_detail["name"] or "scratch" in tensor_detail["name"]:
221
223
  continue
222
224
  tensor_name_to_detail[tensor_detail["name"]] = tensor_detail
223
225
  return tensor_name_to_detail
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ai-edge-quantizer-nightly
3
- Version: 0.0.1.dev20250311
3
+ Version: 0.0.1.dev20250313
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
@@ -12,7 +12,7 @@ ai_edge_quantizer/model_validator.py,sha256=fRNz0jO54cthPTibsCuViUXUuFRHl_fbvEiC
12
12
  ai_edge_quantizer/model_validator_test.py,sha256=EeqOP_mrZsnZ3rug756s0ryDDqd2KgIDld5Lm_gDuWY,13020
13
13
  ai_edge_quantizer/params_generator.py,sha256=wT_TyW9jIaOfvLr9a1JR_kxwZtPXCvDFF0n_2QcrDZg,14087
14
14
  ai_edge_quantizer/params_generator_test.py,sha256=d9JwR-yxNJgg1SW-m8sFFPkIRdhgsDwMpVKsBQFL0gg,37658
15
- ai_edge_quantizer/qtyping.py,sha256=i9d4kG7bqR_5VTImfGY1JkK6M9J-DRfc_OGOc0qB5cQ,15186
15
+ ai_edge_quantizer/qtyping.py,sha256=UBZ3HgO8IDLY6VJmO05rGtFv_idMD3Os3WWsnriA0NA,15235
16
16
  ai_edge_quantizer/quantizer.py,sha256=g3DMqFMrMpt9jQttCE0WcdNbMtk0JZnmN5MmCHrNdyM,13202
17
17
  ai_edge_quantizer/quantizer_test.py,sha256=38oTMJwMmxwPDeqT3eaVbazjtuIUIzMQ3mJNKh_eNQY,20493
18
18
  ai_edge_quantizer/recipe.py,sha256=r5tJiUs-ihZFzeK_jP2sUIUgTqZsL5SWvbUokuIUPDo,2251
@@ -21,7 +21,7 @@ ai_edge_quantizer/recipe_manager_test.py,sha256=LulVxsYp6TBGFI2PLCUCd4VsFq8ELpC7
21
21
  ai_edge_quantizer/recipe_test.py,sha256=Fg_sfxovI2fRjk5qdu18ghOvXdUvhDR1TxbE0GHDczc,3381
22
22
  ai_edge_quantizer/transformation_instruction_generator.py,sha256=WkECCO85lLs4cEnjZF5eVGbtuul4P8N77gUxUCK9ESY,21605
23
23
  ai_edge_quantizer/transformation_instruction_generator_test.py,sha256=23MfOBiXv5Wq9FKJen7DrJ66T58qxf4ECriIY7V013k,39113
24
- ai_edge_quantizer/transformation_performer.py,sha256=3ZuaN5xwAu1B9zoGZHqi0__FOSzjGWOcydpCy1_Scac,10951
24
+ ai_edge_quantizer/transformation_performer.py,sha256=4GCCOw5WBhO0UUfFoLlbfUh3RfnffF9qI_yEpdWlyps,11181
25
25
  ai_edge_quantizer/transformation_performer_test.py,sha256=m3V6nd6jsjd6jVId5wTBNuyDB2h2p4tHlMWhlnomlJo,13341
26
26
  ai_edge_quantizer/algorithms/__init__.py,sha256=lpq1g2ayg3lCPLy79t2VicYcnGKw64FfYIj1V7J-4m8,676
27
27
  ai_edge_quantizer/algorithms/nonlinear_quantize/__init__.py,sha256=lpq1g2ayg3lCPLy79t2VicYcnGKw64FfYIj1V7J-4m8,676
@@ -42,26 +42,28 @@ ai_edge_quantizer/algorithms/utils/common_utils_test.py,sha256=zqapGEfYhjQWe9cNG
42
42
  ai_edge_quantizer/transformations/__init__.py,sha256=lpq1g2ayg3lCPLy79t2VicYcnGKw64FfYIj1V7J-4m8,676
43
43
  ai_edge_quantizer/transformations/dequant_insert.py,sha256=sL1LHFVzBDSd9jgrzlHz38LWU0bwmVX7iBkaNcui0ts,3566
44
44
  ai_edge_quantizer/transformations/dequant_insert_test.py,sha256=NJ18PnG71_AvUPz3Cr_TmG6URMeBfa7IiDDyddfTkKQ,10830
45
+ ai_edge_quantizer/transformations/duplicate_buffer.py,sha256=sEod0EtmcHX0VDqBCI4BYCX9CSRyDtx2vmjtOentFiY,1743
46
+ ai_edge_quantizer/transformations/duplicate_buffer_test.py,sha256=YYWl3Q5WF60s8T8pLzzA8TCSxz-i7dqc03dJt1LtMw4,3880
45
47
  ai_edge_quantizer/transformations/emulated_subchannel.py,sha256=HVaRxoC8PCAvy3xeMv3OIymukUy_yW1zK0xN8Ann6I4,13602
46
48
  ai_edge_quantizer/transformations/emulated_subchannel_test.py,sha256=gZP6u9NdPXl7s19qB_Un8evou9ZZV6I9Gy0E1rdobHM,7722
47
49
  ai_edge_quantizer/transformations/quant_insert.py,sha256=jn6HsJaV-sqBiFPY-Aqbd64t8zgcYVkEkZI375x_FWY,3958
48
50
  ai_edge_quantizer/transformations/quant_insert_test.py,sha256=X9ptPDvJCFkR5tejKnD1SlHFGPazQTW-wNNMV9MEAuw,10107
49
- ai_edge_quantizer/transformations/quantize_tensor.py,sha256=6CyUFR7fGmzbS-mSuDlSSCJJGxY9X_WnCmEuKqL4LzQ,7864
50
- ai_edge_quantizer/transformations/quantize_tensor_test.py,sha256=QnJmQ_-XN5X0oR57FoY9bWGTp7migf11psbdO9R2pLg,9050
51
- ai_edge_quantizer/transformations/transformation_utils.py,sha256=BaKy5LYWgqli62XGo3AGRDNtHjwpBNp5VF5XgFbfVmg,4298
52
- ai_edge_quantizer/transformations/transformation_utils_test.py,sha256=ks81nNvruOC88Tjdk3_qwku0V8p54p3gOqfObzNhWMM,5371
51
+ ai_edge_quantizer/transformations/quantize_tensor.py,sha256=9YaaWR6osxZoyUM8DUPJr_AjWO0QuNhFc65OFnSGzY4,7866
52
+ ai_edge_quantizer/transformations/quantize_tensor_test.py,sha256=XZOollD1jnpCb78gMZx7yocF7RDBSf9HIf-XdG-y_io,9052
53
+ ai_edge_quantizer/transformations/transformation_utils.py,sha256=R42OIbzwQ7JYJ-Qt46jsqwb6u4MfDGiIPCRZCUGLVCw,4664
54
+ ai_edge_quantizer/transformations/transformation_utils_test.py,sha256=xH64SF3UHDh84vYbt-WvmXNjM-Jg-mefES1ACO1tkqw,6269
53
55
  ai_edge_quantizer/utils/__init__.py,sha256=lpq1g2ayg3lCPLy79t2VicYcnGKw64FfYIj1V7J-4m8,676
54
56
  ai_edge_quantizer/utils/calibration_utils.py,sha256=1Fj9MIO6aLZIRgyd4axvZN4S_O64nB_-Miu1WP664js,2536
55
57
  ai_edge_quantizer/utils/calibration_utils_test.py,sha256=Z-AcdTieesWFKyKBb08ZXm4Mgu6cvJ4bg2-MJ7hLD10,2856
56
58
  ai_edge_quantizer/utils/test_utils.py,sha256=HwZCIpO9fJRAhuN6t6voXKOYQtcioFtt_tpkAlDsAYk,6205
57
59
  ai_edge_quantizer/utils/tfl_flatbuffer_utils.py,sha256=_A-h_MqwElzjgkLDmXTZ1iAIWtTRcLjSFGfjNT8fuHU,10480
58
60
  ai_edge_quantizer/utils/tfl_flatbuffer_utils_test.py,sha256=AbyDxoM62k4ojD8gPdkWo--xe5hlX3t0kobQSA80kuk,7740
59
- ai_edge_quantizer/utils/tfl_interpreter_utils.py,sha256=ZI16i25bAOpnJUBgRg38EH2CuZ55wxyHFScM12RsOwc,12487
61
+ ai_edge_quantizer/utils/tfl_interpreter_utils.py,sha256=x2xA2CFPpe_2trcV8v5xGaBETvVCfwAcJuq6yieGJ0Y,12687
60
62
  ai_edge_quantizer/utils/tfl_interpreter_utils_test.py,sha256=Op3JxtOqlrjzmYF18jnnstL1k9xiY9kKJ8S2vklKGkc,11327
61
63
  ai_edge_quantizer/utils/validation_utils.py,sha256=oYw33Sg547AqtGw-choPUJmp9SAKkV46J_ddqSsum2Q,3950
62
64
  ai_edge_quantizer/utils/validation_utils_test.py,sha256=V_qNDikPD4OPB-siOLQCWNVWTAu87h2IgNYt7teFd-o,2934
63
- ai_edge_quantizer_nightly-0.0.1.dev20250311.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
64
- ai_edge_quantizer_nightly-0.0.1.dev20250311.dist-info/METADATA,sha256=HQQRge7GnS1pcLK4Mbi0WMqmqXYSBliDlGu6Fg2Ihps,1528
65
- ai_edge_quantizer_nightly-0.0.1.dev20250311.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
66
- ai_edge_quantizer_nightly-0.0.1.dev20250311.dist-info/top_level.txt,sha256=8QTfPnFXNVUhScFLaa-NWZMFWMn72M50DVPubpwWB1g,18
67
- ai_edge_quantizer_nightly-0.0.1.dev20250311.dist-info/RECORD,,
65
+ ai_edge_quantizer_nightly-0.0.1.dev20250313.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
66
+ ai_edge_quantizer_nightly-0.0.1.dev20250313.dist-info/METADATA,sha256=UY2_FI0iSnb7C0s7HBGywzPiASp1GHphmuI9OKM2Ujc,1528
67
+ ai_edge_quantizer_nightly-0.0.1.dev20250313.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
68
+ ai_edge_quantizer_nightly-0.0.1.dev20250313.dist-info/top_level.txt,sha256=8QTfPnFXNVUhScFLaa-NWZMFWMn72M50DVPubpwWB1g,18
69
+ ai_edge_quantizer_nightly-0.0.1.dev20250313.dist-info/RECORD,,