class_docstr: A Model is a network (more precisely, a directed acyclic graph) of Steps,
  and it is defined from the input/output specification of the pipeline.
  Models have fit and predict routines that, together with graph-based engine,
  allow the automatic (feed-forward) computation of each of the pipeline steps
  when fed with data.
  
  Parameters
  ----------
  inputs
      Inputs to the model.
  
  outputs
      Outputs of the model.
  
  targets
      Targets of the model.
  
  name
      Name of the model (optional). If no name is passed, a name will be
      automatically generated.
code: def _build(self):
      # Model uses the DiGraph data structure to store and operate on its DataPlaceholder and Steps.
      self._graph = build_graph_from_outputs(self._internal_outputs)
  
      # Collect data placeholders
      self._data_placeholders = {}
      for node in self._graph:
          for output in node.outputs:
              self._data_placeholders[output.name] = output
  
      # Collect steps
      self._steps = {node.step.name: node.step for node in self._graph}
  
      self._all_nodes_sorted = (
          self._graph.topological_sort()
      )  # Fail early if graph is acyclic
      self._nodes_cache = SimpleCache()
      self._get_required_nodes(
          self._internal_inputs,
          self._internal_targets,
          self._internal_outputs,
      )
  
imports: from collections import defaultdict
  from typing import Union, List, Dict, Set, Iterable, Optional
  from baikal._core.data_placeholder import is_data_placeholder_list, DataPlaceholder
  from baikal._core.digraph import DiGraph
  from baikal._core.step import Step, InputStep, Node
  from baikal._core.typing import ArrayLike
  from baikal._core.utils import listify, safezip2, SimpleCache, unlistify
label_desc: Use image node_id 2 for calling the Model obj's underlying member method code with example usage: obj._build() without return types