"""simple docstring"""






import copy
import importlib.metadata
import json
import os
from dataclasses import dataclass
from typing import Any, Dict, Union

from packaging import version

from ..utils import is_torch_available, logging


if is_torch_available():
       import torch


__A       =					logging.get_logger(__name__)


@dataclass
class        UpperCAmelCase		:



    """simple docstring"""

    def __init__(  self       ,     _UpperCAmelCase=False       ,     _UpperCAmelCase=False       ,     _UpperCAmelCase=6.0       ,     _UpperCAmelCase=None       ,     _UpperCAmelCase=False       ,     _UpperCAmelCase=False       ,     _UpperCAmelCase=None       ,     _UpperCAmelCase="fp4"       ,     _UpperCAmelCase=False       ,     **_UpperCAmelCase       ,     ):
       lowercase__:  Optional[int]   = load_in_abit
       lowercase__:  Union[str, Any]   = load_in_abit
       lowercase__:  Tuple   = llm_inta_threshold
       lowercase__:  Optional[Any]   = llm_inta_skip_modules
       lowercase__:  int   = llm_inta_enable_fpaa_cpu_offload
       lowercase__:  Dict   = llm_inta_has_fpaa_weight
       lowercase__:  str   = bnb_abit_quant_type
       lowercase__:  int   = bnb_abit_use_double_quant

       if bnb_abit_compute_dtype is None:
          lowercase__:  str   = torch.floataa
       elif isinstance(_UpperCAmelCase       ,     _UpperCAmelCase				):
          lowercase__:  Tuple   = getattr(_UpperCAmelCase       ,     _UpperCAmelCase				)
       elif isinstance(_UpperCAmelCase       ,     torch.dtype				):
          lowercase__:  Optional[int]   = bnb_abit_compute_dtype
       else:
          raise ValueError('''bnb_4bit_compute_dtype must be a string or a torch.dtype'''				)

       self.post_init()






    def _snake_case     (  self				):

       if not isinstance(self.llm_inta_threshold       ,     _UpperCAmelCase				):
          raise ValueError('''llm_int8_threshold must be a float'''				)

       if self.llm_inta_skip_modules is not None and not isinstance(self.llm_inta_skip_modules       ,     _UpperCAmelCase				):
          raise ValueError('''llm_int8_skip_modules must be a list of strings'''				)
       if not isinstance(self.llm_inta_enable_fpaa_cpu_offload       ,     _UpperCAmelCase				):
          raise ValueError('''llm_int8_enable_fp32_cpu_offload must be a boolean'''				)

       if not isinstance(self.llm_inta_has_fpaa_weight       ,     _UpperCAmelCase				):
          raise ValueError('''llm_int8_has_fp16_weight must be a boolean'''				)

       if self.bnb_abit_compute_dtype is not None and not isinstance(self.bnb_abit_compute_dtype       ,     torch.dtype				):
          raise ValueError('''bnb_4bit_compute_dtype must be torch.dtype'''				)

       if not isinstance(self.bnb_abit_quant_type       ,     _UpperCAmelCase				):
          raise ValueError('''bnb_4bit_quant_type must be a string'''				)

       if not isinstance(self.bnb_abit_use_double_quant       ,     _UpperCAmelCase				):
          raise ValueError('''bnb_4bit_use_double_quant must be a boolean'''				)

       if self.load_in_abit and not version.parse(importlib.metadata.version('''bitsandbytes'''				)				) >= version.parse(
           '''0.39.0'''				):
          raise ValueError(
              '''4 bit quantization requires bitsandbytes>=0.39.0 - please upgrade your bitsandbytes version'''				)






    def _snake_case     (  self				):
       return self.load_in_abit or self.load_in_abit






    def _snake_case     (  self				):

       if self.load_in_abit:
          return "llm_int8"
       elif self.load_in_abit and self.bnb_abit_quant_type == "fp4":
          return "fp4"
       elif self.load_in_abit and self.bnb_abit_quant_type == "nf4":
          return "nf4"
       else:
          return None






    @classmethod
    def _snake_case     (  cls       ,     _UpperCAmelCase       ,     _UpperCAmelCase       ,     **_UpperCAmelCase				):
       lowercase__:  Dict   = cls(**_UpperCAmelCase				)

       lowercase__:  Dict   = []
       for key, value in kwargs.items():
          if hasattr(_UpperCAmelCase       ,     _UpperCAmelCase				):
             setattr(_UpperCAmelCase       ,     _UpperCAmelCase       ,     _UpperCAmelCase				)
             to_remove.append(_UpperCAmelCase				)
       for key in to_remove:
          kwargs.pop(_UpperCAmelCase       ,     _UpperCAmelCase				)

       if return_unused_kwargs:
          return config, kwargs
       else:
          return config






    def _snake_case     (  self       ,     _UpperCAmelCase				):

       with open(_UpperCAmelCase       ,     '''w'''       ,     encoding='''utf-8'''				) as writer:
          lowercase__:  Any   = self.to_dict()
          lowercase__:  List[Any]   = json.dumps(_UpperCAmelCase       ,     indent=2       ,     sort_keys=_UpperCAmelCase				) + '''\n'''

          writer.write(_UpperCAmelCase				)






    def _snake_case     (  self				):
       lowercase__:  Tuple   = copy.deepcopy(self.__dict__				)
       lowercase__:  Optional[Any]   = str(output['''bnb_4bit_compute_dtype''']				).split('''.'''				)[1]

       return output






    def __repr__(  self				):
       return F"""{self.__class__.__name__} {self.to_json_string()}"""






    def _snake_case     (  self       ,     _UpperCAmelCase = True				):

       if use_diff is True:
          lowercase__:  int   = self.to_diff_dict()
       else:
          lowercase__:  List[str]   = self.to_dict()
       return json.dumps(_UpperCAmelCase       ,     indent=2       ,     sort_keys=_UpperCAmelCase				) + "\n"






    def _snake_case     (  self				):
       lowercase__:  Any   = self.to_dict()

       # get the default config dict
       lowercase__:  Union[str, Any]   = BitsAndBytesConfig().to_dict()

       lowercase__:  int   = {}

       # only serialize values that differ from the default config
       for key, value in config_dict.items():
          if value != default_config_dict[key]:
             lowercase__:  Dict   = value

       return serializable_config_dict








'''simple docstring'''



import importlib.util
import os
import platform
from argparse import ArgumentParser

import huggingface_hub

from .. import __version__ as version
from ..utils import (
    is_accelerate_available,
    is_flax_available,
    is_safetensors_available,
    is_tf_available,
    is_torch_available,
)
from . import BaseTransformersCLICommand


def 				lowercase_					(     __A			:							List[Any]      )							->   Union[str, Any]:



 """simple docstring"""




 return EnvironmentCommand()


def 				lowercase_					(     __A			:							int      )							->   Dict:



 """simple docstring"""




 return EnvironmentCommand(args.accelerate_config_file      )





class UpperCAmelCase_       (     __A					):




      """simple docstring"""




      @staticmethod
      def 					A__   (			UpperCAmelCase      :		ArgumentParser		)	->	List[str]:


       '''simple docstring'''

       lowercase       : Optional[int]						=parser.add_parser('''env'''		)
       download_parser.set_defaults(func=UpperCAmelCase		)
       download_parser.add_argument(
           '''--accelerate-config_file'''  ,   default=UpperCAmelCase  ,   help='''The accelerate config file to use for the default values in the launching script.'''  ,   )
       download_parser.set_defaults(func=UpperCAmelCase		)






      def __init__(			self      :		Dict  ,   UpperCAmelCase      :		Tuple  ,   *UpperCAmelCase      :		Tuple		)	->	None:


       '''simple docstring'''

       lowercase       : List[str]						=accelerate_config_file






      def 					A__   (			self      :		Tuple		)	->	int:


       '''simple docstring'''

       lowercase       : Optional[Any]						='''not installed'''
       if is_safetensors_available():
        import safetensors

        lowercase       : List[Any]						=safetensors.__version__
       elif importlib.util.find_spec('''safetensors'''		) is not None:
        import safetensors

        lowercase       : List[str]						=f'{safetensors.__version__} but is ignored because of PyTorch version too old.'

       lowercase       : List[str]						='''not installed'''
       lowercase       : str						='''not found'''
       if is_accelerate_available():
        import accelerate
        from accelerate.commands.config import default_config_file, load_config_from_file

        lowercase       : List[str]						=accelerate.__version__
        # Get the default from the config file.
        if self._accelerate_config_file is not None or os.path.isfile(UpperCAmelCase		):
         lowercase       : Dict						=load_config_from_file(self._accelerate_config_file		).to_dict()

        lowercase       : Optional[int]						=(
            '''\n'''.join([f'\t- {prop}: {val}' for prop, val in accelerate_config.items()]		)
            if isinstance(UpperCAmelCase  ,   UpperCAmelCase		)
            else f'\t{accelerate_config}'
        )

       lowercase       : Optional[int]						='''not installed'''
       lowercase       : Optional[Any]						='''NA'''
       if is_torch_available():
        import torch

        lowercase       : List[Any]						=torch.__version__
        lowercase       : Dict						=torch.cuda.is_available()

       lowercase       : Optional[Any]						='''not installed'''
       lowercase       : List[str]						='''NA'''
       if is_tf_available():
        import tensorflow as tf

        lowercase       : List[Any]						=tf.__version__
        try:
         # deprecated in v2.1
         lowercase       : Optional[Any]						=tf.test.is_gpu_available()
        except AttributeError:
         # returns list of devices, convert to bool
         lowercase       : Optional[int]						=bool(tf.config.list_physical_devices('''GPU'''		)		)

       lowercase       : Optional[Any]						='''not installed'''
       lowercase       : Optional[Any]						='''not installed'''
       lowercase       : Optional[Any]						='''not installed'''
       lowercase       : List[str]						='''NA'''
       if is_flax_available():
        import flax
        import jax
        import jaxlib

        lowercase       : Dict						=flax.__version__
        lowercase       : List[Any]						=jax.__version__
        lowercase       : Any						=jaxlib.__version__
        lowercase       : Tuple						=jax.lib.xla_bridge.get_backend().platform

       lowercase       : str						={
           '''`transformers` version''': version,
           '''Platform''': platform.platform(),
           '''Python version''': platform.python_version(),
           '''Huggingface_hub version''': huggingface_hub.__version__,
           '''Safetensors version''': f'{safetensors_version}',
           '''Accelerate version''': f'{accelerate_version}',
           '''Accelerate config''': f'{accelerate_config_str}',
           '''PyTorch version (GPU?)''': f'{pt_version} ({pt_cuda_available})',
           '''Tensorflow version (GPU?)''': f'{tf_version} ({tf_cuda_available})',
           '''Flax version (CPU?/GPU?/TPU?)''': f'{flax_version} ({jax_backend})',
           '''Jax version''': f'{jax_version}',
           '''JaxLib version''': f'{jaxlib_version}',
           '''Using GPU in script?''': '''<fill in>''',
           '''Using distributed or parallel set-up in script?''': '''<fill in>''',
       }

       print('''\nCopy-and-paste the text below in your GitHub issue and FILL OUT the two last points.\n'''		)
       print(self.format_dict(UpperCAmelCase		)		)

       return info






      @staticmethod
      def 					A__   (			UpperCAmelCase      :		Any		)	->	Any:


       '''simple docstring'''

       return "\n".join([f'- {prop}: {val}' for prop, val in d.items()]		) + "\n"



