Spaces:
Runtime error
Runtime error
# coding=utf-8 | |
# Copyright 2021 The IDEA Authors. 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. | |
""" T5 model configuration """ | |
from collections import OrderedDict | |
from typing import Any, Dict, Iterable, Mapping, Optional | |
from transformers import PreTrainedTokenizer, TensorType | |
from transformers import is_torch_available | |
from transformers.configuration_utils import PretrainedConfig | |
from transformers.onnx import OnnxConfigWithPast | |
from transformers.utils import logging | |
logger = logging.get_logger(__name__) | |
T5_PRETRAINED_CONFIG_ARCHIVE_MAP = { | |
"T5-small": "https://huggingface.co./T5-small/resolve/main/config.json", | |
"T5-base": "https://huggingface.co./T5-base/resolve/main/config.json", | |
"T5-large": "https://huggingface.co./T5-large/resolve/main/config.json", | |
"T5-3b": "https://huggingface.co./T5-3b/resolve/main/config.json", | |
"T5-11b": "https://huggingface.co./T5-11b/resolve/main/config.json", | |
} | |
class T5Config(PretrainedConfig): | |
r""" | |
This is the configuration class to store the configuration of a :class:`~transformers.T5Model` or a | |
:class:`~transformers.TFT5Model`. It is used to instantiate a T5 model according to the specified arguments, | |
defining the model architecture. Instantiating a configuration with the defaults will yield a similar configuration | |
to that of the T5 `T5-small <https://huggingface.co./T5-small>`__ architecture. | |
Configuration objects inherit from :class:`~transformers.PretrainedConfig` and can be used to control the model | |
outputs. Read the documentation from :class:`~transformers.PretrainedConfig` for more information. | |
Arguments: | |
vocab_size (:obj:`int`, `optional`, defaults to 32128): | |
Vocabulary size of the T5 model. Defines the number of different tokens that can be represented by the | |
:obj:`inputs_ids` passed when calling :class:`~transformers.T5Model` or :class:`~transformers.TFT5Model`. | |
d_model (:obj:`int`, `optional`, defaults to 512): | |
Size of the encoder layers and the pooler layer. | |
d_kv (:obj:`int`, `optional`, defaults to 64): | |
Size of the key, query, value projections per attention head. :obj:`d_kv` has to be equal to :obj:`d_model | |
// num_heads`. | |
d_ff (:obj:`int`, `optional`, defaults to 2048): | |
Size of the intermediate feed forward layer in each :obj:`T5Block`. | |
num_layers (:obj:`int`, `optional`, defaults to 6): | |
Number of hidden layers in the Transformer encoder. | |
num_decoder_layers (:obj:`int`, `optional`): | |
Number of hidden layers in the Transformer decoder. Will use the same value as :obj:`num_layers` if not | |
set. | |
num_heads (:obj:`int`, `optional`, defaults to 8): | |
Number of attention heads for each attention layer in the Transformer encoder. | |
relative_attention_num_buckets (:obj:`int`, `optional`, defaults to 32): | |
The number of buckets to use for each attention layer. | |
dropout_rate (:obj:`float`, `optional`, defaults to 0.1): | |
The ratio for all dropout layers. | |
layer_norm_eps (:obj:`float`, `optional`, defaults to 1e-6): | |
The epsilon used by the layer normalization layers. | |
initializer_factor (:obj:`float`, `optional`, defaults to 1): | |
A factor for initializing all weight matrices (should be kept to 1, used internally for initialization | |
testing). | |
feed_forward_proj (:obj:`string`, `optional`, defaults to :obj:`"relu"`): | |
Type of feed forward layer to be used. Should be one of :obj:`"relu"` or :obj:`"gated-gelu"`. T5v1.1 uses | |
the :obj:`"gated-gelu"` feed forward projection. Original T5 uses :obj:`"relu"`. | |
use_cache (:obj:`bool`, `optional`, defaults to :obj:`True`): | |
Whether or not the model should return the last key/values attentions (not used by all models). | |
gradient_checkpointing (:obj:`bool`, `optional`, defaults to :obj:`False`): | |
If True, use gradient checkpointing to save memory at the expense of slower backward pass. | |
""" | |
model_type = "T5" | |
keys_to_ignore_at_inference = ["past_key_values"] | |
def __init__( | |
self, | |
vocab_size=32128, | |
d_model=512, | |
d_kv=64, | |
d_ff=2048, | |
num_layers=6, | |
num_decoder_layers=None, | |
num_heads=8, | |
relative_attention_num_buckets=32, | |
dropout_rate=0.1, | |
layer_norm_epsilon=1e-5, | |
initializer_factor=1.0, | |
feed_forward_proj="gelu", | |
is_encoder_decoder=True, | |
use_cache=True, | |
pad_token_id=0, | |
eos_token_id=1, | |
gradient_checkpointing=False, | |
**kwargs | |
): | |
super().__init__( | |
pad_token_id=pad_token_id, | |
eos_token_id=eos_token_id, | |
is_encoder_decoder=is_encoder_decoder, | |
**kwargs, | |
) | |
self.vocab_size = vocab_size | |
self.d_model = d_model | |
self.d_kv = d_kv | |
self.d_ff = d_ff | |
self.num_layers = num_layers | |
self.num_decoder_layers = ( | |
num_decoder_layers if num_decoder_layers is not None else self.num_layers | |
) # default = symmetry | |
self.num_heads = num_heads | |
self.relative_attention_num_buckets = relative_attention_num_buckets | |
self.dropout_rate = dropout_rate | |
self.layer_norm_epsilon = layer_norm_epsilon | |
self.initializer_factor = initializer_factor | |
self.feed_forward_proj = feed_forward_proj | |
self.use_cache = use_cache | |
self.gradient_checkpointing = gradient_checkpointing | |
def hidden_size(self): | |
return self.d_model | |
def num_attention_heads(self): | |
return self.num_heads | |
def num_hidden_layers(self): | |
return self.num_layers | |
class T5OnnxConfig(OnnxConfigWithPast): | |
def inputs(self) -> Mapping[str, Mapping[int, str]]: | |
common_inputs = OrderedDict( | |
[ | |
("input_ids", {0: "batch", 1: "encoder_sequence"}), | |
("attention_mask", {0: "batch", 1: "encoder_sequence"}), | |
("decoder_input_ids", {0: "batch"}), | |
("decoder_attention_mask", {0: "batch"}), | |
] | |
) | |
if self.use_past: | |
for i in range(0, self._config.num_layers): | |
common_inputs[f"past_key_values.{i}.decoder.key"] = { | |
0: "batch", 2: "past_sequence"} | |
common_inputs[f"past_key_values.{i}.decoder.value"] = { | |
0: "batch", 2: "past_sequence"} | |
common_inputs[f"past_key_values.{i}.encoder.key"] = { | |
0: "batch", 2: "past_sequence"} | |
common_inputs[f"past_key_values.{i}.encoder.value"] = { | |
0: "batch", 2: "past_sequence"} | |
return common_inputs | |
def outputs(self) -> Mapping[str, Mapping[int, str]]: | |
common_outputs = super().outputs | |
if "last_hidden_state" in common_outputs: | |
common_outputs["last_hidden_state"] = { | |
0: "batch", 1: "decoder_sequence"} | |
if self.use_past: | |
for i in range(self._config.num_layers): | |
common_outputs[f"present.{i}.decoder.key"] = { | |
0: "batch", 2: "decoder_sequence"} | |
common_outputs[f"present.{i}.decoder.value"] = { | |
0: "batch", 2: "decoder_sequence"} | |
common_outputs[f"present.{i}.encoder.key"] = { | |
0: "batch", 2: "encoder_sequence"} | |
common_outputs[f"present.{i}.encoder.value"] = { | |
0: "batch", 2: "encoder_sequence"} | |
if self.task == "default": | |
common_outputs["encoder_last_hidden_state"] = { | |
0: "batch", 2: "encoder_sequence"} | |
return common_outputs | |
def generate_dummy_inputs( | |
self, | |
tokenizer: PreTrainedTokenizer, | |
batch_size: int = -1, | |
seq_length: int = -1, | |
is_pair: bool = False, | |
framework: Optional[TensorType] = None, | |
) -> Mapping[str, Any]: | |
# Generate encoder inputs | |
encoder_inputs = super().generate_dummy_inputs( | |
tokenizer, batch_size, seq_length, is_pair, framework) | |
# Generate decoder inputs | |
decoder_inputs = super().generate_dummy_inputs( | |
tokenizer, batch_size, 1, is_pair, framework) | |
decoder_inputs = {f"decoder_{name}": tensor for name, | |
tensor in decoder_inputs.items()} | |
ordered_inputs = dict(**encoder_inputs, **decoder_inputs) | |
if self.use_past: | |
if not is_torch_available(): | |
raise ValueError( | |
"Cannot generate dummy past_keys inputs without PyTorch installed.") | |
else: | |
import torch | |
batch = encoder_inputs["input_ids"].shape[0] | |
encoder_seq_length = encoder_inputs["input_ids"].shape[1] | |
encoder_shape = ( | |
batch, | |
self._config.num_heads, | |
encoder_seq_length, | |
self._config.hidden_size // self._config.num_heads, | |
) | |
decoder_shape = (batch, self._config.num_heads, 1, | |
self._config.hidden_size // self._config.num_heads) | |
ordered_inputs["past_key_values"] = [] | |
for _ in range(self._config.num_layers): | |
ordered_inputs["past_key_values"].append( | |
( | |
torch.zeros(decoder_shape), | |
torch.zeros(decoder_shape), | |
torch.zeros(encoder_shape), | |
torch.zeros(encoder_shape), | |
) | |
) | |
return ordered_inputs | |
def flatten_output_collection_property(name: str, field: Iterable[Any]) -> Dict[str, Any]: | |
if name in ["present", "past_key_values"]: | |
flatten_output = {} | |
for idx, t in enumerate(field): | |
flatten_output[f"{name}.{idx}.decoder.key"] = t[0] | |
flatten_output[f"{name}.{idx}.decoder.value"] = t[1] | |
flatten_output[f"{name}.{idx}.encoder.key"] = t[2] | |
flatten_output[f"{name}.{idx}.encoder.value"] = t[3] | |
return flatten_output | |
return super().flatten_output_collection_property(name, field) | |