code: def run_subprocess(
      self, target, args=..., nprocs=1, envs=None
  ) -> Any:
      from bigdl.nano.utils.common import SafePickle
      import subprocess
      import sys
  
      with TemporaryDirectory() as temp_dir:
          with open(os.path.join(temp_dir, "args.pkl"), "wb") as f:
              SafePickle.dump((envs,) + args, f)
          with open(os.path.join(temp_dir, "target.pkl"), "wb") as f:
              SafePickle.dump(target, f)
  
          cwd_path = os.path.split(os.path.realpath(__file__))[0]
  
          invalidInputError(
              os.path.isdir(cwd_path),
              "cwd_path should be a valid directory path.",
          )
          invalidInputError(
              os.path.isdir(temp_dir),
              "temp_dir should be a valid directory path.",
          )
          invalidInputError(nprocs > 0, "nprocs must be greater than 0")
  
          p = subprocess.Popen(
              [
                  "horovodrun",
                  "-np",
                  str(nprocs),
                  "-H",
                  f"localhost:{nprocs}",
                  sys.executable,
                  f"{cwd_path}/horovod_worker.py",
                  temp_dir,
              ]
          )
  
          p.wait()
  
          if p.returncode != 0:
              invalidInputError(False, "horovodrun failed")
  
          results = []
          for i in range(nprocs):
              with open(
                  os.path.join(temp_dir, f"history_{i}"), "rb"
              ) as f:
                  results.append(SafePickle.load(f))
      return results
  
file_path: BigDL/python/nano/src/bigdl/nano/deps/horovod/multiprocs_backend.py
imports: from bigdl.nano.utils.common import Backend
  from bigdl.nano.utils.common import invalidInputError
  import os
  from tempfile import TemporaryDirectory
  from typing import Any
label_desc: Use image node_id 4 for calling the HorovodBackend obj's underlying member method code with example usage: obj.run_subprocess(target, args, nprocs, envs) and returns: results