



import importlib
import sys
from argparse import REMAINDER, ArgumentParser
from pathlib import Path

import torch_xla.distributed.xla_multiprocessing as xmp



def 				snake_case_()							->     Any:



  """simple docstring"""






  _snake_case						=							ArgumentParser(
      description=(
          '''PyTorch TPU distributed training launch helper utility that will spawn up multiple distributed processes'''
      )					)

  # Optional arguments for the launch helper
  parser.add_argument('''--num_cores'''			,	type=lowerCamelCase__			,	default=1			,	help='''Number of TPU cores to use (1 or 8).'''					)

  # positional
  parser.add_argument(
      '''training_script'''			,	type=lowerCamelCase__			,	help=(
          '''The full path to the single TPU training '''
          '''program/script to be launched in parallel, '''
          '''followed by all the arguments for the '''
          '''training script'''
      )			,	)

  # rest from the training program
  parser.add_argument('''training_script_args'''			,	nargs=lowerCamelCase__					)

  return parser.parse_args()



def 				snake_case_()							->     Optional[int]:



  """simple docstring"""






  _snake_case						=							parse_args()

  # Import training_script as a module.
  _snake_case						=							Path(args.training_script					)
  sys.path.append(str(script_fpath.parent.resolve()					)					)
  _snake_case						=							script_fpath.stem
  _snake_case						=							importlib.import_module(lowerCamelCase__					)

  # Patch sys.argv
  _snake_case						=							[args.training_script] + args.training_script_args + ['''--tpu_num_cores''', str(args.num_cores					)]

  xmp.spawn(mod._mp_fn			,	args=()			,	nprocs=args.num_cores					)


if __name__ == "__main__":
 main()




import os
import sys
from contextlib import contextmanager


# Windows only
if os.name == "nt":
 import ctypes
 import msvcrt  # noqa



 class   lowercase_   (  ctypes.Structure					):
       # _fields is a specific attr expected by ctypes
       UpperCamelCase_      :		List[Any]										=    [("size", ctypes.c_int), ("visible", ctypes.c_byte)]



def 				snake_case_()							->     int:



  """simple docstring"""






  if os.name == "nt":
    _snake_case						=							CursorInfo()
    _snake_case						=							ctypes.windll.kernelaa.GetStdHandle(-11					)
    ctypes.windll.kernelaa.GetConsoleCursorInfo(_UpperCamelCase			,	ctypes.byref(_UpperCamelCase					)					)
    _snake_case						=							False
    ctypes.windll.kernelaa.SetConsoleCursorInfo(_UpperCamelCase			,	ctypes.byref(_UpperCamelCase					)					)
  elif os.name == "posix":
    sys.stdout.write('''\033[?25l'''					)
    sys.stdout.flush()



def 				snake_case_()							->     Optional[Any]:



  """simple docstring"""






  if os.name == "nt":
    _snake_case						=							CursorInfo()
    _snake_case						=							ctypes.windll.kernelaa.GetStdHandle(-11					)
    ctypes.windll.kernelaa.GetConsoleCursorInfo(_UpperCamelCase			,	ctypes.byref(_UpperCamelCase					)					)
    _snake_case						=							True
    ctypes.windll.kernelaa.SetConsoleCursorInfo(_UpperCamelCase			,	ctypes.byref(_UpperCamelCase					)					)
  elif os.name == "posix":
    sys.stdout.write('''\033[?25h'''					)
    sys.stdout.flush()



@contextmanager
def 				snake_case_()							->     int:



  """simple docstring"""






  try:
    hide_cursor()
    yield
  finally:
    show_cursor()

