class_docstr: Ray dag node used in DAG building API to mark entrypoints of a DAG.
  
  Should only be function or class method. A DAG can have multiple
  entrypoints, but only one instance of InputNode exists per DAG, shared
  among all DAGNodes.
  
  Example:
  
  .. code-block::
  
              m1.forward
              /       \
      dag_input     ensemble -> dag_output
              \       /
              m2.forward
  
  In this pipeline, each user input is broadcasted to both m1.forward and
  m2.forward as first stop of the DAG, and authored like
  
  .. code-block:: python
  
      import ray
  
      @ray.remote
      class Model:
          def __init__(self, val):
              self.val = val
          def forward(self, input):
              return self.val * input
  
      @ray.remote
      def combine(a, b):
          return a + b
  
      with InputNode() as dag_input:
          m1 = Model.bind(1)
          m2 = Model.bind(2)
          m1_output = m1.forward.bind(dag_input[0])
          m2_output = m2.forward.bind(dag_input.x)
          ray_dag = combine.bind(m1_output, m2_output)
  
      # Pass mix of args and kwargs as input.
      ray_dag.execute(1, x=2) # 1 sent to m1, 2 sent to m2
  
      # Alternatively user can also pass single data object, list or dict
      # and access them via list index, object attribute or dict key str.
      ray_dag.execute(UserDataObject(m1=1, m2=2))
          # dag_input.m1, dag_input.m2
      ray_dag.execute([1, 2])
          # dag_input[0], dag_input[1]
      ray_dag.execute({"m1": 1, "m2": 2})
          # dag_input["m1"], dag_input["m2"]
class_docstr_tok: ["Ray","dag","node","used","in","DAG","building","API","to","mark","entrypoints","of","a","DAG",".","Should","only","be","function","or","class","method",".","A","DAG","can","have","multiple","entrypoints",",","but","only","one","instance","of","InputNode","exists","per","DAG",",","shared","among","all","DAGNodes",".","Example",":","..","code-block",":",":","m1.forward","\/","\\","dag_input","ensemble","-",">","dag_output","\\","\/","m2.forward","In","this","pipeline",",","each","user","input","is","broadcasted","to","both","m1.forward","and","m2.forward","as","first","stop","of","the","DAG",",","and","authored","like","..","code-block",":",":","python","import","ray","@","ray.remote","class","Model",":","def","__init__","(","self",",","val",")",":","self.val","=","val","def","forward","(","self",",","input",")",":","return","self.val","*","input","@","ray.remote","def","combine","(","a",",","b",")",":","return","a","+","b","with","InputNode","(",")","as","dag_input",":","m1","=","Model.bind","(","1",")","m2","=","Model.bind","(","2",")","m1_output","=","m1.forward.bind","(","dag_input","[","0","]",")","m2_output","=","m2.forward.bind","(","dag_input.x",")","ray_dag","=","combine.bind","(","m1_output",",","m2_output",")","#","Pass","mix","of","args","and","kwargs","as","input",".","ray_dag.execute","(","1",",","x=2",")","#","1","sent","to","m1",",","2","sent","to","m2","#","Alternatively","user","can","also","pass","single","data","object",",","list","or","dict","#","and","access","them","via","list","index",",","object","attribute","or","dict","key","str",".","ray_dag.execute","(","UserDataObject","(","m1=1",",","m2=2",")",")","#","dag_input.m1",",","dag_input.m2","ray_dag.execute","(","[","1",",","2","]",")","#","dag_input","[","0","]",",","dag_input","[","1","]","ray_dag.execute","(","{","``","m1","''",":","1",",","``","m2","''",":","2","}",")","#","dag_input","[","``","m1","''","]",",","dag_input","[","``","m2","''","]"]
code: def __str__(self) -> str:
      return get_dag_node_str(self, "__InputNode__")
  
imports: from typing import Any, Dict, List, Union, Optional
  from ray.dag import DAGNode
  from ray.dag.format_utils import get_dag_node_str
  from ray.experimental.gradio_utils import type_to_string
  from ray.util.annotations import DeveloperAPI
label_desc: Use image node_id 6 for calling the InputNode obj's underlying member method code with example usage: obj.__str__() and returns: get_dag_node_str