class_docstr: Execute an FX graph Node-by-Node and record the meta data of the result
  into the corresponding node.
  
  Usage:
      >>> model = MyModule()
      >>> x = torch.rand(10, 10)
      >>> gm = colossalai.fx.symbolic_trace(model, meta_args = {'x': x})
      >>> interp = ShapeProp(gm)
      >>> interp.propagate(x)
  
  Args:
      module (GraphModule): The module to be executed
  
  Hints:
      If you want to add a new shape propagation rule, you can do so by
      adding a new method to this class with the ``@register_shape_impl``
      decorator. The method should take (*args, **kwargs) instance as its
      input and generate output.
  
      For example, if you want to add a shape propagation rule for
      ``torch.nn.functional.linear``, you can do so by adding a new method
      to this class with the ``@register_shape_impl`` decorator (Since the
      ``MetaTensorMode`` is compatible with ``torch.nn.functional.linear``,
      in practice you don't have to do as follows):
  
      >>> @register_shape_impl(torch.nn.functional.linear)
      >>> def linear_shape_impl(*args, **kwargs):
      >>>     # do something here
      >>>     return torch.empty(output_shape, device=output_device)
docstr: Execute a ``call_function`` node and return the result.
  If the target of ``Node`` is registered with ``@register_shape_impl``,
  the registered function will be used to execute the node. This is common
  if we insert some customized kernels.
  
  Args:
      target (Target): The call target for this node. See
          `Node <https://pytorch.org/docs/master/fx.html#torch.fx.Node>`__ for
          details on semantics
      args (Tuple): Tuple of positional args for this invocation
      kwargs (Dict): Dict of keyword arguments for this invocation
  
  Return
      Any: The value returned by the function invocation
docstr_tok: ["Execute","a","``","call_function","``","node","and","return","the","result",".","If","the","target","of","``","Node","``","is","registered","with","``","@","register_shape_impl","``",",","the","registered","function","will","be","used","to","execute","the","node",".","This","is","common","if","we","insert","some","customized","kernels",".","Args",":","target","(","Target",")",":","The","call","target","for","this","node",".","See","`","Node","<","https",":","\/\/pytorch.org\/docs\/master\/fx.html","#","torch.fx.Node",">","`","__","for","details","on","semantics","args","(","Tuple",")",":","Tuple","of","positional","args","for","this","invocation","kwargs","(","Dict",")",":","Dict","of","keyword","arguments","for","this","invocation","Return","Any",":","The","value","returned","by","the","function","invocation"]
code: def call_function(
      self,
      target: "Target",
      args: Tuple[Any, ...],
      kwargs: Dict[str, Any],
  ) -> Any:
      """
      Execute a ``call_function`` node and return the result.
      If the target of ``Node`` is registered with ``@register_shape_impl``,
      the registered function will be used to execute the node. This is common
      if we insert some customized kernels.
  
      Args:
          target (Target): The call target for this node. See
              `Node <https://pytorch.org/docs/master/fx.html#torch.fx.Node>`__ for
              details on semantics
          args (Tuple): Tuple of positional args for this invocation
          kwargs (Dict): Dict of keyword arguments for this invocation
  
      Return
          Any: The value returned by the function invocation
      """
      convert_to_param = False
      if target in (torch.transpose, torch.reshape) and isinstance(
          args[0], torch.nn.parameter.Parameter
      ):
          convert_to_param = True
      if target in self._custom_dispatch_func:
          res = self._custom_dispatch_func[target](*args, **kwargs)
      else:
          res = super().call_function(target, args, kwargs)
      if convert_to_param:
          return torch.nn.Parameter(res)
      else:
          return res
  
imports: from typing import Any, Callable, Dict, Optional, Tuple, Union
  import torch
  import torch.fx
  from torch.autograd.graph import saved_tensors_hooks
  from torch.utils._pytree import tree_map
  from colossalai._analyzer._subclasses import MetaTensor, MetaTensorMode
  from colossalai._analyzer.fx.node_util import MetaInfo
  from colossalai.fx._compatibility import compatibility
label_desc: Use image node_id 3 for calling the ShapeProp obj's underlying member method code with example usage: obj.call_function(target, args, kwargs) and returns: torch, res