




'''simple docstring'''






# Usage:
# ./gen-card-allenai-wmt16.py

import os
from pathlib import Path






def 		UpperCamelCase__      (		__SCREAMING_SNAKE_CASE				,      __SCREAMING_SNAKE_CASE				,      __SCREAMING_SNAKE_CASE				,      __SCREAMING_SNAKE_CASE		)    ->   Union[str, Any]:
      snake_case__       :   str	      =    {
          'en': 'Machine learning is great, isn\'t it?',
          'ru': 'Машинное обучение - это здорово, не так ли?',
          'de': 'Maschinelles Lernen ist großartig, nicht wahr?',
      }

      # BLUE scores as follows:
      # "pair": [fairseq, transformers]
      snake_case__       :   Union[str, Any]	      =    {
          'wmt16-en-de-dist-12-1': [28.3, 27.52],
          'wmt16-en-de-dist-6-1': [27.4, 27.11],
          'wmt16-en-de-12-1': [26.9, 25.75],
      }
      snake_case__       :   Optional[Any]	      =    f"{src_lang}-{tgt_lang}"

      snake_case__       :   List[str]	      =    f"\n---\nlanguage:\n- {src_lang}\n- {tgt_lang}\nthumbnail:\ntags:\n- translation\n- wmt16\n- allenai\nlicense: apache-2.0\ndatasets:\n- wmt16\nmetrics:\n- bleu\n---\n\n# FSMT\n\n## Model description\n\nThis is a ported version of fairseq-based [wmt16 transformer](https://github.com/jungokasai/deep-shallow/) for {src_lang}-{tgt_lang}.\n\nFor more details, please, see [Deep Encoder, Shallow Decoder: Reevaluating the Speed-Quality Tradeoff in Machine Translation](https://arxiv.org/abs/2006.10369).\n\nAll 3 models are available:\n\n* [wmt16-en-de-dist-12-1](https://huggingface.co/allenai/wmt16-en-de-dist-12-1)\n* [wmt16-en-de-dist-6-1](https://huggingface.co/allenai/wmt16-en-de-dist-6-1)\n* [wmt16-en-de-12-1](https://huggingface.co/allenai/wmt16-en-de-12-1)\n\n\n## Intended uses & limitations\n\n#### How to use\n\n```python\nfrom transformers import FSMTForConditionalGeneration, FSMTTokenizer\nmname = \"allenai/{model_name}\"\ntokenizer = FSMTTokenizer.from_pretrained(mname)\nmodel = FSMTForConditionalGeneration.from_pretrained(mname)\n\ninput = \"{texts[src_lang]}\"\ninput_ids = tokenizer.encode(input, return_tensors=\"pt\")\noutputs = model.generate(input_ids)\ndecoded = tokenizer.decode(outputs[0], skip_special_tokens=True)\nprint(decoded) # {texts[tgt_lang]}\n\n```\n\n#### Limitations and bias\n\n\n## Training data\n\nPretrained weights were left identical to the original model released by allenai. For more details, please, see the [paper](https://arxiv.org/abs/2006.10369).\n\n## Eval results\n\nHere are the BLEU scores:\n\nmodel   | fairseq | transformers\n-------|---------|----------\n{model_name}  | {scores[model_name][0]} | {scores[model_name][1]}\n\nThe score is slightly below the score reported in the paper, as the researchers don't use `sacrebleu` and measure the score on tokenized outputs. `transformers` score was measured using `sacrebleu` on detokenized outputs.\n\nThe score was calculated using this code:\n\n```bash\ngit clone https://github.com/huggingface/transformers\ncd transformers\nexport PAIR={pair}\nexport DATA_DIR=data/$PAIR\nexport SAVE_DIR=data/$PAIR\nexport BS=8\nexport NUM_BEAMS=5\nmkdir -p $DATA_DIR\nsacrebleu -t wmt16 -l $PAIR --echo src > $DATA_DIR/val.source\nsacrebleu -t wmt16 -l $PAIR --echo ref > $DATA_DIR/val.target\necho $PAIR\nPYTHONPATH=\"src:examples/seq2seq\" python examples/seq2seq/run_eval.py allenai/{model_name} $DATA_DIR/val.source $SAVE_DIR/test_translations.txt --reference_path $DATA_DIR/val.target --score_path $SAVE_DIR/test_bleu.json --bs $BS --task translation --num_beams $NUM_BEAMS\n```\n\n## Data Sources\n\n- [training, etc.](http://www.statmt.org/wmt16/)\n- [test set](http://matrix.statmt.org/test_sets/newstest2016.tgz?1504722372)\n\n\n### BibTeX entry and citation info\n\n```\n@misc{{kasai2020deep,\n    title={{Deep Encoder, Shallow Decoder: Reevaluating the Speed-Quality Tradeoff in Machine Translation}},\n    author={{Jungo Kasai and Nikolaos Pappas and Hao Peng and James Cross and Noah A. Smith}},\n    year={{2020}},\n    eprint={{2006.10369}},\n    archivePrefix={{arXiv}},\n    primaryClass={{cs.CL}}\n}}\n```\n\n"
      model_card_dir.mkdir(parents=__SCREAMING_SNAKE_CASE				,      exist_ok=__SCREAMING_SNAKE_CASE		)
      snake_case__       :   List[Any]	      =    os.path.join(__SCREAMING_SNAKE_CASE				,      'README.md'		)
      print(f"Generating {path}"		)
      with open(__SCREAMING_SNAKE_CASE				,      'w'				,      encoding='utf-8'		) as f:
            f.write(__SCREAMING_SNAKE_CASE		)


# make sure we are under the root of the project
A_			      =		Path(__file__).resolve().parent.parent.parent
A_			      =		repo_dir / "model_cards"

for model_name in ["wmt16-en-de-dist-12-1", "wmt16-en-de-dist-6-1", "wmt16-en-de-12-1"]:
      A_			      =		model_cards_dir / "allenai" / model_name
      write_model_card(model_card_dir, src_lang="en", tgt_lang="de", model_name=model_name)






'''simple docstring'''






# 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.
import json
import os

from ...utils.constants import SAGEMAKER_PARALLEL_EC2_INSTANCES, TORCH_DYNAMO_MODES
from ...utils.dataclasses import ComputeEnvironment, SageMakerDistributedType
from ...utils.imports import is_botoa_available
from .config_args import SageMakerConfig
from .config_utils import (
    DYNAMO_BACKENDS,
    _ask_field,
    _ask_options,
    _convert_dynamo_backend,
    _convert_mixed_precision,
    _convert_sagemaker_distributed_mode,
    _convert_yes_no_to_bool,
)


if is_botoa_available():
      import botoa  # noqa: F401






def 		UpperCamelCase__      (		__SCREAMING_SNAKE_CASE		)    ->   Dict:
      snake_case__       :   Optional[int]	      =    botoa.client('iam'		)

      snake_case__       :   Any	      =    {
          'Version': '2012-10-17',
          'Statement': [
              {'Effect': 'Allow', 'Principal': {'Service': 'sagemaker.amazonaws.com'}, 'Action': 'sts:AssumeRole'}
          ],
      }
      try:
            # create the role, associated with the chosen trust policy
            iam_client.create_role(
                RoleName=__SCREAMING_SNAKE_CASE				,      AssumeRolePolicyDocument=json.dumps(__SCREAMING_SNAKE_CASE				,      indent=2		)		)
            snake_case__       :   str	      =    {
                'Version': '2012-10-17',
                'Statement': [
                    {
                        'Effect': 'Allow',
                        'Action': [
                            'sagemaker:*',
                            'ecr:GetDownloadUrlForLayer',
                            'ecr:BatchGetImage',
                            'ecr:BatchCheckLayerAvailability',
                            'ecr:GetAuthorizationToken',
                            'cloudwatch:PutMetricData',
                            'cloudwatch:GetMetricData',
                            'cloudwatch:GetMetricStatistics',
                            'cloudwatch:ListMetrics',
                            'logs:CreateLogGroup',
                            'logs:CreateLogStream',
                            'logs:DescribeLogStreams',
                            'logs:PutLogEvents',
                            'logs:GetLogEvents',
                            's3:CreateBucket',
                            's3:ListBucket',
                            's3:GetBucketLocation',
                            's3:GetObject',
                            's3:PutObject',
                        ],
                        'Resource': '*',
                    }
                ],
            }
            # attach policy to role
            iam_client.put_role_policy(
                RoleName=__SCREAMING_SNAKE_CASE				,      PolicyName=f"{role_name}_policy_permission"				,      PolicyDocument=json.dumps(__SCREAMING_SNAKE_CASE				,      indent=2		)				,      )
      except iam_client.exceptions.EntityAlreadyExistsException:
            print(f"role {role_name} already exists. Using existing one"		)






def 		UpperCamelCase__      (		__SCREAMING_SNAKE_CASE		)    ->   Optional[int]:
      snake_case__       :   Tuple	      =    botoa.client('iam'		)
      return iam_client.get_role(RoleName=__SCREAMING_SNAKE_CASE		)["Role"]["Arn"]






def 		UpperCamelCase__      (		)    ->   Tuple:
      snake_case__       :   Dict	      =    _ask_options(
          'How do you want to authorize?'				,      ['AWS Profile', 'Credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) ']				,      __SCREAMING_SNAKE_CASE				,      )
      snake_case__       :   int	      =    None
      if credentials_configuration == 0:
            snake_case__       :   Any	      =    _ask_field('Enter your AWS Profile name: [default] '				,      default='default'		)
            snake_case__       :   Union[str, Any]	      =    aws_profile
      else:
            print(
                'Note you will need to provide AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY when you launch you training script with,'
                '`accelerate launch --aws_access_key_id XXX --aws_secret_access_key YYY`'		)
            snake_case__       :   Dict	      =    _ask_field('AWS Access Key ID: '		)
            snake_case__       :   Tuple	      =    aws_access_key_id

            snake_case__       :   int	      =    _ask_field('AWS Secret Access Key: '		)
            snake_case__       :   Optional[int]	      =    aws_secret_access_key

      snake_case__       :   str	      =    _ask_field('Enter your AWS Region: [us-east-1]'				,      default='us-east-1'		)
      snake_case__       :   Dict	      =    aws_region

      snake_case__       :   Optional[int]	      =    _ask_options(
          'Do you already have an IAM Role for executing Amazon SageMaker Training Jobs?'				,      ['Provide IAM Role name', 'Create new IAM role using credentials']				,      __SCREAMING_SNAKE_CASE				,      )
      if role_management == 0:
            snake_case__       :   Optional[int]	      =    _ask_field('Enter your IAM role name: '		)
      else:
            snake_case__       :   Dict	      =    'accelerate_sagemaker_execution_role'
            print(f"Accelerate will create an iam role \"{iam_role_name}\" using the provided credentials"		)
            _create_iam_role_for_sagemaker(__SCREAMING_SNAKE_CASE		)

      snake_case__       :   List[str]	      =    _ask_field(
          'Do you want to use custom Docker image? [yes/NO]: '				,      _convert_yes_no_to_bool				,      default=__SCREAMING_SNAKE_CASE				,      error_message='Please enter yes or no.'				,      )
      snake_case__       :   Dict	      =    None
      if is_custom_docker_image:
            snake_case__       :   Optional[int]	      =    _ask_field('Enter your Docker image: '				,      lambda __SCREAMING_SNAKE_CASE		: str(__SCREAMING_SNAKE_CASE		).lower()		)

      snake_case__       :   int	      =    _ask_field(
          'Do you want to provide SageMaker input channels with data locations? [yes/NO]: '				,      _convert_yes_no_to_bool				,      default=__SCREAMING_SNAKE_CASE				,      error_message='Please enter yes or no.'				,      )
      snake_case__       :   Dict	      =    None
      if is_sagemaker_inputs_enabled:
            snake_case__       :   Optional[int]	      =    _ask_field(
                'Enter the path to the SageMaker inputs TSV file with columns (channel_name, data_location): '				,      lambda __SCREAMING_SNAKE_CASE		: str(__SCREAMING_SNAKE_CASE		).lower()				,      )

      snake_case__       :   str	      =    _ask_field(
          'Do you want to enable SageMaker metrics? [yes/NO]: '				,      _convert_yes_no_to_bool				,      default=__SCREAMING_SNAKE_CASE				,      error_message='Please enter yes or no.'				,      )
      snake_case__       :   Optional[int]	      =    None
      if is_sagemaker_metrics_enabled:
            snake_case__       :   int	      =    _ask_field(
                'Enter the path to the SageMaker metrics TSV file with columns (metric_name, metric_regex): '				,      lambda __SCREAMING_SNAKE_CASE		: str(__SCREAMING_SNAKE_CASE		).lower()				,      )

      snake_case__       :   List[str]	      =    _ask_options(
          'What is the distributed mode?'				,      ['No distributed training', 'Data parallelism']				,      _convert_sagemaker_distributed_mode				,      )
      snake_case__       :   Optional[int]	      =    {}
      snake_case__       :   str	      =    _ask_field(
          'Do you wish to optimize your script with torch dynamo?[yes/NO]:'				,      _convert_yes_no_to_bool				,      default=__SCREAMING_SNAKE_CASE				,      error_message='Please enter yes or no.'				,      )
      if use_dynamo:
            snake_case__       :   List[str]	      =    'dynamo_'
            snake_case__       :   Tuple	      =    _ask_options(
                'Which dynamo backend would you like to use?'				,      [x.lower() for x in DYNAMO_BACKENDS]				,      _convert_dynamo_backend				,      default=2				,      )
            snake_case__       :   Optional[int]	      =    _ask_field(
                'Do you want to customize the defaults sent to torch.compile? [yes/NO]: '				,      _convert_yes_no_to_bool				,      default=__SCREAMING_SNAKE_CASE				,      error_message='Please enter yes or no.'				,      )

            if use_custom_options:
                  snake_case__       :   int	      =    _ask_options(
                      'Which mode do you want to use?'				,      __SCREAMING_SNAKE_CASE				,      lambda __SCREAMING_SNAKE_CASE		: TORCH_DYNAMO_MODES[int(__SCREAMING_SNAKE_CASE		)]				,      default='default'				,      )
                  snake_case__       :   Dict	      =    _ask_field(
                      'Do you want the fullgraph mode or it is ok to break model into several subgraphs? [yes/NO]: '				,      _convert_yes_no_to_bool				,      default=__SCREAMING_SNAKE_CASE				,      error_message='Please enter yes or no.'				,      )
                  snake_case__       :   List[Any]	      =    _ask_field(
                      'Do you want to enable dynamic shape tracing? [yes/NO]: '				,      _convert_yes_no_to_bool				,      default=__SCREAMING_SNAKE_CASE				,      error_message='Please enter yes or no.'				,      )
      snake_case__       :   int	      =    'Which EC2 instance type you want to use for your training?'
      if distributed_type != SageMakerDistributedType.NO:
            snake_case__       :   Tuple	      =    _ask_options(
                __SCREAMING_SNAKE_CASE				,      __SCREAMING_SNAKE_CASE				,      lambda __SCREAMING_SNAKE_CASE		: SAGEMAKER_PARALLEL_EC2_INSTANCES[int(__SCREAMING_SNAKE_CASE		)]		)
      else:
            eca_instance_query += "? [ml.p3.2xlarge]:"
            snake_case__       :   Dict	      =    _ask_field(__SCREAMING_SNAKE_CASE				,      lambda __SCREAMING_SNAKE_CASE		: str(__SCREAMING_SNAKE_CASE		).lower()				,      default='ml.p3.2xlarge'		)

      snake_case__       :   Optional[Any]	      =    1
      if distributed_type in (SageMakerDistributedType.DATA_PARALLEL, SageMakerDistributedType.MODEL_PARALLEL):
            snake_case__       :   Union[str, Any]	      =    _ask_field(
                'How many machines do you want use? [1]: '				,      __SCREAMING_SNAKE_CASE				,      default=1				,      )

      snake_case__       :   Optional[int]	      =    _ask_options(
          'Do you wish to use FP16 or BF16 (mixed precision)?'				,      ['no', 'fp16', 'bf16', 'fp8']				,      _convert_mixed_precision				,      )

      if use_dynamo and mixed_precision == "no":
            print(
                'Torch dynamo used without mixed precision requires TF32 to be efficient. Accelerate will enable it by default when launching your scripts.'		)

      return SageMakerConfig(
          image_uri=__SCREAMING_SNAKE_CASE				,      compute_environment=ComputeEnvironment.AMAZON_SAGEMAKER				,      distributed_type=__SCREAMING_SNAKE_CASE				,      use_cpu=__SCREAMING_SNAKE_CASE				,      dynamo_config=__SCREAMING_SNAKE_CASE				,      eca_instance_type=__SCREAMING_SNAKE_CASE				,      profile=__SCREAMING_SNAKE_CASE				,      region=__SCREAMING_SNAKE_CASE				,      iam_role_name=__SCREAMING_SNAKE_CASE				,      mixed_precision=__SCREAMING_SNAKE_CASE				,      num_machines=__SCREAMING_SNAKE_CASE				,      sagemaker_inputs_file=__SCREAMING_SNAKE_CASE				,      sagemaker_metrics_file=__SCREAMING_SNAKE_CASE				,      )
