


# 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


SCREAMING_SNAKE_CASE			: str				   =					"Create a default config file for Accelerate with only a few flags set."



def 							UpperCamelCase_( lowerCamelCase_="no"				,					lowerCamelCase_ = default_json_config_file				,					lowerCamelCase_ = False					)       ->		Tuple:
    _lowercase			:				Optional[Any] 						=						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
    _lowercase			:				Optional[Any] 						=						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}'''					)
    _lowercase			:				Optional[Any] 						=						{
        'compute_environment': 'LOCAL_MACHINE',
        'mixed_precision': mixed_precision,
    }
    if torch.cuda.is_available():
        _lowercase			:				str 						=						torch.cuda.device_count()
        _lowercase			:				Dict 						=						num_gpus
        _lowercase			:				List[Any] 						=						False
        if num_gpus > 1:
            _lowercase			:				Dict 						=						'MULTI_GPU'
        else:
            _lowercase			:				Optional[int] 						=						'NO'
    elif is_xpu_available() and use_xpu:
        _lowercase			:				Any 						=						torch.xpu.device_count()
        _lowercase			:				List[str] 						=						num_xpus
        _lowercase			:				int 						=						False
        if num_xpus > 1:
            _lowercase			:				Optional[Any] 						=						'MULTI_XPU'
        else:
            _lowercase			:				Optional[Any] 						=						'NO'
    elif is_npu_available():
        _lowercase			:				Union[str, Any] 						=						torch.npu.device_count()
        _lowercase			:				Dict 						=						num_npus
        _lowercase			:				str 						=						False
        if num_npus > 1:
            _lowercase			:				List[str] 						=						'MULTI_NPU'
        else:
            _lowercase			:				Union[str, Any] 						=						'NO'
    else:
        _lowercase			:				int 						=						0
        _lowercase			:				Dict 						=						True
        _lowercase			:				Optional[int] 						=						1
        _lowercase			:				List[str] 						=						'NO'
    _lowercase			:				Tuple 						=						ClusterConfig(**lowerCamelCase_					)
    config.to_json_file(lowerCamelCase_					)
    return path



def 							UpperCamelCase_( lowerCamelCase_				,					lowerCamelCase_					)       ->		List[Any]:
    _lowercase			:				Union[str, Any] 						=						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 							UpperCamelCase_( lowerCamelCase_					)       ->		int:
    _lowercase			:				List[str] 						=						write_basic_config(args.mixed_precision				,					args.save_location					)
    if config_file:
        print(F'''accelerate configuration saved at {config_file}'''					)






from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_torch_available,
)


SCREAMING_SNAKE_CASE			: str				   =					{
    "configuration_gpt_bigcode": ["GPT_BIGCODE_PRETRAINED_CONFIG_ARCHIVE_MAP", "GPTBigCodeConfig"],
}

try:
 if not is_torch_available():
  raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
 pass
else:
 SCREAMING_SNAKE_CASE			: int				   =					[
     "GPT_BIGCODE_PRETRAINED_MODEL_ARCHIVE_LIST",
     "GPTBigCodeForSequenceClassification",
     "GPTBigCodeForTokenClassification",
     "GPTBigCodeForCausalLM",
     "GPTBigCodeModel",
     "GPTBigCodePreTrainedModel",
 ]

if TYPE_CHECKING:
 from .configuration_gpt_bigcode import GPT_BIGCODE_PRETRAINED_CONFIG_ARCHIVE_MAP, GPTBigCodeConfig

 try:
  if not is_torch_available():
   raise OptionalDependencyNotAvailable()
 except OptionalDependencyNotAvailable:
  pass
 else:
  from .modeling_gpt_bigcode import (
      GPT_BIGCODE_PRETRAINED_MODEL_ARCHIVE_LIST,
      GPTBigCodeForCausalLM,
      GPTBigCodeForSequenceClassification,
      GPTBigCodeForTokenClassification,
      GPTBigCodeModel,
      GPTBigCodePreTrainedModel,
  )


else:
 import sys

 SCREAMING_SNAKE_CASE			: List[Any]				   =					_LazyModule(__name__, globals()["__file__"], _import_structure, module_spec=__spec__)


