





'''simple docstring'''



import json
import os
import subprocess
import unittest
from ast import literal_eval

import pytest
from parameterized import parameterized, parameterized_class

from . import is_sagemaker_available


if is_sagemaker_available():
 from sagemaker import Session, TrainingJobAnalytics
 from sagemaker.huggingface import HuggingFace


@pytest.mark.skipif(
    literal_eval(os.getenv('''TEST_SAGEMAKER'''					,    '''False'''			)			) is not True					,    reason='''Skipping test because should only be run when releasing minor transformers version'''					,    )
@pytest.mark.usefixtures('''sm_env'''			)
@parameterized_class(
    [
        {
            '''framework''': '''pytorch''',
            '''script''': '''run_glue.py''',
            '''model_name_or_path''': '''distilbert-base-cased''',
            '''instance_type''': '''ml.p3.16xlarge''',
            '''results''': {'''train_runtime''': 650, '''eval_accuracy''': 0.7, '''eval_loss''': 0.6},
        },
        {
            '''framework''': '''pytorch''',
            '''script''': '''run_ddp.py''',
            '''model_name_or_path''': '''distilbert-base-cased''',
            '''instance_type''': '''ml.p3.16xlarge''',
            '''results''': {'''train_runtime''': 600, '''eval_accuracy''': 0.7, '''eval_loss''': 0.6},
        },
        {
            '''framework''': '''tensorflow''',
            '''script''': '''run_tf_dist.py''',
            '''model_name_or_path''': '''distilbert-base-cased''',
            '''instance_type''': '''ml.p3.16xlarge''',
            '''results''': {'''train_runtime''': 600, '''eval_accuracy''': 0.6, '''eval_loss''': 0.7},
        },
    ]			)
class       __SCREAMING_SNAKE_CASE	(						unittest.TestCase			):



     '''simple docstring'''






     def 	UpperCamelCase(					self	):
       if self.framework == "pytorch":
         subprocess.run(
             F'''cp ./examples/pytorch/text-classification/run_glue.py {self.env.test_path}/run_glue.py'''.split()						,   encoding="utf-8"						,   check=lowerCamelCase						,   )
       assert hasattr(self						,   "env"	)

     def 	UpperCamelCase(					self						,   lowerCamelCase	):
       _snake_case     		=				F'''{self.env.base_job_name}-{instance_count}-{"ddp" if "ddp" in self.script else "smd"}'''
       # distributed data settings
       _snake_case     		=				{"smdistributed": {"dataparallel": {"enabled": True}}} if self.script != "run_ddp.py" else None

       # creates estimator
       return HuggingFace(
           entry_point=self.script						,   source_dir=self.env.test_path						,   role=self.env.role						,   image_uri=self.env.image_uri						,   base_job_name=lowerCamelCase						,   instance_count=lowerCamelCase						,   instance_type=self.instance_type						,   debugger_hook_config=lowerCamelCase						,   hyperparameters={**self.env.distributed_hyperparameters, "model_name_or_path": self.model_name_or_path}						,   metric_definitions=self.env.metric_definitions						,   distribution=lowerCamelCase						,   py_version="py36"						,   )

     def 	UpperCamelCase(					self						,   lowerCamelCase	):
       TrainingJobAnalytics(lowerCamelCase	).export_csv(F'''{self.env.test_path}/{job_name}_metrics.csv'''	)






     @parameterized.expand([(2,)]	)
     def 	UpperCamelCase(					self						,   lowerCamelCase	):
       # create estimator
       _snake_case     		=				self.create_estimator(lowerCamelCase	)

       # run training
       estimator.fit()

       # result dataframe
       _snake_case     		=				TrainingJobAnalytics(estimator.latest_training_job.name	).dataframe()

       # extract kpis
       _snake_case     		=				list(result_metrics_df[result_metrics_df.metric_name == "eval_accuracy"]["value"]	)
       _snake_case     		=				list(result_metrics_df[result_metrics_df.metric_name == "eval_loss"]["value"]	)
       # get train time from SageMaker job, this includes starting, preprocessing, stopping
       _snake_case     		=				(
           Session().describe_training_job(estimator.latest_training_job.name	).get("TrainingTimeInSeconds"						,   999_999	)
       )

       # assert kpis
       assert train_runtime <= self.results["train_runtime"]
       assert all(t >= self.results["eval_accuracy"] for t in eval_accuracy	)
       assert all(t <= self.results["eval_loss"] for t in eval_loss	)

       # dump tests result into json file to share in PR
       with open(F'''{estimator.latest_training_job.name}.json'''						,   "w"	) as outfile:
         json.dump({"train_time": train_runtime, "eval_accuracy": eval_accuracy, "eval_loss": eval_loss}						,   lowerCamelCase	)









'''simple docstring'''



from collections import OrderedDict
from typing import Mapping

from packaging import version

from ...configuration_utils import PretrainedConfig
from ...onnx import OnnxConfig
from ...utils import logging


__magic_name__   :						Dict    =			logging.get_logger(__name__)

__magic_name__   :						Dict    =			{
    """google/mobilenet_v1_1.0_224""": """https://huggingface.co/google/mobilenet_v1_1.0_224/resolve/main/config.json""",
    """google/mobilenet_v1_0.75_192""": """https://huggingface.co/google/mobilenet_v1_0.75_192/resolve/main/config.json""",
    # See all MobileNetV1 models at https://huggingface.co/models?filter=mobilenet_v1
}


class       __SCREAMING_SNAKE_CASE	(						__UpperCamelCase			):



     '''simple docstring'''






     UpperCAmelCase__       :						List[Any]      =   '''mobilenet_v1'''

     def __init__(					self						,   lowerCamelCase=3						,   lowerCamelCase=224						,   lowerCamelCase=1.0						,   lowerCamelCase=8						,   lowerCamelCase="relu6"						,   lowerCamelCase=True						,   lowerCamelCase=0.999						,   lowerCamelCase=0.02						,   lowerCamelCase=0.001						,   **lowerCamelCase						,   ):
       super().__init__(**lowerCamelCase	)

       if depth_multiplier <= 0:
         raise ValueError("depth_multiplier must be greater than zero."	)

       _snake_case     		=				num_channels
       _snake_case     		=				image_size
       _snake_case     		=				depth_multiplier
       _snake_case     		=				min_depth
       _snake_case     		=				hidden_act
       _snake_case     		=				tf_padding
       _snake_case     		=				classifier_dropout_prob
       _snake_case     		=				initializer_range
       _snake_case     		=				layer_norm_eps







class       __SCREAMING_SNAKE_CASE	(						__UpperCamelCase			):



     '''simple docstring'''






     UpperCAmelCase__       :						int      =   version.parse('''1.11'''			)

     @property
     def 	UpperCamelCase(					self	):
       return OrderedDict([("pixel_values", {0: "batch"})]	)

     @property
     def 	UpperCamelCase(					self	):
       if self.task == "image-classification":
         return OrderedDict([("logits", {0: "batch"})]	)
       else:
         return OrderedDict([("last_hidden_state", {0: "batch"}), ("pooler_output", {0: "batch"})]	)






     @property
     def 	UpperCamelCase(					self	):
       return 1e-4


