class_docstr: Execute an FX graph Node-by-Node with concrete tensor and record the memory
  usage, execution time of forward and backward, and type of the result into
  the corresponding node.
  
  Usage:
      BATCH_SIZE = 2
      DIM_IN = 4
      DIM_HIDDEN = 16
      DIM_OUT = 16
      model = torch.nn.Sequential(
          torch.nn.Linear(DIM_IN, DIM_HIDDEN),
          torch.nn.Linear(DIM_HIDDEN, DIM_OUT),
          ).cuda()
      input_sample = torch.rand(BATCH_SIZE, DIM_IN, device="cuda")
      gm = symbolic_trace(model)
      interp = ConcreteInfoProp(gm)
      interp.run(input_sample)
      print(interp.summary(unit='kb'))
  
  
      output of above code is
      Op type       Op             Forward time             Backward time    SAVE_FWD_IN    FWD_OUT    FWD_TMP    BWD_OUT    BWD_TMP
      -----------  -------  -----------------------  ------------------------  -------------  ---------  ---------  ---------  ---------
      placeholder  input_1                    0.0 s                     0.0 s          False    0.00 KB    0.00 KB    0.00 KB    0.00 KB
      call_module       _0  0.0003993511199951172 s     0.00706791877746582 s          False    0.50 KB    0.00 KB    0.03 KB    0.66 KB
      call_module       _1   6.29425048828125e-05 s  0.00018286705017089844 s          False    0.50 KB    0.00 KB    0.12 KB    0.81 KB
           output   output                    0.0 s                     0.0 s           True    0.00 KB    0.00 KB    0.00 KB    0.00 KB
  Args:
       module (GraphModule): The module to be executed
class_docstr_tok: ["Execute","an","FX","graph","Node-by-Node","with","concrete","tensor","and","record","the","memory","usage",",","execution","time","of","forward","and","backward",",","and","type","of","the","result","into","the","corresponding","node",".","Usage",":","BATCH_SIZE","=","2","DIM_IN","=","4","DIM_HIDDEN","=","16","DIM_OUT","=","16","model","=","torch.nn.Sequential","(","torch.nn.Linear","(","DIM_IN",",","DIM_HIDDEN",")",",","torch.nn.Linear","(","DIM_HIDDEN",",","DIM_OUT",")",",",")",".cuda","(",")","input_sample","=","torch.rand","(","BATCH_SIZE",",","DIM_IN",",","device=","''","cuda","''",")","gm","=","symbolic_trace","(","model",")","interp","=","ConcreteInfoProp","(","gm",")","interp.run","(","input_sample",")","print","(","interp.summary","(","unit='kb","'",")",")","output","of","above","code","is","Op","type","Op","Forward","time","Backward","time","SAVE_FWD_IN","FWD_OUT","FWD_TMP","BWD_OUT","BWD_TMP","--","--","--","--","--","-","--","--","--","-","--","--","--","--","--","--","--","--","--","--","--","-","--","--","--","--","--","--","--","--","--","--","--","--","--","--","--","--","--","--","-","--","--","--","--","-","--","--","--","--","-","--","--","--","--","-","--","--","--","--","-","placeholder","input_1","0.0","s","0.0","s","False","0.00","KB","0.00","KB","0.00","KB","0.00","KB","call_module","_0","0.0003993511199951172","s","0.00706791877746582","s","False","0.50","KB","0.00","KB","0.03","KB","0.66","KB","call_module","_1","6.29425048828125e-05","s","0.00018286705017089844","s","False","0.50","KB","0.00","KB","0.12","KB","0.81","KB","output","output","0.0","s","0.0","s","True","0.00","KB","0.00","KB","0.00","KB","0.00","KB","Args",":","module","(","GraphModule",")",":","The","module","to","be","executed"]
docstr: Run a specific node ``n`` and return the result.
  Calls into placeholder, get_attr, call_function,
  call_method, call_module, or output depending
  on ``node.op``
  
  Args:
      n (Node): The Node to execute
  
  Returns:
      Any: The result of executing ``n``
docstr_tok: ["Run","a","specific","node","``","n","``","and","return","the","result",".","Calls","into","placeholder",",","get_attr",",","call_function",",","call_method",",","call_module",",","or","output","depending","on","``","node.op","``","Args",":","n","(","Node",")",":","The","Node","to","execute","Returns",":","Any",":","The","result","of","executing","``","n","``"]
code: def run_node(self, n: Node) -> Any:
      """
      Run a specific node ``n`` and return the result.
      Calls into placeholder, get_attr, call_function,
      call_method, call_module, or output depending
      on ``node.op``
  
      Args:
          n (Node): The Node to execute
  
      Returns:
          Any: The result of executing ``n``
      """
      self._is_proped = True
      result, meta_info = super().run_node(n)
  
      n.meta = {
          **n.meta,
          **asdict(meta_info),
      }  # extend MetaInfo to `n.meta`
      # TODO: the attribute node_size should be removed in the future
      setattr(
          n,
          "node_size",
          n.meta.get("fwd_mem_tmp", 0) + n.meta.get("fwd_mem_out", 0),
      )
      n.meta["type"] = type(result)
  
      # retain the autograd graph
      for param in self.module.parameters():
          param.grad = None
  
      return result
  
file_path: colossalai/colossalai/fx/passes/concrete_info_prop.py
imports: from dataclasses import asdict
  from typing import Any, Dict, List, Optional, Tuple
  import torch
  import torch.fx
  from torch.fx.node import Argument, Node, Target
  from torch.utils._pytree import tree_flatten
  from colossalai.fx._compatibility import compatibility
  from colossalai.fx.profiler import GraphInfo, profile_function, profile_method, profile_module
label_desc: Use image node_id 2 for calling the ConcreteInfoProp obj's underlying member method code with example usage: obj.run_node(n) and returns: result