

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

import torch_xla.distributed.xla_multiprocessing as xmp

def 		UpperCamelCase      ()  ->   Any:
	A__							:					int       =	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=lowercase_					,   default=1					,   help="""Number of TPU cores to use (1 or 8)."""      )

	# positional
	parser.add_argument(
	    """training_script"""					,   type=lowercase_					,   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=lowercase_      )

	return parser.parse_args()

def 		UpperCamelCase      ()  ->   List[Any]:
	A__							:					List[str]       =	parse_args()

	# Import training_script as a module.
	A__							:					List[str]       =	Path(args.training_script      )
	sys.path.append(str(script_fpath.parent.resolve()      )      )
	A__							:					str       =	script_fpath.stem
	A__							:					str       =	importlib.import_module(lowercase_      )

	# Patch sys.argv
	A__							:					Optional[int]       =	[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()






from functools import lru_cache

@lru_cache
def 		UpperCamelCase      (lowercase_:				int      )  ->   int:
	if num < 0:
		raise ValueError("""Number should not be negative."""      )

	return 1 if num in (0, 1) else num * factorial(num - 1      )


if __name__ == "__main__":
	import doctest

	doctest.testmod()



