chunit-quic commented on code in PR #13212:
URL: https://github.com/apache/tvm/pull/13212#discussion_r1090188874


##########
python/tvm/relay/frontend/common.py:
##########
@@ -1067,6 +1067,20 @@ def __init__(self, span):
             self._span = 
tvm.relay.Span(tvm.relay.SourceName(span.decode("utf-8")), 0, 0, 0, 0)
         else:
             assert False, f"unsupported span type: {type(span)}"
+        self.suffix_str = "_PART_"
+        self.counter = 0
+        self.distance_from_leaf = -1
+
+    def _create_span(self):
+        """Adds suffix_str + counter value to _span.source_name.name,
+        to create a unique source_name for the Relay layer
+        """
+        if self.distance_from_leaf == 0:
+            return tvm.relay.Span(tvm.relay.SourceName(self._span), 0, 0, 0, 0)
+        self.distance_from_leaf -= 1
+        span_str = "{}{}{}".format(self._span.source_name.name, 
self.suffix_str, str(self.counter))
+        self.counter += 1
+        return tvm.relay.Span(tvm.relay.SourceName(span_str), 0, 0, 0, 0)

Review Comment:
   > This seems sensible to me, cc the original author of span filling 
@chunit-quic just to check
   
   Hi all,
   
   Thank you for informing us this change, we just check the PR. We have some 
ideas about it, and we would like to share some discussions about the suffix in 
the forum with you.
   
   About the way how span is used in the PR, it looks to me like you would like 
to take the
   source_name of span as an indicator to the original Relay call(expression). 
   We find the hash value might be enough for your use case rather than making 
a unique source_name for a span. Please allow me to describe some problems 
might be cuased by adding suffix.
   
   We removed suffix in the new implementation in our 
[preRFC](https://discuss.tvm.apache.org/t/pre-rfc-tvm-explorer-infrastructure/13457#reference-level-explanation-9).
 In short, we found adding suffix might mislead in some cases. Here is an 
example:
   
   Suppose:
   1. An user thinks span meaning where an expression is from
   2. A conv2d layer is converted to 2 relay exprs (conv2d and relu) in a 
specific frontend.
   
   The conversion of a simple frontend model with only a conv2d layer will 
result in this:
   
   ```python
   #FRONTEND
   conv2d layer, named as my_conv2d
   #Relay IR
   %0 = conv2d() /* my_conv2d_part_0 */
   %1 = relu() /* my_conv2d_part_1 */
   ```
   In the case above, that user might assume there are "two layers" in the 
original frontend model, rather than thinking the converted Relay exprs are 
from the same forntend layer.
   One is conv2d layer with the name "my_conv2d_part_0", and a relu layer which 
is named as "my_conv2d_part_1".
   
   Yet with help of suffix we do have some advantages. Like allocating the 
expression which generates the tensor output result of its frontend layer. So 
far we have [many 
discussions](https://discuss.tvm.apache.org/t/pre-rfc-tvm-explorer-infrastructure/13457/26?u=chunit)
 with community but we are still thinking about whether there is a better way 
to deal with.
   
   Therefore currently we won't recommend you to add suffix to the source_name 
of span. After checking the codes, perhaps you could consider using the hash 
value, `tvm.ir.structural_hash()` of an expr as the key of dictionary, like:
   
   ```python
   #python/tvm/relay/analysis/operations_distribution.py
   class AnalyzeOperationsDistribution(ExprVisitor):
       #...
       def visit_call(self, call: relay.Call):
           if isinstance(call.op, tvm.ir.Op):
               self.unique_op_ids[tvm.ir.structural_hash(call)] = 
[self.compiler_name, self.func_name, self.func_id]
   #python/tvm/driver/tvmc/compiler.py
   def dump_operation_offloads(...):
       def annotate_f(x):
           ret = ""
           if isinstance(x, relay.Call):
               compiler_name, op_name, func_id = 
operations_distribution[tvm.ir.structural_hash(x)]
               ret = f", func_id: {func_id}, compiler_name: {compiler_name}, 
op_name: {op_name}"
           return ret
   ```
   
   Because no rewriting/mutation is invoked in `dump_operation_offloads()`, 
hash value won't be changed. Maybe hash value is an acceptable alternative?
   
   Thank you for reading! Feel free if you have any question. We will try to 
get back to you soon. :)
   
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to