ai-edge-quantizer-nightly 0.0.1.dev20250311__py3-none-any.whl → 0.0.1.dev20250312__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.
- ai_edge_quantizer/qtyping.py +2 -0
- ai_edge_quantizer/transformation_performer.py +5 -0
- ai_edge_quantizer/transformations/duplicate_buffer.py +45 -0
- ai_edge_quantizer/transformations/duplicate_buffer_test.py +106 -0
- ai_edge_quantizer/transformations/transformation_utils.py +25 -7
- ai_edge_quantizer/transformations/transformation_utils_test.py +32 -0
- ai_edge_quantizer/utils/tfl_interpreter_utils.py +4 -2
- {ai_edge_quantizer_nightly-0.0.1.dev20250311.dist-info → ai_edge_quantizer_nightly-0.0.1.dev20250312.dist-info}/METADATA +1 -1
- {ai_edge_quantizer_nightly-0.0.1.dev20250311.dist-info → ai_edge_quantizer_nightly-0.0.1.dev20250312.dist-info}/RECORD +12 -10
- {ai_edge_quantizer_nightly-0.0.1.dev20250311.dist-info → ai_edge_quantizer_nightly-0.0.1.dev20250312.dist-info}/LICENSE +0 -0
- {ai_edge_quantizer_nightly-0.0.1.dev20250311.dist-info → ai_edge_quantizer_nightly-0.0.1.dev20250312.dist-info}/WHEEL +0 -0
- {ai_edge_quantizer_nightly-0.0.1.dev20250311.dist-info → ai_edge_quantizer_nightly-0.0.1.dev20250312.dist-info}/top_level.txt +0 -0
ai_edge_quantizer/qtyping.py
CHANGED
@@ -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()
|
@@ -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
|
-
|
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 =
|
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
|
-
|
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.
|
3
|
+
Version: 0.0.1.dev20250312
|
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=
|
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=
|
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
51
|
ai_edge_quantizer/transformations/quantize_tensor.py,sha256=6CyUFR7fGmzbS-mSuDlSSCJJGxY9X_WnCmEuKqL4LzQ,7864
|
50
52
|
ai_edge_quantizer/transformations/quantize_tensor_test.py,sha256=QnJmQ_-XN5X0oR57FoY9bWGTp7migf11psbdO9R2pLg,9050
|
51
|
-
ai_edge_quantizer/transformations/transformation_utils.py,sha256=
|
52
|
-
ai_edge_quantizer/transformations/transformation_utils_test.py,sha256=
|
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=
|
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.
|
64
|
-
ai_edge_quantizer_nightly-0.0.1.
|
65
|
-
ai_edge_quantizer_nightly-0.0.1.
|
66
|
-
ai_edge_quantizer_nightly-0.0.1.
|
67
|
-
ai_edge_quantizer_nightly-0.0.1.
|
65
|
+
ai_edge_quantizer_nightly-0.0.1.dev20250312.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
66
|
+
ai_edge_quantizer_nightly-0.0.1.dev20250312.dist-info/METADATA,sha256=ZRyM3EF8KAmJpo0QjIpL6Lv1qPQ_2tGLP4o_ARspijs,1528
|
67
|
+
ai_edge_quantizer_nightly-0.0.1.dev20250312.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
68
|
+
ai_edge_quantizer_nightly-0.0.1.dev20250312.dist-info/top_level.txt,sha256=8QTfPnFXNVUhScFLaa-NWZMFWMn72M50DVPubpwWB1g,18
|
69
|
+
ai_edge_quantizer_nightly-0.0.1.dev20250312.dist-info/RECORD,,
|
File without changes
|
File without changes
|