

# 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


lowerCAmelCase__       = "Create a default config file for Accelerate with only a few flags set."
def      _lowerCAmelCase(	__A="no"   ,       __A = default_json_config_file   ,       __A = False			):
  UpperCAmelCase					      =  Path(__A			)
  path.parent.mkdir(parents=__A   ,       exist_ok=__A			)
  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
  UpperCAmelCase					      =  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}"			)
  UpperCAmelCase					      =  {
      "compute_environment": "LOCAL_MACHINE",
      "mixed_precision": mixed_precision,
  }
  if torch.cuda.is_available():
    UpperCAmelCase					      =  torch.cuda.device_count()
    UpperCAmelCase					      =  num_gpus
    UpperCAmelCase					      =  False
    if num_gpus > 1:
      UpperCAmelCase					      =  "MULTI_GPU"
    else:
      UpperCAmelCase					      =  "NO"
  elif is_xpu_available() and use_xpu:
    UpperCAmelCase					      =  torch.xpu.device_count()
    UpperCAmelCase					      =  num_xpus
    UpperCAmelCase					      =  False
    if num_xpus > 1:
      UpperCAmelCase					      =  "MULTI_XPU"
    else:
      UpperCAmelCase					      =  "NO"
  elif is_npu_available():
    UpperCAmelCase					      =  torch.npu.device_count()
    UpperCAmelCase					      =  num_npus
    UpperCAmelCase					      =  False
    if num_npus > 1:
      UpperCAmelCase					      =  "MULTI_NPU"
    else:
      UpperCAmelCase					      =  "NO"
  else:
    UpperCAmelCase					      =  0
    UpperCAmelCase					      =  True
    UpperCAmelCase					      =  1
    UpperCAmelCase					      =  "NO"
  UpperCAmelCase					      =  ClusterConfig(**__A			)
  config.to_json_file(__A			)
  return path
def      _lowerCAmelCase(	__A   ,       __A			):
  UpperCAmelCase					      =  parser.add_parser("default"   ,       parents=__A   ,       help=__A   ,       formatter_class=__A			)
  parser.add_argument(
      "--config_file"   ,       default=__A   ,       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=__A   ,       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=__A			)
  return parser





def      _lowerCAmelCase(	__A			):
  UpperCAmelCase					      =  write_basic_config(args.mixed_precision   ,       args.save_location			)
  if config_file:
    print(F"accelerate configuration saved at {config_file}"			)






def      _lowerCAmelCase(	__A			):

  if not isinstance(__A   ,       __A			):
    raise TypeError("only integers accepted as input"			)
  else:
    UpperCAmelCase					      =  str(abs(__A			)			)
    UpperCAmelCase					      =  [list(__A			) for char in range(len(__A			)			)]
    for index in range(len(__A			)			):
      num_transpositions[index].pop(__A			)
    return max(
        int("".join(list(__A			)			)			) for transposition in num_transpositions			)


if __name__ == "__main__":
      __import__("doctest").testmod()



