From c95c2a9a0480b8ce687e46a08173056489d8ed8c Mon Sep 17 00:00:00 2001 From: auphelia <jakobapk@web.de> Date: Tue, 25 Feb 2020 11:56:33 +0000 Subject: [PATCH] [Core] Edit comments in core module --- docs/finn/_build/doctrees/environment.pickle | Bin 132928 -> 132739 bytes docs/finn/_build/html/end_to_end_flow.html | 10 +++---- .../fpgadataflow/hls_synth_res_estimation.py | 1 + .../analysis/fpgadataflow/res_estimation.py | 1 + src/finn/analysis/topology.py | 13 ++++++--- src/finn/analysis/verify_custom_nodes.py | 4 ++- src/finn/core/datatype.py | 25 +++++++++++------- src/finn/core/modelwrapper.py | 25 +++++++++++------- src/finn/core/onnx_exec.py | 20 ++++++++------ 9 files changed, 62 insertions(+), 37 deletions(-) diff --git a/docs/finn/_build/doctrees/environment.pickle b/docs/finn/_build/doctrees/environment.pickle index fea633144c18d76692cb8554887fae3ca177c98c..514b0d9424d1f5a1bd10354404412a83a8bba92d 100644 GIT binary patch literal 132739 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 YJ|KaAt?t1)0dN>4a4({74r-PE4X1LQIsgCw literal 132928 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 Ut?I#>0&p@VbT6Wp4yJ4WKPUzex&QzG diff --git a/docs/finn/_build/html/end_to_end_flow.html b/docs/finn/_build/html/end_to_end_flow.html index c9bdcf888..ae7c61e88 100644 --- a/docs/finn/_build/html/end_to_end_flow.html +++ b/docs/finn/_build/html/end_to_end_flow.html @@ -35,8 +35,8 @@ <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> - <link rel="next" title="Getting Started" href="getting_started.html" /> - <link rel="prev" title="FINN" href="index.html" /> + <link rel="next" title="finn package" href="source_code/finn.html" /> + <link rel="prev" title="Getting Started" href="getting_started.html" /> </head> <body class="wy-body-for-nav"> @@ -81,8 +81,8 @@ <ul class="current"> -<li class="toctree-l1 current"><a class="current reference internal" href="#">FINN - End-to-End Flow</a></li> <li class="toctree-l1"><a class="reference internal" href="getting_started.html">Getting Started</a></li> +<li class="toctree-l1 current"><a class="current reference internal" href="#">FINN - End-to-End Flow</a></li> <li class="toctree-l1"><a class="reference internal" href="source_code/finn.html">finn package</a></li> </ul> @@ -161,10 +161,10 @@ <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> - <a href="getting_started.html" class="btn btn-neutral float-right" title="Getting Started" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + <a href="source_code/finn.html" class="btn btn-neutral float-right" title="finn package" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> - <a href="index.html" class="btn btn-neutral float-left" title="FINN" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + <a href="getting_started.html" class="btn btn-neutral float-left" title="Getting Started" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> </div> diff --git a/src/finn/analysis/fpgadataflow/hls_synth_res_estimation.py b/src/finn/analysis/fpgadataflow/hls_synth_res_estimation.py index fe07b92a1..89f0c170a 100644 --- a/src/finn/analysis/fpgadataflow/hls_synth_res_estimation.py +++ b/src/finn/analysis/fpgadataflow/hls_synth_res_estimation.py @@ -7,6 +7,7 @@ import finn.util.basic as util def hls_synth_res_estimation(model): """Extracts the results from the vivado synthesis. + Returns {node name : resource estimation}.""" res_dict = {} diff --git a/src/finn/analysis/fpgadataflow/res_estimation.py b/src/finn/analysis/fpgadataflow/res_estimation.py index 27ad91b85..8b9e3df94 100644 --- a/src/finn/analysis/fpgadataflow/res_estimation.py +++ b/src/finn/analysis/fpgadataflow/res_estimation.py @@ -4,6 +4,7 @@ import finn.util.basic as util def res_estimation(model): """Estimates the resources needed for the given model. + Returns {node name : resource estimation}.""" res_dict = {} diff --git a/src/finn/analysis/topology.py b/src/finn/analysis/topology.py index 8f8d426dc..27cb111f5 100644 --- a/src/finn/analysis/topology.py +++ b/src/finn/analysis/topology.py @@ -4,7 +4,9 @@ import numpy as np def is_linear(model): """Checks whether the given model graph is linear. This is done by looking at the fan-out of each tensor. All tensors have a fan-out <= 1 in a linear - graph. Returns {"is_linear": Bool}.""" + graph. + + Returns {"is_linear": Bool}.""" per_tensor_fanouts = get_per_tensor_fanouts(model) # check for tensors that have fanout > 1 multi_fanouts = list(filter(lambda x: x[1] > 1, per_tensor_fanouts.items())) @@ -23,7 +25,9 @@ def get_per_tensor_fanouts(model): def all_tensors_f32(model): """Checks whether all tensors have a float32 dtype, extra quantization - annotations notwithstanding. Returns {"all_tensors_f32": Bool}.""" + annotations notwithstanding. + + Returns {"all_tensors_f32": Bool}.""" all_tensors = model.make_empty_exec_context().items() non_f32_tensors = filter(lambda x: x[1].dtype != np.float32, all_tensors) return {"all_tensors_f32": len(list(non_f32_tensors)) == 0} @@ -33,8 +37,9 @@ def node_inputs_in_expected_order(model): """Verifies that the node inputs are ordered in the way that FINN expects them. When a node has a mixture of static (= constant, initialized) inputs and dynamic inputs, the dynamic input should come first, followed by the - static one. Only verifiable for a small subset of op_types for now. Returns - {"node_inputs_in_expected_order": Bool}.""" + static one. Only verifiable for a small subset of op_types for now. + + Returns {"node_inputs_in_expected_order": Bool}.""" op_types = ["MatMul", "Conv", "Add", "Mul"] nodes = filter(lambda x: x.op_type in op_types, model.graph.node) all_OK = True diff --git a/src/finn/analysis/verify_custom_nodes.py b/src/finn/analysis/verify_custom_nodes.py index e49a0e774..b7a2573e5 100644 --- a/src/finn/analysis/verify_custom_nodes.py +++ b/src/finn/analysis/verify_custom_nodes.py @@ -3,7 +3,9 @@ import finn.custom_op.registry as registry def verify_nodes(model): """Checks if custom ops in graph are correctly built, with all attributes - and inputs. Returns {node op_type : info_messages} + and inputs. + + Returns {node op_type : info_messages} * info_messages: is list of strings about the result of the verification.""" diff --git a/src/finn/core/datatype.py b/src/finn/core/datatype.py index 15fb661d6..21648caa5 100644 --- a/src/finn/core/datatype.py +++ b/src/finn/core/datatype.py @@ -32,9 +32,16 @@ import numpy as np class DataType(Enum): """Enum class that contains FINN data types to set the quantization annotation. ONNX does not support data types smaller than 8-bit integers, whereas in FINN we are - interested in smaller integers down to ternary and bipolar.""" - # important to maintain ordering here: unsigned to signed, fewer to more - # bits. The get_smallest_possible() member function is dependent on this. + interested in smaller integers down to ternary and bipolar. + + Assignment of DataTypes to indices based on following ordering: + + * unsigned to signed + + * fewer to more bits + + Currently supported DataTypes: """ + # important: the get_smallest_possible() member function is dependent on ordering. BINARY = auto() UINT2 = auto() UINT3 = auto() @@ -105,7 +112,7 @@ class DataType(Enum): def allowed(self, value): """Check whether given value is allowed for this DataType. - value (float32): value to be checked""" + * value (float32): value to be checked""" if "FLOAT" in self.name: return True @@ -125,7 +132,7 @@ class DataType(Enum): raise Exception("Unrecognized data type: %s" % self.name) def get_num_possible_values(self): - """Return the number of possible values this DataType can take. Only + """Returns the number of possible values this DataType can take. Only implemented for integer types for now.""" assert self.is_integer() if "INT" in self.name: @@ -136,7 +143,7 @@ class DataType(Enum): return 3 def get_smallest_possible(value): - """Return smallest (fewest bits) possible DataType that can represent + """Returns smallest (fewest bits) possible DataType that can represent value. Prefers unsigned integers where possible.""" if not int(value) == value: return DataType["FLOAT32"] @@ -146,16 +153,16 @@ class DataType(Enum): return dt def signed(self): - """Return whether this DataType can represent negative numbers.""" + """Returns whether this DataType can represent negative numbers.""" return self.min() < 0 def is_integer(self): - """Return whether this DataType represents integer values only.""" + """Returns whether this DataType represents integer values only.""" # only FLOAT32 is noninteger for now return self != DataType.FLOAT32 def get_hls_datatype_str(self): - """Return the corresponding Vivado HLS datatype name.""" + """Returns the corresponding Vivado HLS datatype name.""" if self.is_integer(): if self.signed(): return "ap_int<%d>" % self.bitwidth() diff --git a/src/finn/core/modelwrapper.py b/src/finn/core/modelwrapper.py index b01c82399..cf5026ebf 100644 --- a/src/finn/core/modelwrapper.py +++ b/src/finn/core/modelwrapper.py @@ -52,16 +52,17 @@ class ModelWrapper: self._model_proto = value def save(self, filename): - """Save the wrapper ONNX ModelProto into a file with given name.""" + """Saves the wrapper ONNX ModelProto into a file with given name.""" onnx.save(self._model_proto, filename) def analysis(self, analysis_fxn): - """Run given anaylsis_fxn on this model and return resulting dict.""" + """Runs given anaylsis_fxn on this model and return resulting dict.""" return analysis_fxn(self) def transform(self, transformation, make_deepcopy=True): """Applies given Transformation repeatedly until no more changes can be made and returns a transformed ModelWrapper instance. + If make_deepcopy is specified, operates on a new (deep)copy of model. """ transformed_model = self @@ -76,8 +77,11 @@ class ModelWrapper: def check_compatibility(self): """Checks this model for FINN compatibility: + * no embedded subgraphs + * all tensor shapes are specified, including activations + * all constants are initializers """ # TODO check for no embedded subgraphs @@ -147,7 +151,7 @@ class ModelWrapper: return None def set_tensor_shape(self, tensor_name, tensor_shape, dtype=TensorProto.FLOAT): - """Assign shape in ValueInfoProto for tensor with given name.""" + """Assigns shape in ValueInfoProto for tensor with given name.""" new_vi = oh.make_tensor_value_info(tensor_name, dtype, tensor_shape) # find what container tis tensor's ValueInfo lives in # if not found anywhere, we assume it's a new value_info @@ -161,7 +165,7 @@ class ModelWrapper: target_container.append(new_vi) def set_initializer(self, tensor_name, tensor_value): - """Set the initializer value for tensor with given name.""" + """Sets the initializer value for tensor with given name.""" graph = self._model_proto.graph # convert tensor_value (numpy array) into TensorProto w/ correct name tensor_init_proto = np_helper.from_array(tensor_value) @@ -181,7 +185,7 @@ class ModelWrapper: self.set_tensor_shape(tensor_name, list(tensor_value.shape), dtype) def rename_tensor(self, old_name, new_name): - """Rename a tensor from old_name to new_name.""" + """Renames a tensor from old_name to new_name.""" graph = self.graph # sweep over inputs if util.get_by_name(graph.input, old_name) is not None: @@ -211,7 +215,7 @@ class ModelWrapper: n.output[list(n.output).index(old_name)] = new_name def get_initializer(self, tensor_name): - """Get the initializer value for tensor with given name, if any.""" + """Gets the initializer value for tensor with given name, if any.""" graph = self._model_proto.graph init_names = [x.name for x in graph.initializer] try: @@ -221,7 +225,7 @@ class ModelWrapper: return None def find_producer(self, tensor_name): - """Find and return the node that produces the tensor with given name. + """Finds and returns the node that produces the tensor with given name. Currently only works for linear graphs.""" all_outputs = [x.output[0] for x in self._model_proto.graph.node] try: @@ -231,7 +235,7 @@ class ModelWrapper: return None def find_consumer(self, tensor_name): - """Find and return the node that consumes the tensor with given name. + """Finds and returns the node that consumes the tensor with given name. Currently only works for linear graphs.""" all_inputs = [x.input[0] for x in self._model_proto.graph.node] try: @@ -241,7 +245,7 @@ class ModelWrapper: return None def get_all_tensor_names(self): - """Return a list of all (input, output and value_info) tensor names + """Returns a list of all (input, output and value_info) tensor names in the graph.""" graph = self.graph names = [x.name for x in graph.value_info] @@ -259,6 +263,7 @@ class ModelWrapper: def make_empty_exec_context(self): """Creates an empty execution context for this model. + The execution context is a dictionary of all tensors used for the inference computation. Any initializer values will be taken into account, all other tensors will be zero.""" @@ -294,7 +299,7 @@ class ModelWrapper: return ret def get_tensor_fanout(self, tensor_name): - """Return the number of nodes for which the tensor with given name is + """Returns the number of nodes for which the tensor with given name is as input.""" graph = self.graph fanout = 0 diff --git a/src/finn/core/onnx_exec.py b/src/finn/core/onnx_exec.py index 5ed45339c..ebb5ee6d4 100644 --- a/src/finn/core/onnx_exec.py +++ b/src/finn/core/onnx_exec.py @@ -38,9 +38,10 @@ from finn.custom_op.registry import getCustomOp def execute_node(node, context, graph): - """Execute a single node by using onnxruntime, with custom function or + """Executes a single node by using onnxruntime, with custom function or if dataflow partition by using remote execution or rtlsim. - Input/output provided via context.""" + + * Input/output provided via context.""" if node.op_type == "StreamingDataflowPartition": sdp_node = getCustomOp(node) @@ -94,10 +95,12 @@ def execute_node(node, context, graph): def execute_onnx(model, input_dict, return_full_exec_context=False): - """Execute given ONNX ModelWrapper with given named inputs. - If return_full_exec_context is False, a dict of named outputs is returned + """Executes given ONNX ModelWrapper with given named inputs. + + * If return_full_exec_context is False, a dict of named outputs is returned as indicated by the model.graph.output. - If return return_full_exec_context is True, the full set of tensors used by + + * If return return_full_exec_context is True, the full set of tensors used by the execution (including inputs, weights, activations and final outputs) will be returned as a dict.""" @@ -164,7 +167,7 @@ def execute_onnx(model, input_dict, return_full_exec_context=False): def execute_onnx_and_make_model(model, input_dict): - """Execute given ONNX ModelWrapper with given named inputs and return a new + """Executes given ONNX ModelWrapper with given named inputs and return a new ModelWrapper where an initializer is provided for each tensor as taken from the execution. This new model is useful for debugging, since it contains all the intermediate activation values.""" @@ -187,8 +190,9 @@ def compare_execution( input_dict, compare_fxn=lambda x, y: np.isclose(x, y, atol=1e-3).all(), ): - """Execute two ONNX models and compare their outputs using given function. - compare_fxn should take in two tensors and return a Boolean""" + """Executes two ONNX models and compare their outputs using given function. + + * compare_fxn should take in two tensors and return a Boolean""" # compare values from first output tensors produced res_a = list(execute_onnx(model_a, input_dict).items())[0][1] res_b = list(execute_onnx(model_b, input_dict).items())[0][1] -- GitLab