compile_config.py Source File

compile_config.py Source File#

Mobilint SDK qb Compiler: compile_config.py Source File
Mobilint SDK qb Compiler v0.11.0.1
MCS002-KR
compile_config.py
1from typeguard import typechecked
2from . import ConfigABC, QuantConfig, is_valid_dir_path, check_save_path
3import tempfile
4import numbers
5from qubee.calibration.utils_calib import (
6 list_np_files_in_json,
7 list_np_files_in_txt,
8 CalibType,
9 check_calib_data,
10)
11from qubee.version import __version__
12
13
14class CompileConfig(ConfigABC):
15 py_to_cpp_name = {
16 "calib_data_path": "calibData",
17 "save_path": "savePath",
18 "model_nickname": "modelNickname",
19 "save_msgpack_name": "saveMsgpackName",
20 "model_path": "modelPath",
21 "inference_scheme": "inferenceScheme",
22 "save_sample": "saveSample",
23 "cpu_offload": "cpuOffload",
24 "singlecore_compile": "singlecoreCompile",
25 "optimize_option": "optimizeOption",
26 "sample_dtype": "sampleDtype",
27 "preprocess_dict": "preprocess",
28 "version": "version",
29 }
30 min_max_check = {"optimize_option": [0, None]}
31 inference_scheme_types = ["single", "multi", "global", "global4", "global8"]
32 sample_dtypes = ["float", "int8"]
33
34 @typechecked
35 def __init__(
36 self,
37 calib_data_path: str | None,
38 use_random_calib: bool,
39 save_path: str,
40 model_nickname: str,
41 save_msgpack_name: str | None,
42 model_path: str | None,
43 inference_scheme: str,
44 save_sample: bool,
45 cpu_offload: bool,
46 singlecore_compile: bool,
47 optimize_option: int,
48 sample_dtype: str,
49 preprocess_dict: dict | None,
50 buffer_mode: int,
51 version: str,
52 quant_config: QuantConfig,
53 optional: bool = False,
54 ):
55 super().__init__(optional)
57 calib_data_path, use_random_calib
58 )
59 self.save_path = save_path
60 self.model_nickname = model_nickname
61 self.save_msgpack_name = save_msgpack_name
62 self.model_path = model_path
63 self.inference_scheme = inference_scheme
64 self.save_sample = save_sample
65 self.cpu_offload = cpu_offload
66 self.singlecore_compile = singlecore_compile
67 self.optimize_option = optimize_option
68 self.sample_dtype = sample_dtype
69 self.preprocess_dict = preprocess_dict
70 self.version = version
71 self.quant_config = quant_config
72 self.buffer_mode = buffer_mode
73 self.check_valid(
74 except_list=["optional", "quant_config", "calib_file", "buffer_mode"]
75 ) # quant_config is already verified
76
77 @classmethod
78 def default_config(cls):
79 calib_data_path = None
80 use_random_calib = False
81 save_path = "./tmp.mxq"
82 save_msgpack_name = None
83 model_nickname = "temporary"
84 model_path = None
85 inference_scheme = "single"
86 save_sample = False
87 cpu_offload = False
88 singlecore_compile = False
89 optimize_option = 0
90 sample_dtype = "float"
91 preprocess_dict = None
92 buffer_mode = 1
93 quant_config = QuantConfig.default_config()
94 version = __version__
95
96 return CompileConfig(
97 optional=False,
98 calib_data_path=calib_data_path,
99 use_random_calib=use_random_calib,
100 save_path=save_path,
101 save_msgpack_name=save_msgpack_name,
102 model_nickname=model_nickname,
103 model_path=model_path,
104 inference_scheme=inference_scheme,
105 save_sample=save_sample,
106 cpu_offload=cpu_offload,
107 singlecore_compile=singlecore_compile,
108 optimize_option=optimize_option,
109 sample_dtype=sample_dtype,
110 preprocess_dict=preprocess_dict,
111 buffer_mode=buffer_mode,
112 version=version,
113 quant_config=quant_config,
114 )
115
116 def check_valid_str_configs(self):
117 if self.save_path:
118 check_save_path(self.save_path, "mxq")
119 if self.save_msgpack_name:
120 is_valid_dir_path(self.save_msgpack_name)
121 if self.inference_scheme.lower() not in CompileConfig.inference_scheme_types:
122 raise ValueError(
123 f"Inference_scheme should be one of the {CompileConfig.inference_scheme_types}"
124 )
125 if self.sample_dtype.lower() not in CompileConfig.sample_dtypes:
126 raise ValueError(
127 f"Sample data type should be one of the {CompileConfig.sample_dtypes}"
128 )
129 if self.buffer_mode not in (0, 1):
130 raise ValueError(f"buffer mode must be either 0 or 1")
131
132 def to_dict(self):
133 compile_config_dict = dict()
134 for py_name, cpp_name in CompileConfig.py_to_cpp_name.items():
135 value = getattr(self, py_name)
136 if isinstance(value, str) and py_name in [
137 "inference_scheme",
138 "sample_dtype",
139 ]:
140 value = value.lower()
141 compile_config_dict[cpp_name] = value
142 compile_config_dict["quant"] = self.quant_config.to_dict()
143
144 return compile_config_dict
145
146 def _get_calibration_path(self, calib_data_path: str, use_random_calib: bool):
147 if not calib_data_path and not use_random_calib:
148 raise ValueError(
149 "Please use calib_data_path or enable use_random_calib. Do not leave calib_data_path empty while setting use_random_calib to false."
150 )
151 if (
152 not calib_data_path or use_random_calib
153 ): # we don't have to check the validity of calib_data_path
154 return None
155 calib_data_case = check_calib_data(calib_data_path)
156 if calib_data_case == CalibType.SINGLE_DIR:
157 self.calib_file = tempfile.NamedTemporaryFile(suffix=".txt")
158 list_np_files_in_txt(calib_data_path, self.calib_file.name)
159 calib_data_path = self.calib_file.name
160 elif calib_data_case == CalibType.MULTI_DIR:
161 self.calib_file = tempfile.NamedTemporaryFile(suffix=".json")
162 list_np_files_in_json(calib_data_path, self.calib_file.name)
163 calib_data_path = self.calib_file.name
164 elif calib_data_case in (CalibType.SINGLE_TXT, CalibType.MULTI_JSON):
165 pass
166 else:
167 raise ValueError(f"Got unexpected calib_data_path={calib_data_path}.")
168
169 return calib_data_path
170
171
172def get_compile_config(
173 calib_data_path=None,
174 use_random_calib=False,
175 save_path="./tmp.mxq",
176 save_msgpack_name=None,
177 model_nickname="temporary",
178 model_path=None,
179 inference_scheme="single",
180 save_sample=False,
181 cpu_offload=False,
182 singlecore_compile=False,
183 optimize_option=0,
184 sample_dtype="float",
185 preprocess_dict=None,
186 buffer_mode=1,
187 quant_config=QuantConfig.default_config(),
188 version=__version__,
189):
190 return CompileConfig(
191 optional=False,
192 calib_data_path=calib_data_path,
193 use_random_calib=use_random_calib,
194 save_path=save_path,
195 save_msgpack_name=save_msgpack_name,
196 model_nickname=model_nickname,
197 model_path=model_path,
198 inference_scheme=inference_scheme,
199 save_sample=save_sample,
200 cpu_offload=cpu_offload,
201 singlecore_compile=singlecore_compile,
202 optimize_option=optimize_option,
203 sample_dtype=sample_dtype,
204 preprocess_dict=preprocess_dict,
205 buffer_mode=buffer_mode,
206 version=version,
207 quant_config=quant_config,
208 )
_get_calibration_path(self, str calib_data_path, bool use_random_calib)