blob: 8a8082765410b5de2d290fbd872551e3c9d0fb15 [file] [log] [blame]
erik.andersson@arm.comad45f792021-02-03 10:20:16 +01001# Copyright (C) 2020-2021 Arm Limited or its affiliates. All rights reserved.
Tim Hall79d07d22020-04-27 18:20:16 +01002#
3# SPDX-License-Identifier: Apache-2.0
4#
5# Licensed under the Apache License, Version 2.0 (the License); you may
6# not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an AS IS BASIS, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
Tim Hall79d07d22020-04-27 18:20:16 +010016# Description:
17# Main entry point for the Vela compiler.
18#
19# Provides command line interface, options parsing, and network loading. Before calling the compiler driver.
Diego Russoe8a10452020-04-21 17:39:10 +010020import argparse
Tim Hall1bd531d2020-11-01 20:59:36 +000021import os
Diego Russoea6111a2020-04-14 18:41:58 +010022import sys
Tim Hall79d07d22020-04-27 18:20:16 +010023import time
Tim Hall79d07d22020-04-27 18:20:16 +010024
erik.andersson@arm.comad45f792021-02-03 10:20:16 +010025import flatbuffers
26
Tim Hall79d07d22020-04-27 18:20:16 +010027from . import architecture_features
Diego Russoe8a10452020-04-21 17:39:10 +010028from . import compiler_driver
29from . import model_reader
Diqing Zhong5e5a7842021-08-16 17:24:09 +020030from . import rawdata_writer
Diego Russoe8a10452020-04-21 17:39:10 +010031from . import scheduler
Tim Hall79d07d22020-04-27 18:20:16 +010032from . import stats_writer
33from . import tflite_writer
Tim Hall79d07d22020-04-27 18:20:16 +010034from ._version import __version__
Louis Verhaard11831ce2020-11-18 18:53:24 +010035from .api import API_VERSION
Tim Halle6ccd872020-11-09 16:46:37 +000036from .debug_database import DebugDatabase
Louis Verhaard7db78962020-05-25 15:05:26 +020037from .errors import InputFileError
Henrik G Olssonea9b23c2021-03-23 17:34:49 +010038from .errors import VelaError
Jonas Ohlsson45e653d2021-07-26 16:13:12 +020039from .nn_graph import NetworkType
Diego Russoe8a10452020-04-21 17:39:10 +010040from .nn_graph import PassPlacement
41from .nn_graph import TensorAllocator
Diego Russoea6111a2020-04-14 18:41:58 +010042from .tensor import MemArea
Jacob Bohlin0628a8c2020-08-28 13:25:14 +020043from .tensor import Tensor
erik.andersson@arm.comad45f792021-02-03 10:20:16 +010044from .tflite.Model import Model
Michael McGeagh837dc1b2020-11-10 12:38:25 +000045from .tflite_mapping import builtin_operator_map
46from .tflite_mapping import builtin_type_name
Jonas Ohlsson45e653d2021-07-26 16:13:12 +020047from .tflite_model_semantic import TFLiteSemantic
48from .tflite_supported_operators import TFLiteSupportedOperators
49from .tosa_model_semantic import TosaSemantic
50from .tosa_supported_operators import TosaSupportedOperators
Louis Verhaard52078302020-11-18 13:35:06 +010051from ethosu.vela.architecture_features import ArchitectureFeatures
Tim Hall79d07d22020-04-27 18:20:16 +010052
53
Tim Halle6ccd872020-11-09 16:46:37 +000054def process(input_name, enable_debug_db, arch, model_reader_options, compiler_options, scheduler_options):
Tim Hall79d07d22020-04-27 18:20:16 +010055 if compiler_options.timing:
56 start = time.time()
57
Tim Halle6ccd872020-11-09 16:46:37 +000058 os.makedirs(compiler_options.output_dir, exist_ok=True)
59 output_basename = os.path.join(compiler_options.output_dir, os.path.splitext(os.path.basename(input_name))[0])
60 DebugDatabase.show_warnings = enable_debug_db
61
Patrik Gustavsson8f1f9aa2021-06-28 07:41:58 +020062 nng, network_type = model_reader.read_model(input_name, model_reader_options)
Tim Hall79d07d22020-04-27 18:20:16 +010063
64 if not nng:
Michael McGeagh7a6f8432020-12-02 15:29:22 +000065 raise InputFileError(input_name, "Input file could not be read")
Tim Hall79d07d22020-04-27 18:20:16 +010066
67 if compiler_options.verbose_operators:
68 nng.print_operators()
69
70 if compiler_options.timing:
71 stop = time.time()
72 print("Model reading took %f s" % (stop - start))
73 start = time.time()
74
Patrik Gustavsson8f1f9aa2021-06-28 07:41:58 +020075 compiler_driver.compiler_driver(nng, arch, compiler_options, scheduler_options, network_type)
Tim Hall79d07d22020-04-27 18:20:16 +010076
Tim Halle6ccd872020-11-09 16:46:37 +000077 summary_csv_file = "{0}_summary_{1}.csv".format(output_basename, arch.system_config)
Tim Hall79d07d22020-04-27 18:20:16 +010078 stats_writer.write_summary_metrics_csv(nng, summary_csv_file, arch)
79
Fredrik Svedbergf5c07c42021-04-23 14:36:42 +020080 stats_writer.print_performance_metrics(
81 nng,
82 show_cpu_operations=compiler_options.show_cpu_operations,
83 verbose_weights=compiler_options.verbose_weights,
84 arch=arch,
85 )
Tim Hall79d07d22020-04-27 18:20:16 +010086
Diqing Zhong5e5a7842021-08-16 17:24:09 +020087 output_tfl_filename = output_basename + "_vela.tflite"
Patrik Gustavssonb081d672021-08-25 13:49:25 +020088 if input_name.endswith(".tflite"):
Diqing Zhong5e5a7842021-08-16 17:24:09 +020089 tflite_writer.write_tflite(nng, output_tfl_filename)
Patrik Gustavssonc74682c2021-08-17 14:26:38 +020090 if input_name.endswith(".tosa"):
Diqing Zhong5e5a7842021-08-16 17:24:09 +020091 rawdata_writer.write_rawdata_output(nng, arch, output_basename)
Tim Halle6ccd872020-11-09 16:46:37 +000092
93 if enable_debug_db:
Diqing Zhong5e5a7842021-08-16 17:24:09 +020094 file_offsets = calculate_operator_file_offsets(output_tfl_filename)
erik.andersson@arm.comad45f792021-02-03 10:20:16 +010095 for idx, offset in enumerate(sorted(file_offsets)):
96 sg = find_subgraph_with_command_stream_order(nng, idx)
97 if sg is not None:
98 DebugDatabase.set_stream_offset(sg, offset)
Tim Halle6ccd872020-11-09 16:46:37 +000099 debug_filename = output_basename + "_debug.xml"
Diqing Zhong5e5a7842021-08-16 17:24:09 +0200100 DebugDatabase.write(debug_filename, input_name, output_tfl_filename)
Tim Hall79d07d22020-04-27 18:20:16 +0100101
102 if compiler_options.timing:
103 stop = time.time()
104 print("Compiler driver took %f s" % (stop - start))
105
106 return nng
107
108
erik.andersson@arm.comad45f792021-02-03 10:20:16 +0100109def find_subgraph_with_command_stream_order(nng, idx):
110 for sg in nng.subgraphs:
111 if sg.generated_stream_id == idx:
112 return sg
113 return None
114
115
116def calculate_operator_file_offsets(name: str):
117 # Read the vela optimized tflite file
118 with open(name, "rb") as f:
119 buf = bytearray(f.read())
120 # Calculate the file offsets for each custom operator
121 file_offsets = []
122 model = Model.GetRootAsModel(buf, 0)
123 for idx in range(model.SubgraphsLength()): # However only one subgraph is supported as of now
124 sg = model.Subgraphs(idx)
125 for idx in range(sg.OperatorsLength()):
126 operator = sg.Operators(idx)
127 if model.OperatorCodes(operator.OpcodeIndex()).CustomCode() is not None:
128 tensor_idx = operator.Inputs(0)
129 tensor = sg.Tensors(tensor_idx)
130 buffer = model.Buffers(tensor.Buffer())
131 offset = flatbuffers.number_types.UOffsetTFlags.py_type(buffer._tab.Offset(4))
132 file_offsets.append(buffer._tab.Vector(offset))
133 return file_offsets
134
135
Tim Hall79d07d22020-04-27 18:20:16 +0100136def print_subgraph_io_summary(nng):
137 """Print a summary of all the input and output tensor sizes for all subgraphs.
138 Also displays the total tensor size and the memory used area for sram.
139 """
140
141 print("Subgraph IO Summary")
142 print("-------------------")
143 print("NNG: {0}".format(nng.name))
144 max_sg_size = 0
145 for sg in reversed(nng.subgraphs):
146 print(" Subgraph: {0} = {1}".format(sg.name, sg.placement))
147 sg_size = 0
148
149 if sg.placement == PassPlacement.Npu:
150 for tens in sg.input_tensors + [sg.scratch_tensor] + sg.output_tensors:
151 if tens in sg.input_tensors:
152 tens_dir = "In"
153 elif tens in sg.output_tensors:
154 tens_dir = "Out"
155 else:
156 tens_dir = "In/Out"
157
158 size = tens.elements() * tens.element_size() / 1024.0
159 sg_size = sg_size + size
160 print(" Tensor [{0}]: {1} = {2} KiB".format(tens_dir, tens.name, size))
161
162 print(" Total Size = {0} KiB".format(sg_size))
163 print(" SRAM Memory Used = {0} KiB".format(sg.memory_used.get(MemArea.Sram, 0) / 1024.0))
164 max_sg_size = max(sg_size, max_sg_size)
165
166 print(" Maximum Subgraph Size = {0} KiB".format(max_sg_size))
167
168
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000169def generate_supported_ops():
Jonas Ohlsson0957e3e2021-09-01 15:57:21 +0200170 # Exclude network type from generation by adding value to exclude list.
171 # To easily exclude NetworkType from generated documentation.
172 exclude_generation_network_type_value = [NetworkType.TOSA.value]
173
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000174 lines = [
175 "# Supported Ops",
176 "",
177 "This file was automatically generated by Vela using the `--supported-ops-report` parameter. ",
178 f"Vela version: `{__version__}`",
179 "",
Michael McGeagh54a61112020-11-24 14:58:51 +0000180 "This file complies with",
181 "[**Gitiles Markdown syntax**](https://github.com/google/gitiles/blob/master/Documentation/markdown.md)",
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000182 "",
Jonas Ohlsson45e653d2021-07-26 16:13:12 +0200183 "Summary table of constraints for:",
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000184 ]
Jonas Ohlsson45e653d2021-07-26 16:13:12 +0200185
186 for network_type in NetworkType:
Jonas Ohlsson0957e3e2021-09-01 15:57:21 +0200187 if network_type.value in exclude_generation_network_type_value:
188 continue
189
Jonas Ohlsson45e653d2021-07-26 16:13:12 +0200190 lines += [
191 f"- [{network_type.name}](#{network_type.name.lower()}-summary-table)",
192 ]
193
194 for network_type in NetworkType:
Jonas Ohlsson0957e3e2021-09-01 15:57:21 +0200195 if network_type.value in exclude_generation_network_type_value:
196 continue
197
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000198 lines += [
199 "",
Jonas Ohlsson45e653d2021-07-26 16:13:12 +0200200 f"## {network_type.name} Summary Table",
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000201 "",
202 ]
Jonas Ohlsson45e653d2021-07-26 16:13:12 +0200203 if network_type == NetworkType.TFLite:
204 lines += [
205 "The table below contains TFLite operators that can be placed on the Ethos-U NPU. ",
206 "If the constraints are not met, then that operator will be scheduled on the CPU instead. ",
207 "For any other TFLite operator not listed, will be left untouched and scheduled on the CPU. ",
208 "Please check the supported operator list for your chosen runtime for further information.",
209 "",
210 "| Operator | TFLite Constraints |",
211 "| --- | --- |",
212 ]
213 semantic_checker = TFLiteSemantic()
214 supported = TFLiteSupportedOperators()
215 elif network_type == NetworkType.TOSA:
216 lines += [
217 "The table below contains TOSA operators that can be placed on the Ethos-U NPU. ",
218 "Note: There is limited support for compiling a TOSA neural network (EXPERIMENTAL). ",
219 "The related constraints have not yet been populated in the list.",
220 "",
221 "| Operator | TOSA Constraints |",
222 "| --- | --- |",
223 ]
224 semantic_checker = TosaSemantic()
225 supported = TosaSupportedOperators()
226 else:
227 raise ValueError
228
229 op_constraint_links = []
230 op_list = sorted(((op, builtin_type_name(op)) for op in builtin_operator_map), key=lambda x: x[1])
231 for op, name in op_list:
232 internal_op = builtin_operator_map[op][0]
233 if internal_op in TFLiteSupportedOperators.supported_operators:
234 links = f"[Generic](#{network_type.name.lower()}-generic-constraints)"
235 if (
236 internal_op in supported.specific_constraints
237 or internal_op in semantic_checker.specific_constraints
238 ):
239 links += f", [Specific](#{network_type.name.lower()}-{name.lower()}-constraints)"
240 op_constraint_links.append((internal_op, name))
241 lines.append(f"| {name} | {links} |")
242 lines += [
243 "",
244 f"### {network_type.name} Generic Constraints",
245 "",
246 "This is a list of constraints that all NPU operators must satisfy in order to be scheduled on the NPU.",
247 "",
248 ]
249 for constraint in semantic_checker.generic_constraints:
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000250 # Markdown needs two spaces at the end of a line to render it as a separate line
251 reason = constraint.__doc__.replace("\n", " \n")
252 lines.append(f"- {reason}")
Jonas Ohlsson45e653d2021-07-26 16:13:12 +0200253 for constraint in supported.generic_constraints:
254 # Markdown needs two spaces at the end of a line to render it as a separate line
255 reason = constraint.__doc__.replace("\n", " \n")
256 lines.append(f"- {reason}")
257 for op, name in op_constraint_links:
258 lines += [
259 "",
260 f"### {network_type.name} {name} Constraints",
261 "",
262 f"This is a list of constraints that the {name} operator must satisfy in order to be scheduled on the"
263 " NPU.",
264 "",
265 ]
266 for constraint in semantic_checker.specific_constraints[op]:
267 # Markdown needs two spaces at the end of a line to render it as a separate line
268 reason = constraint.__doc__.replace("\n", " \n")
269 lines.append(f"- {reason}")
270 for constraint in supported.specific_constraints[op]:
271 # Markdown needs two spaces at the end of a line to render it as a separate line
272 reason = constraint.__doc__.replace("\n", " \n")
273 lines.append(f"- {reason}")
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000274
275 # Note. this will generate the file in the CWD
276 filepath = os.path.join(os.getcwd(), "SUPPORTED_OPS.md")
277 with open(filepath, "wt") as md:
278 md.writelines(line + "\n" for line in lines)
279 print(f"Report file: {filepath}")
280
281
Tim Hall79d07d22020-04-27 18:20:16 +0100282def main(args=None):
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100283 try:
284 if args is None:
285 args = sys.argv[1:]
Tim Hall79d07d22020-04-27 18:20:16 +0100286
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100287 parser = argparse.ArgumentParser(prog="vela", description="Neural network model compiler for Arm Ethos-U NPUs")
288 parser.add_argument("--version", action="version", version=__version__)
289 parser.add_argument(
290 "--api-version", action="version", version=API_VERSION, help="Displays the version of the external API."
291 )
292 parser.add_argument(
293 "--supported-ops-report",
294 action="store_true",
295 help="Generate the SUPPORTED_OPS.md file in the current working directory and exit",
Tim Hallb9b515c2020-11-01 21:27:19 +0000296 )
Jacob Bohlin0628a8c2020-08-28 13:25:14 +0200297
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100298 # set network nargs to be optional to allow the support-ops-report CLI option to be used standalone
299 parser.add_argument(
300 "network",
301 metavar="NETWORK",
302 type=str,
303 default=None,
304 nargs="?",
305 help="Filename of the input TensorFlow Lite for Microcontrollers network",
306 )
307 parser.add_argument(
308 "--output-dir", type=str, default="output", help="Output directory to write files to (default: %(default)s)"
309 )
310 parser.add_argument(
311 "--enable-debug-db",
312 action="store_true",
313 default=None,
314 help="Enables the calculation and writing of a network debug database to output directory",
315 )
316 parser.add_argument(
317 "--config",
318 type=str,
319 action="append",
320 help="Vela configuration file(s) in Python ConfigParser .ini file format",
321 )
322 parser.add_argument("--verbose-all", action="store_true", help="Enable all verbose options")
323 parser.add_argument(
324 "--verbose-config", action="store_true", help="Verbose system configuration and memory mode"
325 )
326 parser.add_argument("--verbose-graph", action="store_true", help="Verbose graph rewriter")
327 parser.add_argument("--verbose-quantization", action="store_true", help="Verbose quantization")
328 parser.add_argument("--verbose-packing", action="store_true", help="Verbose pass packing")
329 parser.add_argument("--verbose-tensor-purpose", action="store_true", help="Verbose tensor purpose")
330 parser.add_argument("--verbose-tensor-format", action="store_true", help="Verbose tensor format")
331 parser.add_argument("--verbose-schedule", action="store_true", help="Verbose schedule")
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100332 parser.add_argument("--verbose-allocation", action="store_true", help="Verbose tensor allocation")
333 parser.add_argument(
334 "--verbose-high-level-command-stream", action="store_true", help="Verbose high level command stream"
335 )
336 parser.add_argument(
337 "--verbose-register-command-stream", action="store_true", help="Verbose register command stream"
338 )
339 parser.add_argument("--verbose-operators", action="store_true", help="Verbose operator list")
Fredrik Svedbergf5c07c42021-04-23 14:36:42 +0200340 parser.add_argument("--verbose-weights", action="store_true", help="Verbose weights information")
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100341 parser.add_argument(
342 "--show-cpu-operations", action="store_true", help="Show the operations that fall back to the CPU"
343 )
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100344 parser.add_argument("--timing", action="store_true", help="Time the compiler doing operations")
345 parser.add_argument(
346 "--accelerator-config",
347 type=str,
348 default="ethos-u55-256",
349 choices=list(architecture_features.Accelerator.member_list()),
350 help="Accelerator configuration to use (default: %(default)s)",
351 )
352 parser.add_argument(
353 "--system-config",
354 type=str,
355 default=architecture_features.ArchitectureFeatures.DEFAULT_CONFIG,
356 help="System configuration to select from the Vela configuration file (default: %(default)s)",
357 )
358 parser.add_argument(
359 "--memory-mode",
360 type=str,
361 default=architecture_features.ArchitectureFeatures.DEFAULT_CONFIG,
362 help="Memory mode to select from the Vela configuration file (default: %(default)s)",
363 )
364 parser.add_argument(
365 "--tensor-allocator",
366 default=TensorAllocator.HillClimb,
367 type=lambda s: TensorAllocator[s],
368 choices=list(TensorAllocator),
369 help="Tensor Allocator algorithm (default: %(default)s)",
370 )
371 parser.add_argument(
372 "--show-subgraph-io-summary",
373 action="store_true",
374 help="Shows a summary of all the subgraphs and their inputs and outputs",
375 )
376 parser.add_argument(
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100377 "--max-block-dependency",
378 type=int,
379 default=architecture_features.ArchitectureFeatures.MAX_BLOCKDEP,
380 choices=range(0, architecture_features.ArchitectureFeatures.MAX_BLOCKDEP + 1),
381 help=(
382 "Set the maximum value that can be used for the block dependency between npu kernel operations"
383 " (default: %(default)s)"
384 ),
385 )
386 parser.add_argument(
Tim Halld8339a72021-05-27 18:49:40 +0100387 "--optimise",
388 type=lambda s: scheduler.OptimizationStrategy[s],
389 default=scheduler.OptimizationStrategy.Performance,
390 choices=list(scheduler.OptimizationStrategy),
391 help=(
392 "Set the optimisation strategy. The Size strategy results in minimal SRAM usage (does not use"
393 " arena-cache-size). The Performance strategy results in maximal performance (uses the arena-cache-size"
394 " if specified) (default: %(default)s)"
395 ),
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100396 )
397 parser.add_argument(
Tim Halld8339a72021-05-27 18:49:40 +0100398 "--arena-cache-size",
399 type=int,
400 help=(
401 "Set the size of the arena cache memory area, in bytes. If specified, this option overrides the memory"
402 " mode attribute with the same name in a Vela configuration file"
403 ),
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100404 )
405 parser.add_argument(
406 "--cpu-tensor-alignment",
407 type=int,
408 default=Tensor.AllocationQuantum,
409 help=(
410 "Controls the allocation byte alignment of cpu tensors including Ethos-U Custom"
411 " operator inputs and outputs (default: %(default)s)"
412 ),
413 )
Dwight Lidmanb9c95422021-08-18 19:24:14 +0200414 parser.add_argument(
415 "--recursion-limit",
416 type=int,
417 default=1000,
418 help="Set the recursion depth limit, may result in RecursionError if too low (default: %(default)s)",
419 )
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100420 args = parser.parse_args(args=args)
Louis Verhaard52078302020-11-18 13:35:06 +0100421
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100422 # Generate the supported ops report and exit
423 if args.supported_ops_report:
424 generate_supported_ops()
425 return 0
Louis Verhaard52078302020-11-18 13:35:06 +0100426
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100427 if args.network is None:
428 parser.error("the following argument is required: NETWORK")
Michael McGeagh2fa40ae2020-12-02 10:55:04 +0000429
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100430 # check all config files exist because they will be read as a group
431 if args.config is not None:
432 for filename in args.config:
433 if not os.access(filename, os.R_OK):
434 raise InputFileError(filename, "File not found or is not readable")
Tim Hall79d07d22020-04-27 18:20:16 +0100435
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100436 if args.cpu_tensor_alignment < 16 or args.cpu_tensor_alignment & (args.cpu_tensor_alignment - 1) != 0:
437 parser.error(
438 "Invalid argument to --cpu-tensor-alignment = {} (must be greater than or equal to 16 and a power of 2)"
439 "".format(args.cpu_tensor_alignment)
440 )
Tim Hall79d07d22020-04-27 18:20:16 +0100441
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100442 if args.system_config == ArchitectureFeatures.DEFAULT_CONFIG:
443 print(f"Warning: Using {ArchitectureFeatures.DEFAULT_CONFIG} values for system configuration")
Tim Hall79d07d22020-04-27 18:20:16 +0100444
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100445 if args.memory_mode == ArchitectureFeatures.DEFAULT_CONFIG:
446 print(f"Warning: Using {ArchitectureFeatures.DEFAULT_CONFIG} values for memory mode")
Tim Hall79d07d22020-04-27 18:20:16 +0100447
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100448 if args.verbose_all:
449 for v in vars(args):
450 if v.startswith("verbose") and v != "verbose_all":
451 setattr(args, v, True)
452
Dwight Lidmanb9c95422021-08-18 19:24:14 +0200453 sys.setrecursionlimit(args.recursion_limit)
454
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100455 arch = architecture_features.ArchitectureFeatures(
456 vela_config_files=args.config,
457 system_config=args.system_config,
458 memory_mode=args.memory_mode,
459 accelerator_config=args.accelerator_config,
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100460 max_blockdep=args.max_block_dependency,
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100461 verbose_config=args.verbose_config,
Tim Halld8339a72021-05-27 18:49:40 +0100462 arena_cache_size=args.arena_cache_size,
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100463 )
464
465 compiler_options = compiler_driver.CompilerOptions(
466 verbose_graph=args.verbose_graph,
467 verbose_quantization=args.verbose_quantization,
468 verbose_packing=args.verbose_packing,
469 verbose_tensor_purpose=args.verbose_tensor_purpose,
470 verbose_tensor_format=args.verbose_tensor_format,
471 verbose_allocation=args.verbose_allocation,
472 verbose_high_level_command_stream=args.verbose_high_level_command_stream,
473 verbose_register_command_stream=args.verbose_register_command_stream,
474 verbose_operators=args.verbose_operators,
Fredrik Svedbergf5c07c42021-04-23 14:36:42 +0200475 verbose_weights=args.verbose_weights,
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100476 show_cpu_operations=args.show_cpu_operations,
477 tensor_allocator=args.tensor_allocator,
478 timing=args.timing,
479 output_dir=args.output_dir,
480 cpu_tensor_alignment=args.cpu_tensor_alignment,
481 )
482
483 scheduler_options = scheduler.SchedulerOptions(
Tim Halld8339a72021-05-27 18:49:40 +0100484 optimization_strategy=args.optimise,
485 sram_target=arch.arena_cache_size,
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100486 verbose_schedule=args.verbose_schedule,
Henrik G Olssonea9b23c2021-03-23 17:34:49 +0100487 )
488
489 model_reader_options = model_reader.ModelReaderOptions()
490
491 nng = process(
492 args.network, args.enable_debug_db, arch, model_reader_options, compiler_options, scheduler_options
493 )
494
495 if args.show_subgraph_io_summary:
496 print_subgraph_io_summary(nng)
497
498 return 0
499 except VelaError as e:
500 print(e.data)
501 return 1