





import inspect
import os
import unittest
from dataclasses import dataclass

import torch

from accelerate import Accelerator, DistributedDataParallelKwargs, GradScalerKwargs
from accelerate.state import AcceleratorState
from accelerate.test_utils import execute_subprocess_async, require_cuda, require_multi_gpu
from accelerate.utils import KwargsHandler

@dataclass
class       __A     (						a    ):
				__A      =				0
				__A      =				False
				__A      =				3.0




class       __A     (						unittest.TestCase    ):


				def _snake_case       (		self							):
								# If no defaults are changed, `to_kwargs` returns an empty dict.
								self.assertDictEqual(MockClass().to_kwargs()   , {}							)
								self.assertDictEqual(MockClass(a=2							).to_kwargs()   , {"""a""": 2}							)
								self.assertDictEqual(MockClass(a=2   , b=UpperCAmelCase_							).to_kwargs()   , {"""a""": 2, """b""": True}							)
								self.assertDictEqual(MockClass(a=2   , c=2.2_5							).to_kwargs()   , {"""a""": 2, """c""": 2.2_5}							)


				@require_cuda
				def _snake_case       (		self							):
								# If no defaults are changed, `to_kwargs` returns an empty dict.
								lowerCamelCase	 =GradScalerKwargs(init_scale=1024   , growth_factor=2							)
								AcceleratorState._reset_state()
								lowerCamelCase	 =Accelerator(mixed_precision="""fp16"""   , kwargs_handlers=[scaler_handler]							)
								print(accelerator.use_fpaa							)
								lowerCamelCase	 =accelerator.scaler

								# Check the kwargs have been applied
								self.assertEqual(scaler._init_scale   , 1_0_2_4.0							)
								self.assertEqual(scaler._growth_factor   , 2.0							)

								# Check the other values are at the default
								self.assertEqual(scaler._backoff_factor   , 0.5							)
								self.assertEqual(scaler._growth_interval   , 2000							)
								self.assertEqual(scaler._enabled   , UpperCAmelCase_							)


				@require_multi_gpu
				def _snake_case       (		self							):
								lowerCamelCase	 =["""torchrun""", f"""--nproc_per_node={torch.cuda.device_count()}""", inspect.getfile(self.__class__							)]
								execute_subprocess_async(UpperCAmelCase_   , env=os.environ.copy()							)


if __name__ == "__main__":
							UpperCAmelCase__						:			Dict									=DistributedDataParallelKwargs(bucket_cap_mb=15, find_unused_parameters=True)
							UpperCAmelCase__						:			List[str]									=Accelerator(kwargs_handlers=[ddp_scaler])
							UpperCAmelCase__						:			int									=torch.nn.Linear(1_00, 2_00)
							UpperCAmelCase__						:			Tuple									=accelerator.prepare(model)

							# Check the values changed in kwargs
							UpperCAmelCase__						:			List[Any]									=''''''
							UpperCAmelCase__						:			Optional[Any]									=model.bucket_bytes_cap // (10_24 * 10_24)
							if observed_bucket_cap_map != 15:
														error_msg += F"Kwargs badly passed, should have `15` but found {observed_bucket_cap_map}.\n"
							if model.find_unused_parameters is not True:
														error_msg += F"Kwargs badly passed, should have `True` but found {model.find_unused_parameters}.\n"

							# Check the values of the defaults
							if model.dim != 0:
														error_msg += F"Default value not respected, should have `0` but found {model.dim}.\n"
							if model.broadcast_buffers is not True:
														error_msg += F"Default value not respected, should have `True` but found {model.broadcast_buffers}.\n"
							if model.gradient_as_bucket_view is not False:
														error_msg += F"Default value not respected, should have `False` but found {model.gradient_as_bucket_view}.\n"

							# Raise error at the end to make sure we don't stop at the first failure.
							if len(error_msg) > 0:
														raise ValueError(error_msg)












from tempfile import TemporaryDirectory
from unittest import TestCase
from unittest.mock import MagicMock, patch

from transformers import AutoModel, TFAutoModel
from transformers.onnx import FeaturesManager
from transformers.testing_utils import SMALL_MODEL_IDENTIFIER, require_tf, require_torch

@require_torch
@require_tf
class       __A     (						a    ):


				def _snake_case       (		self							):
								lowerCamelCase	 =SMALL_MODEL_IDENTIFIER
								lowerCamelCase	 ="""pt"""
								lowerCamelCase	 ="""tf"""


				def _snake_case       (		self   , UpperCAmelCase_							):
								lowerCamelCase	 =AutoModel.from_pretrained(self.test_model							)
								model_pt.save_pretrained(UpperCAmelCase_							)


				def _snake_case       (		self   , UpperCAmelCase_							):
								lowerCamelCase	 =TFAutoModel.from_pretrained(self.test_model   , from_pt=UpperCAmelCase_							)
								model_tf.save_pretrained(UpperCAmelCase_							)


				def _snake_case       (		self							):
								lowerCamelCase	 ="""mock_framework"""

								# Framework provided - return whatever the user provides
								lowerCamelCase	 =FeaturesManager.determine_framework(self.test_model   , UpperCAmelCase_							)
								self.assertEqual(UpperCAmelCase_   , UpperCAmelCase_							)

								# Local checkpoint and framework provided - return provided framework
								# PyTorch checkpoint
								with TemporaryDirectory() as local_pt_ckpt:
												self._setup_pt_ckpt(UpperCAmelCase_							)
												lowerCamelCase	 =FeaturesManager.determine_framework(UpperCAmelCase_   , UpperCAmelCase_							)
												self.assertEqual(UpperCAmelCase_   , UpperCAmelCase_							)

								# TensorFlow checkpoint
								with TemporaryDirectory() as local_tf_ckpt:
												self._setup_tf_ckpt(UpperCAmelCase_							)
												lowerCamelCase	 =FeaturesManager.determine_framework(UpperCAmelCase_   , UpperCAmelCase_							)
												self.assertEqual(UpperCAmelCase_   , UpperCAmelCase_							)


				def _snake_case       (		self							):
								# PyTorch checkpoint
								with TemporaryDirectory() as local_pt_ckpt:
												self._setup_pt_ckpt(UpperCAmelCase_							)
												lowerCamelCase	 =FeaturesManager.determine_framework(UpperCAmelCase_							)
												self.assertEqual(UpperCAmelCase_   , self.framework_pt							)

								# TensorFlow checkpoint
								with TemporaryDirectory() as local_tf_ckpt:
												self._setup_tf_ckpt(UpperCAmelCase_							)
												lowerCamelCase	 =FeaturesManager.determine_framework(UpperCAmelCase_							)
												self.assertEqual(UpperCAmelCase_   , self.framework_tf							)

								# Invalid local checkpoint
								with TemporaryDirectory() as local_invalid_ckpt:
												with self.assertRaises(UpperCAmelCase_							):
																lowerCamelCase	 =FeaturesManager.determine_framework(UpperCAmelCase_							)


				def _snake_case       (		self							):
								lowerCamelCase	 =MagicMock(return_value=UpperCAmelCase_							)
								with patch("""transformers.onnx.features.is_tf_available"""   , UpperCAmelCase_							):
												lowerCamelCase	 =FeaturesManager.determine_framework(self.test_model							)
												self.assertEqual(UpperCAmelCase_   , self.framework_pt							)

								# PyTorch not in environment -> use TensorFlow
								lowerCamelCase	 =MagicMock(return_value=UpperCAmelCase_							)
								with patch("""transformers.onnx.features.is_torch_available"""   , UpperCAmelCase_							):
												lowerCamelCase	 =FeaturesManager.determine_framework(self.test_model							)
												self.assertEqual(UpperCAmelCase_   , self.framework_tf							)

								# Both in environment -> use PyTorch
								lowerCamelCase	 =MagicMock(return_value=UpperCAmelCase_							)
								lowerCamelCase	 =MagicMock(return_value=UpperCAmelCase_							)
								with patch("""transformers.onnx.features.is_tf_available"""   , UpperCAmelCase_							), patch(
								    """transformers.onnx.features.is_torch_available"""   , UpperCAmelCase_							):
												lowerCamelCase	 =FeaturesManager.determine_framework(self.test_model							)
												self.assertEqual(UpperCAmelCase_   , self.framework_pt							)

								# Both not in environment -> raise error
								lowerCamelCase	 =MagicMock(return_value=UpperCAmelCase_							)
								lowerCamelCase	 =MagicMock(return_value=UpperCAmelCase_							)
								with patch("""transformers.onnx.features.is_tf_available"""   , UpperCAmelCase_							), patch(
								    """transformers.onnx.features.is_torch_available"""   , UpperCAmelCase_							):
												with self.assertRaises(UpperCAmelCase_							):
																lowerCamelCase	 =FeaturesManager.determine_framework(self.test_model							)





