






"""simple docstring"""






# Copyright 2022 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 argparse
import os
import platform

import numpy as np
import psutil
import torch

from accelerate import __version__ as version
from accelerate.commands.config import default_config_file, load_config_from_file

from ..utils import is_npu_available, is_xpu_available



def 			__lowerCamelCase       (       lowerCAmelCase__=None					):
				if subparsers is not None:
								A__							=							subparsers.add_parser('env'					)
				else:
								A__							=							argparse.ArgumentParser('Accelerate env command'					)

				parser.add_argument(
				    '--config_file'							,default=UpperCamelCase_							,help='The config file to use for the default values in the launching script.'					)

				if subparsers is not None:
								parser.set_defaults(func=UpperCamelCase_					)
				return parser



def 			__lowerCamelCase       (       lowerCAmelCase__					):
				A__							=							torch.__version__
				A__							=							torch.cuda.is_available()
				A__							=							is_xpu_available()
				A__							=							is_npu_available()

				A__							=							'Not found'
				# Get the default from the config file.
				if args.config_file is not None or os.path.isfile(UpperCamelCase_					):
								A__							=							load_config_from_file(args.config_file					).to_dict()

				A__							=							{
				    '`Accelerate` version': version,
				    'Platform': platform.platform(),
				    'Python version': platform.python_version(),
				    'Numpy version': np.__version__,
				    'PyTorch version (GPU?)': f'''{pt_version} ({pt_cuda_available})''',
				    'PyTorch XPU available': str(UpperCamelCase_					),
				    'PyTorch NPU available': str(UpperCamelCase_					),
				    'System RAM': f'''{psutil.virtual_memory().total / 1024 ** 3:.2f} GB''',
				}
				if pt_cuda_available:
								A__							=							torch.cuda.get_device_name()

				print('\nCopy-and-paste the text below in your GitHub issue\n'					)
				print('\n'.join([f'''- {prop}: {val}''' for prop, val in info.items()]					)					)

				print('- `Accelerate` default config:' if args.config_file is None else '- `Accelerate` config passed:'					)
				A__							=							(
				    '\n'.join([f'''\t- {prop}: {val}''' for prop, val in accelerate_config.items()]					)
				    if isinstance(UpperCamelCase_							,UpperCamelCase_					)
				    else f'''\t{accelerate_config}'''
				)
				print(UpperCamelCase_					)

				A__							=							accelerate_config

				return info



def 			__lowerCamelCase       (       ):
				A__							=							env_command_parser()
				A__							=							parser.parse_args()
				env_command(UpperCamelCase_					)
				return 0


if __name__ == "__main__":
					raise SystemExit(main())







from typing import Optional

import numpy as np
import torch
from torch import nn
from transformers import GPTaConfig, GPTaLMHeadModel
from transformers.modeling_utils import ModuleUtilsMixin

from ...configuration_utils import ConfigMixin, register_to_config
from ...models import ModelMixin



class      _UpperCAmelCase      (							A__      ,   A__      ,   A__  ):
     UpperCamelCase__		     =					[r'''h\.\d+\.attn\.bias''', r'''h\.\d+\.attn\.masked_bias''']




     @register_to_config
     def __init__(					self			,    a__			,    a__			,    a__ = None			,    a__ = 5_0_2_5_7			,    a__ = 1_0_2_4			,    a__ = 7_6_8			,    a__ = 1_2			,    a__ = 1_2			,    a__ = None			,    a__ = "gelu_new"			,    a__ = 0.1			,    a__ = 0.1			,    a__ = 0.1			,    a__ = 1e-5			,    a__ = 0.0_2			,    a__ = True			,    a__ = True			,    a__ = False			,    a__ = False			,    ):
         super().__init__()

         A__					=       prefix_length

         if prefix_inner_dim != n_embd and prefix_hidden_dim is None:
             raise ValueError(
                 F"`prefix_hidden_dim` cannot be `None` when `prefix_inner_dim`: {prefix_hidden_dim} and"
                 F" `n_embd`: {n_embd} are not equal.")

         A__					=       prefix_inner_dim
         A__					=       prefix_hidden_dim

         A__					=       (
             nn.Linear(self.prefix_inner_dim			,    self.prefix_hidden_dim)
             if self.prefix_hidden_dim is not None
             else nn.Identity()
         )
         A__					=       (
             nn.Linear(self.prefix_hidden_dim			,    a__) if self.prefix_hidden_dim is not None else nn.Identity()
         )

         A__					=       GPTaConfig(
             vocab_size=a__			,    n_positions=a__			,    n_embd=a__			,    n_layer=a__			,    n_head=a__			,    n_inner=a__			,    activation_function=a__			,    resid_pdrop=a__			,    embd_pdrop=a__			,    attn_pdrop=a__			,    layer_norm_epsilon=a__			,    initializer_range=a__			,    scale_attn_weights=a__			,    use_cache=a__			,    scale_attn_by_inverse_layer_idx=a__			,    reorder_and_upcast_attn=a__			,    )
         A__					=       GPTaLMHeadModel(a__)




     def 		snake_case_		(					self			,    a__			,    a__			,    a__ = None			,    a__ = None			,    ):
         A__					=       self.transformer.transformer.wte(a__)
         A__					=       self.encode_prefix(a__)
         A__					=       self.decode_prefix(a__)
         A__					=       torch.cat((prefix_embeds, embedding_text)			,    dim=1)

         if labels is not None:
             A__					=       self.get_dummy_token(input_ids.shape[0]			,    input_ids.device)
             A__					=       torch.cat((dummy_token, input_ids)			,    dim=1)
         A__					=       self.transformer(inputs_embeds=a__			,    labels=a__			,    attention_mask=a__)
         if self.prefix_hidden_dim is not None:
             return out, hidden
         else:
             return out




     def 		snake_case_		(					self			,    a__			,    a__):
         return torch.zeros(a__			,    self.prefix_length			,    dtype=torch.intaa			,    device=a__)




     def 		snake_case_		(					self			,    a__):
         return self.encode_prefix(a__)




     @torch.no_grad()
     def 		snake_case_		(					self			,    a__			,    a__			,    a__):
         A__					=       torch.split(a__			,    1			,    dim=0)
         A__					=       []
         A__					=       []
         for feature in features:
             A__					=       self.decode_prefix(feature.to(a__))  # back to the clip feature
             # Only support beam search for now
             A__			,						A__					=       self.generate_beam(
                 input_embeds=a__			,    device=a__			,    eos_token_id=a__)
             generated_tokens.append(output_tokens[0])
             generated_seq_lengths.append(seq_lengths[0])
         A__					=       torch.stack(a__)
         A__					=       torch.stack(a__)
         return generated_tokens, generated_seq_lengths




     @torch.no_grad()
     def 		snake_case_		(					self			,    a__=None			,    a__=None			,    a__=None			,    a__ = 5			,    a__ = 6_7			,    a__ = 1.0			,    a__ = None			,    ):
         A__					=       eos_token_id
         A__					=       None
         A__					=       None
         A__					=       torch.ones(a__			,    device=a__			,    dtype=torch.int)
         A__					=       torch.zeros(a__			,    device=a__			,    dtype=torch.bool)

         if input_embeds is not None:
             A__					=       input_embeds
         else:
             A__					=       self.transformer.transformer.wte(a__)

         for i in range(a__):
             A__					=       self.transformer(inputs_embeds=a__)
             A__					=       outputs.logits
             A__					=       logits[:, -1, :] / (temperature if temperature > 0 else 1.0)
             A__					=       logits.softmax(-1).log()

             if scores is None:
                 A__			,						A__					=       logits.topk(a__			,    -1)
                 A__					=       generated.expand(a__			,    *generated.shape[1:])
                 A__			,						A__					=       next_tokens.permute(1			,    0), scores.squeeze(0)
                 if tokens is None:
                     A__					=       next_tokens
                 else:
                     A__					=       tokens.expand(a__			,    *tokens.shape[1:])
                     A__					=       torch.cat((tokens, next_tokens)			,    dim=1)
             else:
                 A__					=       -float(np.inf)
                 A__					=       0
                 A__					=       scores[:, None] + logits
                 seq_lengths[~is_stopped] += 1
                 A__					=       scores_sum / seq_lengths[:, None]
                 A__			,						A__					=       scores_sum_average.view(-1).topk(a__			,    -1)
                 A__					=       next_tokens // scores_sum.shape[1]
                 A__					=       seq_lengths[next_tokens_source]
                 A__					=       next_tokens % scores_sum.shape[1]
                 A__					=       next_tokens.unsqueeze(1)
                 A__					=       tokens[next_tokens_source]
                 A__					=       torch.cat((tokens, next_tokens)			,    dim=1)
                 A__					=       generated[next_tokens_source]
                 A__					=       scores_sum_average * seq_lengths
                 A__					=       is_stopped[next_tokens_source]

             A__					=       self.transformer.transformer.wte(next_tokens.squeeze()).view(generated.shape[0]			,    1			,    -1)
             A__					=       torch.cat((generated, next_token_embed)			,    dim=1)
             A__					=       is_stopped + next_tokens.eq(a__).squeeze()
             if is_stopped.all():
                 break

         A__					=       scores / seq_lengths
         A__					=       scores.argsort(descending=a__)
         # tokens tensors are already padded to max_seq_length
         A__					=       [tokens[i] for i in order]
         A__					=       torch.stack(a__			,    dim=0)
         A__					=       torch.tensor([seq_lengths[i] for i in order]			,    dtype=seq_lengths.dtype)
         return output_texts, seq_lengths
