


# 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.

from pathlib import Path

import torch

from ...utils import is_npu_available, is_xpu_available
from .config_args import ClusterConfig, default_json_config_file
from .config_utils import SubcommandHelpFormatter


snake_case							:       int     			=      '''Create a default config file for Accelerate with only a few flags set.'''






def 							__lowercase   ( __lowerCAmelCase							:				int="no"					,    __lowerCAmelCase							:				str = default_json_config_file					,    __lowerCAmelCase							:				bool = False   ):
							a__             =     Path(__lowerCAmelCase   )
							path.parent.mkdir(parents=__lowerCAmelCase					,    exist_ok=__lowerCAmelCase   )
							if path.exists():
														print(
														    F'Configuration already exists at {save_location}, will not override. Run `accelerate config` manually or pass a different `save_location`.'   )
														return False
							a__             =     mixed_precision.lower()
							if mixed_precision not in ["no", "fp16", "bf16", "fp8"]:
														raise ValueError(
														    F'`mixed_precision` should be one of \'no\', \'fp16\', \'bf16\', or \'fp8\'. Received {mixed_precision}'   )
							a__             =     {
							    'compute_environment': 'LOCAL_MACHINE',
							    'mixed_precision': mixed_precision,
							}
							if torch.cuda.is_available():
														a__             =     torch.cuda.device_count()
														a__             =     num_gpus
														a__             =     False
														if num_gpus > 1:
																					a__             =     'MULTI_GPU'
														else:
																					a__             =     'NO'
							elif is_xpu_available() and use_xpu:
														a__             =     torch.xpu.device_count()
														a__             =     num_xpus
														a__             =     False
														if num_xpus > 1:
																					a__             =     'MULTI_XPU'
														else:
																					a__             =     'NO'
							elif is_npu_available():
														a__             =     torch.npu.device_count()
														a__             =     num_npus
														a__             =     False
														if num_npus > 1:
																					a__             =     'MULTI_NPU'
														else:
																					a__             =     'NO'
							else:
														a__             =     0
														a__             =     True
														a__             =     1
														a__             =     'NO'
							a__             =     ClusterConfig(**__lowerCAmelCase   )
							config.to_json_file(__lowerCAmelCase   )
							return path






def 							__lowercase   ( __lowerCAmelCase							:				List[Any]					,    __lowerCAmelCase							:				List[Any]   ):
							a__             =     parser.add_parser('default'					,    parents=__lowerCAmelCase					,    help=__lowerCAmelCase					,    formatter_class=__lowerCAmelCase   )
							parser.add_argument(
							    '--config_file'					,    default=__lowerCAmelCase					,    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\'.'
							    )					,    dest='save_location'					,    )

							parser.add_argument(
							    '--mixed_precision'					,    choices=['no', 'fp16', 'bf16']					,    type=__lowerCAmelCase					,    help='Whether or not to use mixed precision training. '
							    'Choose between FP16 and BF16 (bfloat16) training. '
							    'BF16 training is only supported on Nvidia Ampere GPUs and PyTorch 1.10 or later.'					,    default='no'					,    )
							parser.set_defaults(func=__lowerCAmelCase   )
							return parser






def 							__lowercase   ( __lowerCAmelCase							:				Dict   ):
							a__             =     write_basic_config(args.mixed_precision					,    args.save_location   )
							if config_file:
														print(F'accelerate configuration saved at {config_file}'   )








from argparse import ArgumentParser

from .env import EnvironmentCommand






def 							__lowercase   ( ):
							a__             =     ArgumentParser('Diffusers CLI tool'					,    usage='diffusers-cli <command> [<args>]'   )
							a__             =     parser.add_subparsers(help='diffusers-cli command helpers'   )

							# Register commands
							EnvironmentCommand.register_subcommand(__lowerCAmelCase   )

							# Let's go
							a__             =     parser.parse_args()

							if not hasattr(__lowerCAmelCase					,    'func'   ):
														parser.print_help()
														exit(1   )

							# Run
							a__             =     args.func(__lowerCAmelCase   )
							service.run()


if __name__ == "__main__":
						main()




