class_docstr: This class is used to automatically find problematic nodes in a model. It takes a FX
  graphmodule and generate some submodules while traverse the graph. Then two functions
  `run_a` and `run_b` will be used to run the same submodule and a function `compare_fn`
  will be used to compare the results.
  
  Currently we provides two ways to traverse the graph and generate submodules.
      1. Sequential traversal: this will traverse the graph node by node and generate
         one submodule with one sigle node.
      2. Binary searching: this will do a binary search style traversal on the graph.
  
  For internal Users, a guide can be found here https://fb.quip.com/HDtuAgiKGfkP.
docstr: Run part of the model from `start` node to `end` node. If `start` is None
  then we start from the beginning of the model. If `end` is None then we
  stop at the end of the model.
  
  Args:
      start: The name of the node which is the first node of the submodule
          we want to run. If set to None, then we'll start with the first
          node of the model.
      end: The name of the node which is the last node of the submodule we
          want to run. If set to None, we'll end with the last node of the
          model.
code: def run_nodes(
      self, start: Optional[str] = None, end: Optional[str] = None
  ):
      """
      Run part of the model from `start` node to `end` node. If `start` is None
      then we start from the beginning of the model. If `end` is None then we
      stop at the end of the model.
  
      Args:
          start: The name of the node which is the first node of the submodule
              we want to run. If set to None, then we'll start with the first
              node of the model.
          end: The name of the node which is the last node of the submodule we
              want to run. If set to None, we'll end with the last node of the
              model.
      """
      nodes = self._collect_nodes(start, end)
      cur_nodes = set(nodes)
  
      for node in nodes:
          if node in self.fusions:
              cur_nodes.update(self.fusions[node])
  
      output_names = []
      if self.settings.return_intermediate:
          output_names = [node.name for node in nodes]
  
      try:
          split_module, submod_name = self._build_submodule(cur_nodes)
          self._run_and_compare(split_module, submod_name, output_names)
      except (
          FxNetMinimizerRunFuncError,
          FxNetMinimizerResultMismatchError,
      ) as e:
          print(e)
  
imports: import logging
  from dataclasses import dataclass
  from typing import Any, Callable, Dict, List, Optional, Tuple
  import torch
  import torch.fx
  from torch.fx._compatibility import compatibility
  from torch.fx.node import map_arg
  from .shape_prop import ShapeProp
  from .split_utils import split_by_tags
  from .tools_common import CALLABLE_NODE_OPS, FxNetAccFusionsFinder, Names, NodeList, NodeSet, TensorOrTensors, Tensors
label_desc: Use image node_id 16 for calling the _MinimizerBase obj's underlying member method code with example usage: obj.run_nodes(start, end) without return types