





# Copyright 2021 The HuggingFace Team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import argparse
import os

from accelerate.utils import ComputeEnvironment

from .cluster import get_cluster_input
from .config_args import cache_dir, default_config_file, default_yaml_config_file, load_config_from_file  # noqa: F401
from .config_utils import _ask_field, _ask_options, _convert_compute_environment  # noqa: F401
from .sagemaker import get_sagemaker_input


_UpperCAmelCase        =				'Launches a series of prompts to create and save a `default_config.yaml` configuration file for your training system. Should always be ran first on your machine'




def  lowerCAmelCase_ (							)     ->		Optional[Any]:
							UpperCamelCase_          =  _ask_options(
							    "In which compute environment are you running?"					,		["This machine", "AWS (Amazon SageMaker)"]					,		_convert_compute_environment					,		)
							if compute_environment == ComputeEnvironment.AMAZON_SAGEMAKER:
														UpperCamelCase_          =  get_sagemaker_input()
							else:
														UpperCamelCase_          =  get_cluster_input()
							return config




def  lowerCAmelCase_ (							UpperCamelCase_=None  )     ->		Dict:
							if subparsers is not None:
														UpperCamelCase_          =  subparsers.add_parser("config"					,		description=__UpperCamelCase  )
							else:
														UpperCamelCase_          =  argparse.ArgumentParser("Accelerate config command"					,		description=__UpperCamelCase  )

							parser.add_argument(
							    "--config_file"					,		default=__UpperCamelCase					,		help=(
							        "The path to use to store the config file. Will default to a file named default_config.yaml in the cache "
							        "location, which is the content of the environment `HF_HOME` suffixed with \'accelerate\', or if you don\'t have "
							        "such an environment variable, your cache directory (\'~/.cache\' or the content of `XDG_CACHE_HOME`) suffixed "
							        "with \'huggingface\'."
							    )					,		)

							if subparsers is not None:
														parser.set_defaults(func=__UpperCamelCase  )
							return parser




def  lowerCAmelCase_ (							UpperCamelCase_  )     ->		str:
							UpperCamelCase_          =  get_user_input()
							if args.config_file is not None:
														UpperCamelCase_          =  args.config_file
							else:
														if not os.path.isdir(__UpperCamelCase  ):
																					os.makedirs(__UpperCamelCase  )
														UpperCamelCase_          =  default_yaml_config_file

							if config_file.endswith(".json"  ):
														config.to_json_file(__UpperCamelCase  )
							else:
														config.to_yaml_file(__UpperCamelCase  )
							print(F'''accelerate configuration saved at {config_file}'''  )




def  lowerCAmelCase_ (							)     ->		List[str]:
							UpperCamelCase_          =  config_command_parser()
							UpperCamelCase_          =  parser.parse_args()
							config_command(__UpperCamelCase  )


if __name__ == "__main__":
					main()








import unittest

import torch
from torch import nn

from accelerate.test_utils import require_cuda
from accelerate.utils.memory import find_executable_batch_size, release_memory




def  lowerCAmelCase_ (							)     ->		Dict:
       raise RuntimeError("CUDA out of memory."  )



class 							_UpperCamelCase					(	nn.Module     ):

       def __init__(		self: int		)       -> List[Any]:




              """simple docstring"""


              super().__init__()
              UpperCamelCase_          =  nn.Linear(3					,   4		)
              UpperCamelCase_          =  nn.BatchNormad(4		)
              UpperCamelCase_          =  nn.Linear(4					,   5		)



       def lowercase (		self: Any					,   _SCREAMING_SNAKE_CASE: Optional[int]		)       -> Optional[Any]:




              """simple docstring"""


              return self.lineara(self.batchnorm(self.lineara(_SCREAMING_SNAKE_CASE		)		)		)



class 							_UpperCamelCase					(	unittest.TestCase     ):

       def lowercase (		self: List[Any]		)       -> Any:




              """simple docstring"""


              UpperCamelCase_          =  []

              @find_executable_batch_size(starting_batch_size=128		)
              def mock_training_loop_function(_SCREAMING_SNAKE_CASE: str		):
                     nonlocal batch_sizes
                     batch_sizes.append(_SCREAMING_SNAKE_CASE		)
                     if batch_size != 8:
                            raise_fake_out_of_memory()

              mock_training_loop_function()
              self.assertListEqual(_SCREAMING_SNAKE_CASE					,   [128, 64, 32, 16, 8]		)

       def lowercase (		self: Optional[int]		)       -> List[Any]:




              """simple docstring"""


              UpperCamelCase_          =  []

              @find_executable_batch_size(starting_batch_size=128		)
              def mock_training_loop_function(_SCREAMING_SNAKE_CASE: List[str]					,   _SCREAMING_SNAKE_CASE: Optional[Any]		):
                     nonlocal batch_sizes
                     batch_sizes.append(_SCREAMING_SNAKE_CASE		)
                     if batch_size != 8:
                            raise_fake_out_of_memory()
                     return batch_size, arga

              UpperCamelCase_       , UpperCamelCase_          =  mock_training_loop_function("hello"		)
              self.assertListEqual(_SCREAMING_SNAKE_CASE					,   [128, 64, 32, 16, 8]		)
              self.assertListEqual([bs, arga]					,   [8, "hello"]		)

       def lowercase (		self: Any		)       -> Optional[int]:




              """simple docstring"""


              @find_executable_batch_size(starting_batch_size=0		)
              def mock_training_loop_function(_SCREAMING_SNAKE_CASE: Union[str, Any]		):
                     pass

              with self.assertRaises(_SCREAMING_SNAKE_CASE		) as cm:
                     mock_training_loop_function()
                     self.assertIn("No executable batch size found, reached zero."					,   cm.exception.args[0]		)

       def lowercase (		self: Dict		)       -> Optional[int]:




              """simple docstring"""


              @find_executable_batch_size(starting_batch_size=16		)
              def mock_training_loop_function(_SCREAMING_SNAKE_CASE: Optional[int]		):
                     if batch_size > 0:
                            raise_fake_out_of_memory()
                     pass

              with self.assertRaises(_SCREAMING_SNAKE_CASE		) as cm:
                     mock_training_loop_function()
                     self.assertIn("No executable batch size found, reached zero."					,   cm.exception.args[0]		)

       def lowercase (		self: Optional[int]		)       -> Dict:




              """simple docstring"""


              @find_executable_batch_size(starting_batch_size=128		)
              def mock_training_loop_function(_SCREAMING_SNAKE_CASE: Any					,   _SCREAMING_SNAKE_CASE: int					,   _SCREAMING_SNAKE_CASE: Tuple		):
                     if batch_size != 8:
                            raise raise_fake_out_of_memory()

              with self.assertRaises(_SCREAMING_SNAKE_CASE		) as cm:
                     mock_training_loop_function(128					,   "hello"					,   "world"		)
                     self.assertIn("Batch size was passed into `f`"					,   cm.exception.args[0]		)
                     self.assertIn("`f(arg1='hello', arg2='world')"					,   cm.exception.args[0]		)

       def lowercase (		self: List[str]		)       -> Optional[Any]:




              """simple docstring"""


              @find_executable_batch_size(starting_batch_size=16		)
              def mock_training_loop_function(_SCREAMING_SNAKE_CASE: List[Any]		):
                     raise ValueError("Oops, we had an error!"		)

              with self.assertRaises(_SCREAMING_SNAKE_CASE		) as cm:
                     mock_training_loop_function()
                     self.assertIn("Oops, we had an error!"					,   cm.exception.args[0]		)



       @require_cuda
       def lowercase (		self: Optional[int]		)       -> Union[str, Any]:




              """simple docstring"""


              UpperCamelCase_          =  torch.cuda.memory_allocated()
              UpperCamelCase_          =  ModelForTest()
              model.cuda()
              self.assertGreater(torch.cuda.memory_allocated()					,   _SCREAMING_SNAKE_CASE		)
              UpperCamelCase_          =  release_memory(_SCREAMING_SNAKE_CASE		)
              self.assertEqual(torch.cuda.memory_allocated()					,   _SCREAMING_SNAKE_CASE		)

