code: def run(self, file, mpi_options=None, **kwargs):
      file_path = os.path.abspath(file)
      invalidInputError(
          os.path.exists(file_path), "file_path doesn't exist"
      )
      file_dir = "/".join(file_path.split("/")[:-1])
      self.scp_file(file_path, file_dir)
  
      # cmd = ["mpiexec.openmpi"]
      cmd = ["mpiexec.hydra"]
      # -l would label the output with process rank. -l/-ppn not available for openmpi.
      # mpi_config = "-np {} ".format(
      mpi_config = [
          "-np",
          self.processes_per_node * len(self.hosts),
          "-ppn",
          self.processes_per_node,
          "-l",
      ]
      mpi_env = os.environ.copy()
      mpi_env.update(self.env)
      if "I_MPI_PIN_DOMAIN" in mpi_env:
          invalidInputError(
              mpi_env["I_MPI_PIN_DOMAIN"] in ["numa", "core", "node"],
              "I_MPI_PIN_DOMAIN must be one of 'numa', 'core', 'node'",
          )
          mpi_config.extend(
              [
                  "-genv",
                  "I_MPI_PIN_DOMAIN={}".format(
                      mpi_env["I_MPI_PIN_DOMAIN"]
                  ),
              ]
          )
      if "OMP_NUM_THREADS" in mpi_env:
          invalidInputError(
              str.isdigit(mpi_env["OMP_NUM_THREADS"]),
              "OMP_NUM_THREADS must be a positive integer",
          )
          mpi_config.extend(
              [
                  "-genv",
                  "OMP_NUM_THREADS={}".format(
                      mpi_env["OMP_NUM_THREADS"]
                  ),
              ]
          )
      if len(self.remote_hosts) > 0:
          mpi_config.extend(["-hosts", ",".join(self.hosts)])
      if mpi_options:
          mpi_config += mpi_options
      cmd.extend(mpi_config.split())
      # cmd.append("ls")
      cmd.append(sys.executable)
      cmd.append("-u")  # This can print as the program runs
      cmd.append(file_path)
      for k, v in kwargs.items():
          cmd.append("--{}={}".format(str(k), str(v)))
      print(cmd)
  
      if len(self.remote_hosts) > 0:
          mpi_env["MASTER_ADDR"] = str(self.master)
      else:  # Single node
          mpi_env["MASTER_ADDR"] = "127.0.0.1"
      # print(mpi_env)
      process = subprocess.Popen(cmd, env=mpi_env)
      process.wait()
  
file_path: BigDL/python/orca/src/bigdl/orca/learn/mpi/mpi_runner.py
imports: import os
  import sys
  import subprocess
  import getpass
  from bigdl.dllib.utils.utils import get_node_ip
  from bigdl.dllib.utils.log4Error import *
label_desc: Use image node_id 2 for calling the MPIRunner obj's underlying member method code with example usage: obj.run(file, mpi_options) without return types