diff --git a/src/accelerate/commands/launch.py b/src/accelerate/commands/launch.py
index 8e372adea..7cb4529d9 100644
--- a/src/accelerate/commands/launch.py
+++ b/src/accelerate/commands/launch.py
@@ -32,19 +32,26 @@
 from accelerate.commands.config.config_args import SageMakerConfig
 from accelerate.state import get_int_from_env
 from accelerate.utils import (
+    TORCH_LAUNCH_PARAMS,
     ComputeEnvironment,
     DistributedType,
     PrecisionType,
     PrepareForLaunch,
+    _filter_args,
     get_launch_prefix,
     is_deepspeed_available,
     is_sagemaker_available,
+    is_torch_version,
     patch_environment,
 )
 from accelerate.utils.constants import DEEPSPEED_MULTINODE_LAUNCHERS
 from accelerate.utils.dataclasses import SageMakerDistributedType
 
 
+if is_torch_version(">=", "1.9.0"):
+    import torch.distributed.run as distrib_run
+
+
 logger = logging.getLogger(__name__)
 
 
@@ -355,43 +362,32 @@ def simple_launcher(args):
 
 
 def multi_gpu_launcher(args):
-    cmd = get_launch_prefix()
-    if args.num_machines > 1:
-        cmd.extend(
-            [
-                "--nproc_per_node",
-                str(args.num_processes // args.num_machines),
-                "--nnodes",
-                str(args.num_machines),
-                "--node_rank",
-                str(args.machine_rank),
-                "--master_addr",
-                args.main_process_ip,
-                "--master_port",
-                str(args.main_process_port),
-            ]
-        )
+    num_processes = getattr(args, "num_processes")
+    num_machines = getattr(args, "num_machines")
+    if num_machines > 1:
+        setattr(args, "nproc_per_node", str(num_processes // num_machines))
+        setattr(args, "nnodes", str(num_machines))
+        setattr(args, "machine_rank", str(args.machine_rank))
+        setattr(args, "master_addr", str(args.main_process_ip))
+        setattr(args, "master_port", str(args.main_process_port))
     else:
-        cmd.extend(["--nproc_per_node", str(args.num_processes)])
+        setattr(args, "nproc_per_node", str(num_processes))
         if args.main_process_port is not None:
-            cmd.extend(["--master_port", str(args.main_process_port)])
+            setattr(args, "master_port", str(args.main_process_port))
 
     if args.module and args.no_python:
         raise ValueError("--module and --no_python cannot be used together")
     elif args.module:
-        cmd.append("--module")
+        setattr(args, "module", True)
     elif args.no_python:
-        cmd.append("--no_python")
-    cmd.append(args.training_script)
-    cmd.extend(args.training_script_args)
+        setattr(args, "no_python", True)
 
     current_env = os.environ.copy()
+    mixed_precision = args.mixed_precision.lower()
     try:
-        mixed_precision = PrecisionType(args.mixed_precision.lower())
+        mixed_precision = PrecisionType(mixed_precision)
     except ValueError:
-        raise ValueError(
-            f"Unknown mixed_precision mode: {args.mixed_precision.lower()}. Choose between {PrecisionType.list()}."
-        )
+        raise ValueError(f"Unknown mixed_precision mode: {mixed_precision}. Choose between {PrecisionType.list()}.")
 
     if args.fp16:
         warnings.warn('--fp16 flag is deprecated. Use "--mixed_precision fp16" instead.', DeprecationWarning)
@@ -444,10 +440,25 @@ def multi_gpu_launcher(args):
         if args.fsdp_state_dict_type is not None:
             current_env["FSDP_STATE_DICT_TYPE"] = str(args.fsdp_state_dict_type)
     current_env["OMP_NUM_THREADS"] = str(args.num_cpu_threads_per_process)
-    process = subprocess.Popen(cmd, env=current_env)
-    process.wait()
-    if process.returncode != 0:
-        raise subprocess.CalledProcessError(returncode=process.returncode, cmd=cmd)
+    if is_torch_version(">=", "1.9.0"):
+        distrib_args = _filter_args(args)
+        with patch_environment(**current_env):
+            distrib_run.run(distrib_args)
+    else:
+        # We still have to use subprocess, the user won't get a clean traceback as a result
+        cmd = get_launch_prefix()
+        for k, v in vars(args).items():
+            if k in TORCH_LAUNCH_PARAMS and v:
+                param = [f"--{k}"]
+                if not v:
+                    param.append(v)
+                cmd.extend(param)
+        cmd.append(args.training_script)
+        cmd.extend(args.training_script_args)
+        process = subprocess.Popen(cmd, env=current_env)
+        process.wait()
+        if process.returncode != 0:
+            raise subprocess.CalledProcessError(returncode=process.returncode, cmd=cmd)
 
 
 def deepspeed_launcher(args):
diff --git a/src/accelerate/utils/__init__.py b/src/accelerate/utils/__init__.py
index db21afc3a..2b8f566f0 100644
--- a/src/accelerate/utils/__init__.py
+++ b/src/accelerate/utils/__init__.py
@@ -2,7 +2,7 @@
 # There's no way to ignore "F401 '...' imported but unused" warnings in this
 # module, but to preserve other warnings. So, don't check this module at all
 
-from .constants import MODEL_NAME, OPTIMIZER_NAME, RNG_STATE_NAME, SCALER_NAME, SCHEDULER_NAME
+from .constants import MODEL_NAME, OPTIMIZER_NAME, RNG_STATE_NAME, SCALER_NAME, SCHEDULER_NAME, TORCH_LAUNCH_PARAMS
 from .dataclasses import (
     ComputeEnvironment,
     DeepSpeedPlugin,
@@ -91,7 +91,7 @@
         HfDeepSpeedConfig,
     )
 
-from .launch import PrepareForLaunch, get_launch_prefix
+from .launch import PrepareForLaunch, _filter_args, get_launch_prefix
 from .memory import find_executable_batch_size
 from .other import (
     extract_model_from_parallel,
diff --git a/src/accelerate/utils/constants.py b/src/accelerate/utils/constants.py
index 4e7c71853..934923bef 100644
--- a/src/accelerate/utils/constants.py
+++ b/src/accelerate/utils/constants.py
@@ -31,3 +31,30 @@
 DEEPSPEED_MULTINODE_LAUNCHERS = ["pdsh", "standard", "openmpi", "mvapich"]
 
 STR_OPERATION_TO_FUNC = {">": op.gt, ">=": op.ge, "==": op.eq, "!=": op.ne, "<=": op.le, "<": op.lt}
+
+# These are the args for `torch.distributed.launch` for pytorch < 1.9
+TORCH_LAUNCH_PARAMS = [
+    "nnodes",
+    "nproc_per_node",
+    "rdzv_backend",
+    "rdzv_endpoint",
+    "rdzv_id",
+    "rdzv_conf",
+    "standalone",
+    "max_restarts",
+    "monitor_interval",
+    "start_method",
+    "role",
+    "module",
+    "m",
+    "no_python",
+    "run_path",
+    "log_dir",
+    "r",
+    "redirects",
+    "t",
+    "tee",
+    "node_rank",
+    "master_addr",
+    "master_port",
+]
diff --git a/src/accelerate/utils/launch.py b/src/accelerate/utils/launch.py
index c74185c5d..c6605ee26 100644
--- a/src/accelerate/utils/launch.py
+++ b/src/accelerate/utils/launch.py
@@ -21,6 +21,12 @@
 from .dataclasses import DistributedType
 
 
+if is_torch_version(">=", "1.9.0"):
+    import torch.distributed.run as distrib_run
+else:
+    import torch.distributed.launch as distrib_run
+
+
 def get_launch_prefix():
     """
     Grabs the correct launcher for starting a distributed command, such as either `torchrun`, `python -m
@@ -35,6 +41,23 @@ def get_launch_prefix():
     return cmd
 
 
+def _filter_args(args):
+    """
+    Filters out all `accelerate` specific args
+    """
+    distrib_args = distrib_run.get_args_parser()
+    known_args, _ = distrib_args.parse_known_args()
+    for arg in list(vars(args).keys()):
+        if arg not in vars(known_args).keys():
+            delattr(args, arg)
+    distrib_args = distrib_run.parse_args(vars(args))
+    for key, value in vars(args).items():
+        setattr(distrib_args, key, value)
+    if is_torch_version("<", "1.9.0"):
+        setattr(distrib_args, "use_env", True)
+    return distrib_args
+
+
 class PrepareForLaunch:
     """
     Prepare a function that will launched in a distributed setup.


Review comments: body: Clean!
diff_hunk: @@ -35,6 +36,21 @@ def get_launch_prefix():
     return cmd
 
 
+def _filter_args(args):
body: Please use a regular list here, it's going to be easier to maintain (in terms of diff)
diff_hunk: @@ -31,3 +31,8 @@
 DEEPSPEED_MULTINODE_LAUNCHERS = ["pdsh", "standard", "openmpi", "mvapich"]
 
 STR_OPERATION_TO_FUNC = {">": op.gt, ">=": op.ge, "==": op.eq, "!=": op.ne, "<=": op.le, "<": op.lt}
+
+# These are the args for `torch.distributed.launch` for pytorch < 1.9
+TORCH_LAUNCH_PARAMS = """nnodes,nproc_per_node,rdzv_backend,rdzv_endpoint,rdzv_id,rdzv_conf,standalone,max_restarts,monitor_interval,start_method,role,module,m,no_python,run_path,log_dir,r,redirects,t,tee,node_rank,master_addr,master_port""".split(
+    ","
+)

Discussion: body: _The documentation is not available anymore as the PR was closed or merged._