code: def run(self, target, args=..., nprocs=1, envs=None):
      if envs is not None:
          if isinstance(envs, list):
              invalidInputError(
                  nprocs == len(envs),
                  "envs must have the same length with nprocs",
              )
          elif isinstance(envs, dict):
              envs = [envs] * nprocs
          else:
              invalidInputError(
                  False, "envs must be a dict or a list of dict"
              )
  
      results = []
      for i in range(nprocs):
          runtime_env = {"env_vars": envs[i]}
          results.append(
              ray.remote(target)
              .options(runtime_env=runtime_env)
              .remote(*args)
          )
      return ray.get(results)
  
file_path: BigDL/python/nano/src/bigdl/nano/deps/ray/ray_backend.py
imports: import ray
  from bigdl.nano.utils.common import Backend
  from bigdl.nano.utils.common import invalidInputError
label_desc: Use image node_id 3 for calling the RayBackend obj's underlying member method code with example usage: obj.run(target, args, nprocs, envs) and returns: ray