evalscope 0.14.0__py3-none-any.whl → 0.15.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of evalscope might be problematic. Click here for more details.

Files changed (181) hide show
  1. evalscope/arguments.py +2 -1
  2. evalscope/benchmarks/__init__.py +2 -2
  3. evalscope/benchmarks/aigc/__init__.py +0 -0
  4. evalscope/benchmarks/aigc/t2i/__init__.py +0 -0
  5. evalscope/benchmarks/aigc/t2i/base.py +56 -0
  6. evalscope/benchmarks/aigc/t2i/evalmuse_adapter.py +77 -0
  7. evalscope/benchmarks/aigc/t2i/genai_bench_adapter.py +58 -0
  8. evalscope/benchmarks/aigc/t2i/general_t2i_adapter.py +58 -0
  9. evalscope/benchmarks/aigc/t2i/hpdv2_adapter.py +57 -0
  10. evalscope/benchmarks/aigc/t2i/tifa_adapter.py +37 -0
  11. evalscope/benchmarks/aime/aime24_adapter.py +1 -1
  12. evalscope/benchmarks/aime/aime25_adapter.py +4 -4
  13. evalscope/benchmarks/alpaca_eval/alpaca_eval_adapter.py +1 -2
  14. evalscope/benchmarks/arc/arc_adapter.py +1 -1
  15. evalscope/benchmarks/arena_hard/arena_hard_adapter.py +1 -3
  16. evalscope/benchmarks/ceval/ceval_adapter.py +2 -2
  17. evalscope/benchmarks/chinese_simple_qa/csimple_qa_adapter.py +1 -3
  18. evalscope/benchmarks/cmmlu/cmmlu_adapter.py +1 -1
  19. evalscope/benchmarks/competition_math/competition_math_adapter.py +1 -2
  20. evalscope/benchmarks/data_adapter.py +16 -9
  21. evalscope/benchmarks/data_collection/data_collection_adapter.py +6 -4
  22. evalscope/benchmarks/general_mcq/general_mcq_adapter.py +2 -2
  23. evalscope/benchmarks/general_qa/general_qa_adapter.py +3 -3
  24. evalscope/benchmarks/live_code_bench/evaluate_utils.py +16 -21
  25. evalscope/benchmarks/live_code_bench/live_code_bench_adapter.py +4 -1
  26. evalscope/benchmarks/live_code_bench/testing_util.py +6 -3
  27. evalscope/benchmarks/math_500/math_500_adapter.py +1 -1
  28. evalscope/benchmarks/mmlu/mmlu_adapter.py +3 -1
  29. evalscope/benchmarks/simple_qa/simple_qa_adapter.py +1 -2
  30. evalscope/benchmarks/utils.py +7 -16
  31. evalscope/cli/start_app.py +1 -1
  32. evalscope/collections/evaluator.py +16 -4
  33. evalscope/config.py +7 -3
  34. evalscope/constants.py +11 -0
  35. evalscope/evaluator/evaluator.py +9 -3
  36. evalscope/evaluator/reviewer/auto_reviewer.py +1 -1
  37. evalscope/metrics/__init__.py +49 -4
  38. evalscope/metrics/llm_judge.py +1 -1
  39. evalscope/metrics/named_metrics.py +13 -0
  40. evalscope/metrics/t2v_metrics/__init__.py +66 -0
  41. evalscope/metrics/t2v_metrics/clipscore.py +14 -0
  42. evalscope/metrics/t2v_metrics/constants.py +12 -0
  43. evalscope/metrics/t2v_metrics/itmscore.py +14 -0
  44. evalscope/metrics/t2v_metrics/models/__init__.py +0 -0
  45. evalscope/metrics/t2v_metrics/models/clipscore_models/__init__.py +30 -0
  46. evalscope/metrics/t2v_metrics/models/clipscore_models/build_mps_model/__init__.py +0 -0
  47. evalscope/metrics/t2v_metrics/models/clipscore_models/build_mps_model/base_model.py +6 -0
  48. evalscope/metrics/t2v_metrics/models/clipscore_models/build_mps_model/clip_model.py +132 -0
  49. evalscope/metrics/t2v_metrics/models/clipscore_models/build_mps_model/cross_modeling.py +286 -0
  50. evalscope/metrics/t2v_metrics/models/clipscore_models/clip_model.py +114 -0
  51. evalscope/metrics/t2v_metrics/models/clipscore_models/hpsv2_model.py +86 -0
  52. evalscope/metrics/t2v_metrics/models/clipscore_models/mps_model.py +85 -0
  53. evalscope/metrics/t2v_metrics/models/clipscore_models/pickscore_model.py +62 -0
  54. evalscope/metrics/t2v_metrics/models/itmscore_models/__init__.py +26 -0
  55. evalscope/metrics/t2v_metrics/models/itmscore_models/blip2_itm_model.py +84 -0
  56. evalscope/metrics/t2v_metrics/models/itmscore_models/fga_blip2_model.py +97 -0
  57. evalscope/metrics/t2v_metrics/models/itmscore_models/image_reward/ImageReward.py +171 -0
  58. evalscope/metrics/t2v_metrics/models/itmscore_models/image_reward/__init__.py +0 -0
  59. evalscope/metrics/t2v_metrics/models/itmscore_models/image_reward/blip_pretrain.py +80 -0
  60. evalscope/metrics/t2v_metrics/models/itmscore_models/image_reward_model.py +73 -0
  61. evalscope/metrics/t2v_metrics/models/model.py +45 -0
  62. evalscope/metrics/t2v_metrics/models/utils.py +25 -0
  63. evalscope/metrics/t2v_metrics/models/vqascore_models/__init__.py +22 -0
  64. evalscope/metrics/t2v_metrics/models/vqascore_models/clip_t5/__init__.py +0 -0
  65. evalscope/metrics/t2v_metrics/models/vqascore_models/clip_t5/model/__init__.py +1 -0
  66. evalscope/metrics/t2v_metrics/models/vqascore_models/clip_t5/model/language_model/clip_t5.py +300 -0
  67. evalscope/metrics/t2v_metrics/models/vqascore_models/clip_t5/model/multimodal_encoder/builder.py +12 -0
  68. evalscope/metrics/t2v_metrics/models/vqascore_models/clip_t5/model/multimodal_encoder/clip_encoder.py +82 -0
  69. evalscope/metrics/t2v_metrics/models/vqascore_models/clip_t5/model/multimodal_projector/builder.py +50 -0
  70. evalscope/metrics/t2v_metrics/models/vqascore_models/clip_t5_model.py +218 -0
  71. evalscope/metrics/t2v_metrics/models/vqascore_models/gpt4v_model.py +150 -0
  72. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/__init__.py +26 -0
  73. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/common/config.py +465 -0
  74. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/common/dist_utils.py +141 -0
  75. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/common/gradcam.py +22 -0
  76. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/common/logger.py +188 -0
  77. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/common/optims.py +106 -0
  78. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/common/registry.py +307 -0
  79. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/common/utils.py +416 -0
  80. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/common/vqa_tools/__init__.py +8 -0
  81. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/common/vqa_tools/vqa.py +191 -0
  82. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/common/vqa_tools/vqa_eval.py +318 -0
  83. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/default.yaml +10 -0
  84. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_caption_flant5xl.yaml +42 -0
  85. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_caption_opt2.7b.yaml +42 -0
  86. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_caption_opt6.7b.yaml +42 -0
  87. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_coco.yaml +36 -0
  88. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_instruct_flant5xl.yaml +43 -0
  89. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_instruct_flant5xxl.yaml +43 -0
  90. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_instruct_vicuna13b.yaml +43 -0
  91. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_instruct_vicuna7b.yaml +43 -0
  92. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_pretrain.yaml +36 -0
  93. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_pretrain_flant5xl.yaml +42 -0
  94. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_pretrain_flant5xl_iter_80k_total_100k_no_prefix.yaml +42 -0
  95. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_pretrain_flant5xl_iter_80k_total_100k_prefix.yaml +42 -0
  96. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_pretrain_flant5xl_vitL.yaml +43 -0
  97. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_pretrain_flant5xxl.yaml +42 -0
  98. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_pretrain_opt2.7b.yaml +42 -0
  99. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_pretrain_opt6.7b.yaml +42 -0
  100. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_pretrain_vitL.yaml +37 -0
  101. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_vicuna13b.yaml +43 -0
  102. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/blip2/blip2_vicuna7b.yaml +43 -0
  103. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/med_config.json +21 -0
  104. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/med_config_albef.json +22 -0
  105. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/configs/models/med_large_config.json +21 -0
  106. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/__init__.py +208 -0
  107. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/base_model.py +231 -0
  108. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip2_models/Qformer.py +1093 -0
  109. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip2_models/__init__.py +0 -0
  110. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip2_models/blip2.py +211 -0
  111. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip2_models/blip2_image_text_matching.py +109 -0
  112. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip2_models/blip2_qformer.py +452 -0
  113. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip2_models/blip2_t5.py +364 -0
  114. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip2_models/blip2_t5_instruct.py +755 -0
  115. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip2_models/fga_blip2.py +273 -0
  116. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip2_models/modeling_llama.py +880 -0
  117. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip2_models/modeling_t5.py +1844 -0
  118. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip_models/__init__.py +81 -0
  119. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip_models/blip.py +56 -0
  120. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip_models/blip_caption.py +212 -0
  121. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip_models/blip_classification.py +164 -0
  122. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip_models/blip_feature_extractor.py +202 -0
  123. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip_models/blip_image_text_matching.py +185 -0
  124. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip_models/blip_nlvr.py +178 -0
  125. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip_models/blip_outputs.py +112 -0
  126. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip_models/blip_pretrain.py +371 -0
  127. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip_models/blip_vqa.py +344 -0
  128. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/blip_models/nlvr_encoder.py +858 -0
  129. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/clip_vit.py +271 -0
  130. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/eva_vit.py +503 -0
  131. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/med.py +1270 -0
  132. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/models/vit.py +473 -0
  133. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/processors/__init__.py +31 -0
  134. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/processors/base_processor.py +27 -0
  135. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/processors/blip_processors.py +233 -0
  136. evalscope/metrics/t2v_metrics/models/vqascore_models/lavis/processors/randaugment.py +392 -0
  137. evalscope/metrics/t2v_metrics/models/vqascore_models/mm_utils.py +127 -0
  138. evalscope/metrics/t2v_metrics/models/vqascore_models/vqa_model.py +17 -0
  139. evalscope/metrics/t2v_metrics/score.py +78 -0
  140. evalscope/metrics/t2v_metrics/vqascore.py +14 -0
  141. evalscope/models/__init__.py +50 -14
  142. evalscope/models/adapters/__init__.py +17 -0
  143. evalscope/models/{base_adapter.py → adapters/base_adapter.py} +17 -17
  144. evalscope/models/{chat_adapter.py → adapters/chat_adapter.py} +10 -7
  145. evalscope/models/{choice_adapter.py → adapters/choice_adapter.py} +2 -6
  146. evalscope/models/{custom_adapter.py → adapters/custom_adapter.py} +2 -4
  147. evalscope/models/{server_adapter.py → adapters/server_adapter.py} +1 -3
  148. evalscope/models/adapters/t2i_adapter.py +76 -0
  149. evalscope/models/custom/__init__.py +2 -1
  150. evalscope/models/custom/dummy_model.py +11 -13
  151. evalscope/models/local_model.py +82 -33
  152. evalscope/models/model.py +2 -42
  153. evalscope/models/register.py +26 -0
  154. evalscope/perf/benchmark.py +4 -3
  155. evalscope/perf/main.py +4 -2
  156. evalscope/perf/plugin/datasets/flickr8k.py +2 -1
  157. evalscope/perf/utils/benchmark_util.py +2 -2
  158. evalscope/perf/utils/db_util.py +16 -8
  159. evalscope/report/__init__.py +1 -0
  160. evalscope/report/app.py +117 -67
  161. evalscope/report/app_arguments.py +11 -0
  162. evalscope/report/generator.py +1 -1
  163. evalscope/run.py +3 -3
  164. evalscope/third_party/thinkbench/eval.py +19 -7
  165. evalscope/utils/chat_service.py +2 -2
  166. evalscope/utils/import_utils.py +66 -0
  167. evalscope/utils/utils.py +12 -4
  168. evalscope/version.py +2 -2
  169. {evalscope-0.14.0.dist-info → evalscope-0.15.1.dist-info}/METADATA +20 -3
  170. {evalscope-0.14.0.dist-info → evalscope-0.15.1.dist-info}/RECORD +178 -66
  171. tests/aigc/__init__.py +1 -0
  172. tests/aigc/test_t2i.py +87 -0
  173. tests/cli/test_run.py +20 -7
  174. tests/perf/test_perf.py +6 -3
  175. evalscope/metrics/code_metric.py +0 -98
  176. evalscope/metrics/resources/gpt2-zhcn3-v4.bpe +0 -58485
  177. evalscope/metrics/resources/gpt2-zhcn3-v4.json +0 -1
  178. {evalscope-0.14.0.dist-info → evalscope-0.15.1.dist-info}/LICENSE +0 -0
  179. {evalscope-0.14.0.dist-info → evalscope-0.15.1.dist-info}/WHEEL +0 -0
  180. {evalscope-0.14.0.dist-info → evalscope-0.15.1.dist-info}/entry_points.txt +0 -0
  181. {evalscope-0.14.0.dist-info → evalscope-0.15.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1093 @@
1
+ """
2
+ * Copyright (c) 2023, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ * By Junnan Li
7
+ * Based on huggingface code base
8
+ * https://github.com/huggingface/transformers/blob/v4.15.0/src/transformers/models/bert
9
+ """
10
+
11
+ import math
12
+ import os
13
+ import torch
14
+ import torch.nn.functional as F
15
+ import torch.utils.checkpoint
16
+ import warnings
17
+ from dataclasses import dataclass
18
+ from torch import Tensor, device, dtype, nn
19
+ from torch.nn import CrossEntropyLoss
20
+ from transformers.activations import ACT2FN
21
+ from transformers.file_utils import ModelOutput
22
+ from transformers.modeling_outputs import (BaseModelOutputWithPastAndCrossAttentions,
23
+ BaseModelOutputWithPoolingAndCrossAttentions,
24
+ CausalLMOutputWithCrossAttentions, MaskedLMOutput, MultipleChoiceModelOutput,
25
+ NextSentencePredictorOutput, QuestionAnsweringModelOutput,
26
+ SequenceClassifierOutput, TokenClassifierOutput)
27
+ from transformers.modeling_utils import (PreTrainedModel, apply_chunking_to_forward, find_pruneable_heads_and_indices,
28
+ prune_linear_layer)
29
+ from transformers.models.bert.configuration_bert import BertConfig
30
+ from transformers.utils import logging
31
+ from typing import Any, Dict, Optional, Tuple
32
+
33
+ logger = logging.get_logger(__name__)
34
+
35
+
36
+ class BertEmbeddings(nn.Module):
37
+ """Construct the embeddings from word and position embeddings."""
38
+
39
+ def __init__(self, config):
40
+ super().__init__()
41
+ self.word_embeddings = nn.Embedding(config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id)
42
+ self.position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size)
43
+
44
+ # self.LayerNorm is not snake-cased to stick with TensorFlow model variable name and be able to load
45
+ # any TensorFlow checkpoint file
46
+ self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
47
+ self.dropout = nn.Dropout(config.hidden_dropout_prob)
48
+
49
+ # position_ids (1, len position emb) is contiguous in memory and exported when serialized
50
+ self.register_buffer('position_ids', torch.arange(config.max_position_embeddings).expand((1, -1)))
51
+ self.position_embedding_type = getattr(config, 'position_embedding_type', 'absolute')
52
+
53
+ self.config = config
54
+
55
+ def forward(
56
+ self,
57
+ input_ids=None,
58
+ position_ids=None,
59
+ query_embeds=None,
60
+ past_key_values_length=0,
61
+ ):
62
+ if input_ids is not None:
63
+ seq_length = input_ids.size()[1]
64
+ else:
65
+ seq_length = 0
66
+
67
+ if position_ids is None:
68
+ position_ids = self.position_ids[:, past_key_values_length:seq_length + past_key_values_length].clone()
69
+
70
+ if input_ids is not None:
71
+ embeddings = self.word_embeddings(input_ids)
72
+ if self.position_embedding_type == 'absolute':
73
+ position_embeddings = self.position_embeddings(position_ids)
74
+ embeddings = embeddings + position_embeddings
75
+
76
+ if query_embeds is not None:
77
+ embeddings = torch.cat((query_embeds, embeddings), dim=1)
78
+ else:
79
+ embeddings = query_embeds
80
+
81
+ embeddings = self.LayerNorm(embeddings)
82
+ embeddings = self.dropout(embeddings)
83
+ return embeddings
84
+
85
+
86
+ class BertSelfAttention(nn.Module):
87
+
88
+ def __init__(self, config, is_cross_attention):
89
+ super().__init__()
90
+ self.config = config
91
+ if config.hidden_size % config.num_attention_heads != 0 and not hasattr(config, 'embedding_size'):
92
+ raise ValueError('The hidden size (%d) is not a multiple of the number of attention '
93
+ 'heads (%d)' % (config.hidden_size, config.num_attention_heads))
94
+
95
+ self.num_attention_heads = config.num_attention_heads
96
+ self.attention_head_size = int(config.hidden_size / config.num_attention_heads)
97
+ self.all_head_size = self.num_attention_heads * self.attention_head_size
98
+
99
+ self.query = nn.Linear(config.hidden_size, self.all_head_size)
100
+ if is_cross_attention:
101
+ self.key = nn.Linear(config.encoder_width, self.all_head_size)
102
+ self.value = nn.Linear(config.encoder_width, self.all_head_size)
103
+ else:
104
+ self.key = nn.Linear(config.hidden_size, self.all_head_size)
105
+ self.value = nn.Linear(config.hidden_size, self.all_head_size)
106
+
107
+ self.dropout = nn.Dropout(config.attention_probs_dropout_prob)
108
+ self.position_embedding_type = getattr(config, 'position_embedding_type', 'absolute')
109
+ if (self.position_embedding_type == 'relative_key' or self.position_embedding_type == 'relative_key_query'):
110
+ self.max_position_embeddings = config.max_position_embeddings
111
+ self.distance_embedding = nn.Embedding(2 * config.max_position_embeddings - 1, self.attention_head_size)
112
+ self.save_attention = False
113
+
114
+ def save_attn_gradients(self, attn_gradients):
115
+ self.attn_gradients = attn_gradients
116
+
117
+ def get_attn_gradients(self):
118
+ return self.attn_gradients
119
+
120
+ def save_attention_map(self, attention_map):
121
+ self.attention_map = attention_map
122
+
123
+ def get_attention_map(self):
124
+ return self.attention_map
125
+
126
+ def transpose_for_scores(self, x):
127
+ new_x_shape = x.size()[:-1] + (
128
+ self.num_attention_heads,
129
+ self.attention_head_size,
130
+ )
131
+ x = x.view(*new_x_shape)
132
+ return x.permute(0, 2, 1, 3)
133
+
134
+ def forward(
135
+ self,
136
+ hidden_states,
137
+ attention_mask=None,
138
+ head_mask=None,
139
+ encoder_hidden_states=None,
140
+ encoder_attention_mask=None,
141
+ past_key_value=None,
142
+ output_attentions=False,
143
+ ):
144
+
145
+ # If this is instantiated as a cross-attention module, the keys
146
+ # and values come from an encoder; the attention mask needs to be
147
+ # such that the encoder's padding tokens are not attended to.
148
+ is_cross_attention = encoder_hidden_states is not None
149
+
150
+ if is_cross_attention:
151
+ key_layer = self.transpose_for_scores(self.key(encoder_hidden_states))
152
+ value_layer = self.transpose_for_scores(self.value(encoder_hidden_states))
153
+ attention_mask = encoder_attention_mask
154
+ elif past_key_value is not None:
155
+ key_layer = self.transpose_for_scores(self.key(hidden_states))
156
+ value_layer = self.transpose_for_scores(self.value(hidden_states))
157
+ key_layer = torch.cat([past_key_value[0], key_layer], dim=2)
158
+ value_layer = torch.cat([past_key_value[1], value_layer], dim=2)
159
+ else:
160
+ key_layer = self.transpose_for_scores(self.key(hidden_states))
161
+ value_layer = self.transpose_for_scores(self.value(hidden_states))
162
+
163
+ mixed_query_layer = self.query(hidden_states)
164
+
165
+ query_layer = self.transpose_for_scores(mixed_query_layer)
166
+
167
+ past_key_value = (key_layer, value_layer)
168
+
169
+ # Take the dot product between "query" and "key" to get the raw attention scores.
170
+ attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2))
171
+
172
+ if (self.position_embedding_type == 'relative_key' or self.position_embedding_type == 'relative_key_query'):
173
+ seq_length = hidden_states.size()[1]
174
+ position_ids_l = torch.arange(seq_length, dtype=torch.long, device=hidden_states.device).view(-1, 1)
175
+ position_ids_r = torch.arange(seq_length, dtype=torch.long, device=hidden_states.device).view(1, -1)
176
+ distance = position_ids_l - position_ids_r
177
+ positional_embedding = self.distance_embedding(distance + self.max_position_embeddings - 1)
178
+ positional_embedding = positional_embedding.to(dtype=query_layer.dtype) # fp16 compatibility
179
+
180
+ if self.position_embedding_type == 'relative_key':
181
+ relative_position_scores = torch.einsum('bhld,lrd->bhlr', query_layer, positional_embedding)
182
+ attention_scores = attention_scores + relative_position_scores
183
+ elif self.position_embedding_type == 'relative_key_query':
184
+ relative_position_scores_query = torch.einsum('bhld,lrd->bhlr', query_layer, positional_embedding)
185
+ relative_position_scores_key = torch.einsum('bhrd,lrd->bhlr', key_layer, positional_embedding)
186
+ attention_scores = (attention_scores + relative_position_scores_query + relative_position_scores_key)
187
+
188
+ attention_scores = attention_scores / math.sqrt(self.attention_head_size)
189
+ if attention_mask is not None:
190
+ # Apply the attention mask is (precomputed for all layers in BertModel forward() function)
191
+ attention_scores = attention_scores + attention_mask
192
+
193
+ # Normalize the attention scores to probabilities.
194
+ attention_probs = nn.Softmax(dim=-1)(attention_scores)
195
+
196
+ if is_cross_attention and self.save_attention:
197
+ self.save_attention_map(attention_probs)
198
+ attention_probs.register_hook(self.save_attn_gradients)
199
+
200
+ # This is actually dropping out entire tokens to attend to, which might
201
+ # seem a bit unusual, but is taken from the original Transformer paper.
202
+ attention_probs_dropped = self.dropout(attention_probs)
203
+
204
+ # Mask heads if we want to
205
+ if head_mask is not None:
206
+ attention_probs_dropped = attention_probs_dropped * head_mask
207
+
208
+ context_layer = torch.matmul(attention_probs_dropped, value_layer)
209
+
210
+ context_layer = context_layer.permute(0, 2, 1, 3).contiguous()
211
+ new_context_layer_shape = context_layer.size()[:-2] + (self.all_head_size, )
212
+ context_layer = context_layer.view(*new_context_layer_shape)
213
+
214
+ outputs = ((context_layer, attention_probs) if output_attentions else (context_layer, ))
215
+
216
+ outputs = outputs + (past_key_value, )
217
+ return outputs
218
+
219
+
220
+ class BertSelfOutput(nn.Module):
221
+
222
+ def __init__(self, config):
223
+ super().__init__()
224
+ self.dense = nn.Linear(config.hidden_size, config.hidden_size)
225
+ self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
226
+ self.dropout = nn.Dropout(config.hidden_dropout_prob)
227
+
228
+ def forward(self, hidden_states, input_tensor):
229
+ hidden_states = self.dense(hidden_states)
230
+ hidden_states = self.dropout(hidden_states)
231
+ hidden_states = self.LayerNorm(hidden_states + input_tensor)
232
+ return hidden_states
233
+
234
+
235
+ class BertAttention(nn.Module):
236
+
237
+ def __init__(self, config, is_cross_attention=False):
238
+ super().__init__()
239
+ self.self = BertSelfAttention(config, is_cross_attention)
240
+ self.output = BertSelfOutput(config)
241
+ self.pruned_heads = set()
242
+
243
+ def prune_heads(self, heads):
244
+ if len(heads) == 0:
245
+ return
246
+ heads, index = find_pruneable_heads_and_indices(
247
+ heads,
248
+ self.self.num_attention_heads,
249
+ self.self.attention_head_size,
250
+ self.pruned_heads,
251
+ )
252
+
253
+ # Prune linear layers
254
+ self.self.query = prune_linear_layer(self.self.query, index)
255
+ self.self.key = prune_linear_layer(self.self.key, index)
256
+ self.self.value = prune_linear_layer(self.self.value, index)
257
+ self.output.dense = prune_linear_layer(self.output.dense, index, dim=1)
258
+
259
+ # Update hyper params and store pruned heads
260
+ self.self.num_attention_heads = self.self.num_attention_heads - len(heads)
261
+ self.self.all_head_size = (self.self.attention_head_size * self.self.num_attention_heads)
262
+ self.pruned_heads = self.pruned_heads.union(heads)
263
+
264
+ def forward(
265
+ self,
266
+ hidden_states,
267
+ attention_mask=None,
268
+ head_mask=None,
269
+ encoder_hidden_states=None,
270
+ encoder_attention_mask=None,
271
+ past_key_value=None,
272
+ output_attentions=False,
273
+ ):
274
+ self_outputs = self.self(
275
+ hidden_states,
276
+ attention_mask,
277
+ head_mask,
278
+ encoder_hidden_states,
279
+ encoder_attention_mask,
280
+ past_key_value,
281
+ output_attentions,
282
+ )
283
+ attention_output = self.output(self_outputs[0], hidden_states)
284
+
285
+ outputs = (attention_output, ) + self_outputs[1:] # add attentions if we output them
286
+ return outputs
287
+
288
+
289
+ class BertIntermediate(nn.Module):
290
+
291
+ def __init__(self, config):
292
+ super().__init__()
293
+ self.dense = nn.Linear(config.hidden_size, config.intermediate_size)
294
+ if isinstance(config.hidden_act, str):
295
+ self.intermediate_act_fn = ACT2FN[config.hidden_act]
296
+ else:
297
+ self.intermediate_act_fn = config.hidden_act
298
+
299
+ def forward(self, hidden_states):
300
+ hidden_states = self.dense(hidden_states)
301
+ hidden_states = self.intermediate_act_fn(hidden_states)
302
+ return hidden_states
303
+
304
+
305
+ class BertOutput(nn.Module):
306
+
307
+ def __init__(self, config):
308
+ super().__init__()
309
+ self.dense = nn.Linear(config.intermediate_size, config.hidden_size)
310
+ self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
311
+ self.dropout = nn.Dropout(config.hidden_dropout_prob)
312
+
313
+ def forward(self, hidden_states, input_tensor):
314
+ hidden_states = self.dense(hidden_states)
315
+ hidden_states = self.dropout(hidden_states)
316
+ hidden_states = self.LayerNorm(hidden_states + input_tensor)
317
+ return hidden_states
318
+
319
+
320
+ class BertLayer(nn.Module):
321
+
322
+ def __init__(self, config, layer_num):
323
+ super().__init__()
324
+ self.config = config
325
+ self.chunk_size_feed_forward = config.chunk_size_feed_forward
326
+ self.seq_len_dim = 1
327
+ self.attention = BertAttention(config)
328
+ self.layer_num = layer_num
329
+ if (self.config.add_cross_attention and layer_num % self.config.cross_attention_freq == 0):
330
+ self.crossattention = BertAttention(config, is_cross_attention=self.config.add_cross_attention)
331
+ self.has_cross_attention = True
332
+ else:
333
+ self.has_cross_attention = False
334
+ self.intermediate = BertIntermediate(config)
335
+ self.output = BertOutput(config)
336
+
337
+ self.intermediate_query = BertIntermediate(config)
338
+ self.output_query = BertOutput(config)
339
+
340
+ def forward(
341
+ self,
342
+ hidden_states,
343
+ attention_mask=None,
344
+ head_mask=None,
345
+ encoder_hidden_states=None,
346
+ encoder_attention_mask=None,
347
+ past_key_value=None,
348
+ output_attentions=False,
349
+ query_length=0,
350
+ ):
351
+ # decoder uni-directional self-attention cached key/values tuple is at positions 1,2
352
+ self_attn_past_key_value = (past_key_value[:2] if past_key_value is not None else None)
353
+ self_attention_outputs = self.attention(
354
+ hidden_states,
355
+ attention_mask,
356
+ head_mask,
357
+ output_attentions=output_attentions,
358
+ past_key_value=self_attn_past_key_value,
359
+ )
360
+ attention_output = self_attention_outputs[0]
361
+ outputs = self_attention_outputs[1:-1]
362
+
363
+ present_key_value = self_attention_outputs[-1]
364
+
365
+ if query_length > 0:
366
+ query_attention_output = attention_output[:, :query_length, :]
367
+
368
+ if self.has_cross_attention:
369
+ assert (encoder_hidden_states
370
+ is not None), 'encoder_hidden_states must be given for cross-attention layers'
371
+ cross_attention_outputs = self.crossattention(
372
+ query_attention_output,
373
+ attention_mask,
374
+ head_mask,
375
+ encoder_hidden_states,
376
+ encoder_attention_mask,
377
+ output_attentions=output_attentions,
378
+ )
379
+ query_attention_output = cross_attention_outputs[0]
380
+ outputs = (outputs + cross_attention_outputs[1:-1]
381
+ ) # add cross attentions if we output attention weights
382
+
383
+ layer_output = apply_chunking_to_forward(
384
+ self.feed_forward_chunk_query,
385
+ self.chunk_size_feed_forward,
386
+ self.seq_len_dim,
387
+ query_attention_output,
388
+ )
389
+ if attention_output.shape[1] > query_length:
390
+ layer_output_text = apply_chunking_to_forward(
391
+ self.feed_forward_chunk,
392
+ self.chunk_size_feed_forward,
393
+ self.seq_len_dim,
394
+ attention_output[:, query_length:, :],
395
+ )
396
+ layer_output = torch.cat([layer_output, layer_output_text], dim=1)
397
+ else:
398
+ layer_output = apply_chunking_to_forward(
399
+ self.feed_forward_chunk,
400
+ self.chunk_size_feed_forward,
401
+ self.seq_len_dim,
402
+ attention_output,
403
+ )
404
+ outputs = (layer_output, ) + outputs
405
+
406
+ outputs = outputs + (present_key_value, )
407
+
408
+ return outputs
409
+
410
+ def feed_forward_chunk(self, attention_output):
411
+ intermediate_output = self.intermediate(attention_output)
412
+ layer_output = self.output(intermediate_output, attention_output)
413
+ return layer_output
414
+
415
+ def feed_forward_chunk_query(self, attention_output):
416
+ intermediate_output = self.intermediate_query(attention_output)
417
+ layer_output = self.output_query(intermediate_output, attention_output)
418
+ return layer_output
419
+
420
+
421
+ class BertEncoder(nn.Module):
422
+
423
+ def __init__(self, config):
424
+ super().__init__()
425
+ self.config = config
426
+ self.layer = nn.ModuleList([BertLayer(config, i) for i in range(config.num_hidden_layers)])
427
+
428
+ def forward(
429
+ self,
430
+ hidden_states,
431
+ attention_mask=None,
432
+ head_mask=None,
433
+ encoder_hidden_states=None,
434
+ encoder_attention_mask=None,
435
+ past_key_values=None,
436
+ use_cache=None,
437
+ output_attentions=False,
438
+ output_hidden_states=False,
439
+ return_dict=True,
440
+ query_length=0,
441
+ ):
442
+ all_hidden_states = () if output_hidden_states else None
443
+ all_self_attentions = () if output_attentions else None
444
+ all_cross_attentions = (() if output_attentions and self.config.add_cross_attention else None)
445
+
446
+ next_decoder_cache = () if use_cache else None
447
+
448
+ for i in range(self.config.num_hidden_layers):
449
+ layer_module = self.layer[i]
450
+ if output_hidden_states:
451
+ all_hidden_states = all_hidden_states + (hidden_states, )
452
+
453
+ layer_head_mask = head_mask[i] if head_mask is not None else None
454
+ past_key_value = past_key_values[i] if past_key_values is not None else None
455
+
456
+ if getattr(self.config, 'gradient_checkpointing', False) and self.training:
457
+
458
+ if use_cache:
459
+ logger.warn(
460
+ '`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`...')
461
+ use_cache = False
462
+
463
+ def create_custom_forward(module):
464
+
465
+ def custom_forward(*inputs):
466
+ return module(*inputs, past_key_value, output_attentions, query_length)
467
+
468
+ return custom_forward
469
+
470
+ layer_outputs = torch.utils.checkpoint.checkpoint(
471
+ create_custom_forward(layer_module),
472
+ hidden_states,
473
+ attention_mask,
474
+ layer_head_mask,
475
+ encoder_hidden_states,
476
+ encoder_attention_mask,
477
+ )
478
+ else:
479
+ layer_outputs = layer_module(
480
+ hidden_states,
481
+ attention_mask,
482
+ layer_head_mask,
483
+ encoder_hidden_states,
484
+ encoder_attention_mask,
485
+ past_key_value,
486
+ output_attentions,
487
+ query_length,
488
+ )
489
+
490
+ hidden_states = layer_outputs[0]
491
+ if use_cache:
492
+ next_decoder_cache += (layer_outputs[-1], )
493
+ if output_attentions:
494
+ all_self_attentions = all_self_attentions + (layer_outputs[1], )
495
+ all_cross_attentions = all_cross_attentions + (layer_outputs[2], )
496
+
497
+ if output_hidden_states:
498
+ all_hidden_states = all_hidden_states + (hidden_states, )
499
+
500
+ if not return_dict:
501
+ return tuple(v for v in [
502
+ hidden_states,
503
+ next_decoder_cache,
504
+ all_hidden_states,
505
+ all_self_attentions,
506
+ all_cross_attentions,
507
+ ] if v is not None)
508
+ return BaseModelOutputWithPastAndCrossAttentions(
509
+ last_hidden_state=hidden_states,
510
+ past_key_values=next_decoder_cache,
511
+ hidden_states=all_hidden_states,
512
+ attentions=all_self_attentions,
513
+ cross_attentions=all_cross_attentions,
514
+ )
515
+
516
+
517
+ class BertPooler(nn.Module):
518
+
519
+ def __init__(self, config):
520
+ super().__init__()
521
+ self.dense = nn.Linear(config.hidden_size, config.hidden_size)
522
+ self.activation = nn.Tanh()
523
+
524
+ def forward(self, hidden_states):
525
+ # We "pool" the model by simply taking the hidden state corresponding
526
+ # to the first token.
527
+ first_token_tensor = hidden_states[:, 0]
528
+ pooled_output = self.dense(first_token_tensor)
529
+ pooled_output = self.activation(pooled_output)
530
+ return pooled_output
531
+
532
+
533
+ class BertPredictionHeadTransform(nn.Module):
534
+
535
+ def __init__(self, config):
536
+ super().__init__()
537
+ self.dense = nn.Linear(config.hidden_size, config.hidden_size)
538
+ if isinstance(config.hidden_act, str):
539
+ self.transform_act_fn = ACT2FN[config.hidden_act]
540
+ else:
541
+ self.transform_act_fn = config.hidden_act
542
+ self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
543
+
544
+ def forward(self, hidden_states):
545
+ hidden_states = self.dense(hidden_states)
546
+ hidden_states = self.transform_act_fn(hidden_states)
547
+ hidden_states = self.LayerNorm(hidden_states)
548
+ return hidden_states
549
+
550
+
551
+ class BertLMPredictionHead(nn.Module):
552
+
553
+ def __init__(self, config):
554
+ super().__init__()
555
+ self.transform = BertPredictionHeadTransform(config)
556
+
557
+ # The output weights are the same as the input embeddings, but there is
558
+ # an output-only bias for each token.
559
+ self.decoder = nn.Linear(config.hidden_size, config.vocab_size, bias=False)
560
+
561
+ self.bias = nn.Parameter(torch.zeros(config.vocab_size))
562
+
563
+ # Need a link between the two variables so that the bias is correctly resized with `resize_token_embeddings`
564
+ self.decoder.bias = self.bias
565
+
566
+ def forward(self, hidden_states):
567
+ hidden_states = self.transform(hidden_states)
568
+ hidden_states = self.decoder(hidden_states)
569
+ return hidden_states
570
+
571
+
572
+ class BertOnlyMLMHead(nn.Module):
573
+
574
+ def __init__(self, config):
575
+ super().__init__()
576
+ self.predictions = BertLMPredictionHead(config)
577
+
578
+ def forward(self, sequence_output):
579
+ prediction_scores = self.predictions(sequence_output)
580
+ return prediction_scores
581
+
582
+
583
+ class BertPreTrainedModel(PreTrainedModel):
584
+ """
585
+ An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained
586
+ models.
587
+ """
588
+
589
+ config_class = BertConfig
590
+ base_model_prefix = 'bert'
591
+ _keys_to_ignore_on_load_missing = [r'position_ids']
592
+
593
+ def _init_weights(self, module):
594
+ """Initialize the weights"""
595
+ if isinstance(module, (nn.Linear, nn.Embedding)):
596
+ # Slightly different from the TF version which uses truncated_normal for initialization
597
+ # cf https://github.com/pytorch/pytorch/pull/5617
598
+ module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
599
+ elif isinstance(module, nn.LayerNorm):
600
+ module.bias.data.zero_()
601
+ module.weight.data.fill_(1.0)
602
+ if isinstance(module, nn.Linear) and module.bias is not None:
603
+ module.bias.data.zero_()
604
+
605
+
606
+ class BertModel(BertPreTrainedModel):
607
+ """
608
+ The model can behave as an encoder (with only self-attention) as well as a decoder, in which case a layer of
609
+ cross-attention is added between the self-attention layers, following the architecture described in `Attention is
610
+ all you need <https://arxiv.org/abs/1706.03762>`__ by Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit,
611
+ Llion Jones, Aidan N. Gomez, Lukasz Kaiser and Illia Polosukhin.
612
+ argument and :obj:`add_cross_attention` set to :obj:`True`; an :obj:`encoder_hidden_states` is then expected as an
613
+ input to the forward pass.
614
+ """
615
+
616
+ def __init__(self, config, add_pooling_layer=False):
617
+ super().__init__(config)
618
+ self.config = config
619
+
620
+ self.embeddings = BertEmbeddings(config)
621
+
622
+ self.encoder = BertEncoder(config)
623
+
624
+ self.pooler = BertPooler(config) if add_pooling_layer else None
625
+
626
+ self.init_weights()
627
+
628
+ def get_input_embeddings(self):
629
+ return self.embeddings.word_embeddings
630
+
631
+ def set_input_embeddings(self, value):
632
+ self.embeddings.word_embeddings = value
633
+
634
+ def _prune_heads(self, heads_to_prune):
635
+ """
636
+ Prunes heads of the model. heads_to_prune: dict of {layer_num: list of heads to prune in this layer} See base
637
+ class PreTrainedModel
638
+ """
639
+ for layer, heads in heads_to_prune.items():
640
+ self.encoder.layer[layer].attention.prune_heads(heads)
641
+
642
+ def get_extended_attention_mask(
643
+ self,
644
+ attention_mask: Tensor,
645
+ input_shape: Tuple[int],
646
+ device: device,
647
+ is_decoder: bool,
648
+ has_query: bool = False,
649
+ ) -> Tensor:
650
+ """
651
+ Makes broadcastable attention and causal masks so that future and masked tokens are ignored.
652
+
653
+ Arguments:
654
+ attention_mask (:obj:`torch.Tensor`):
655
+ Mask with ones indicating tokens to attend to, zeros for tokens to ignore.
656
+ input_shape (:obj:`Tuple[int]`):
657
+ The shape of the input to the model.
658
+ device: (:obj:`torch.device`):
659
+ The device of the input to the model.
660
+
661
+ Returns:
662
+ :obj:`torch.Tensor` The extended attention mask, with a the same dtype as :obj:`attention_mask.dtype`.
663
+ """
664
+ # We can provide a self-attention mask of dimensions [batch_size, from_seq_length, to_seq_length]
665
+ # ourselves in which case we just need to make it broadcastable to all heads.
666
+ if attention_mask.dim() == 3:
667
+ extended_attention_mask = attention_mask[:, None, :, :]
668
+ elif attention_mask.dim() == 2:
669
+ # Provided a padding mask of dimensions [batch_size, seq_length]
670
+ # - if the model is a decoder, apply a causal mask in addition to the padding mask
671
+ # - if the model is an encoder, make the mask broadcastable to [batch_size, num_heads, seq_length, seq_length]
672
+ if is_decoder:
673
+ batch_size, seq_length = input_shape
674
+
675
+ seq_ids = torch.arange(seq_length, device=device)
676
+ causal_mask = (seq_ids[None, None, :].repeat(batch_size, seq_length, 1) <= seq_ids[None, :, None])
677
+
678
+ # add a prefix ones mask to the causal mask
679
+ # causal and attention masks must have same type with pytorch version < 1.3
680
+ causal_mask = causal_mask.to(attention_mask.dtype)
681
+
682
+ if causal_mask.shape[1] < attention_mask.shape[1]:
683
+ prefix_seq_len = attention_mask.shape[1] - causal_mask.shape[1]
684
+ if has_query: # UniLM style attention mask
685
+ causal_mask = torch.cat(
686
+ [
687
+ torch.zeros(
688
+ (batch_size, prefix_seq_len, seq_length),
689
+ device=device,
690
+ dtype=causal_mask.dtype,
691
+ ),
692
+ causal_mask,
693
+ ],
694
+ axis=1,
695
+ )
696
+ causal_mask = torch.cat(
697
+ [
698
+ torch.ones(
699
+ (batch_size, causal_mask.shape[1], prefix_seq_len),
700
+ device=device,
701
+ dtype=causal_mask.dtype,
702
+ ),
703
+ causal_mask,
704
+ ],
705
+ axis=-1,
706
+ )
707
+ extended_attention_mask = (causal_mask[:, None, :, :] * attention_mask[:, None, None, :])
708
+ else:
709
+ extended_attention_mask = attention_mask[:, None, None, :]
710
+ else:
711
+ raise ValueError('Wrong shape for input_ids (shape {}) or attention_mask (shape {})'.format(
712
+ input_shape, attention_mask.shape))
713
+
714
+ # Since attention_mask is 1.0 for positions we want to attend and 0.0 for
715
+ # masked positions, this operation will create a tensor which is 0.0 for
716
+ # positions we want to attend and -10000.0 for masked positions.
717
+ # Since we are adding it to the raw scores before the softmax, this is
718
+ # effectively the same as removing these entirely.
719
+ extended_attention_mask = extended_attention_mask.to(dtype=self.dtype) # fp16 compatibility
720
+ extended_attention_mask = (1.0 - extended_attention_mask) * -10000.0
721
+ return extended_attention_mask
722
+
723
+ def forward(
724
+ self,
725
+ input_ids=None,
726
+ attention_mask=None,
727
+ position_ids=None,
728
+ head_mask=None,
729
+ query_embeds=None,
730
+ encoder_hidden_states=None,
731
+ encoder_attention_mask=None,
732
+ past_key_values=None,
733
+ use_cache=None,
734
+ output_attentions=None,
735
+ output_hidden_states=None,
736
+ return_dict=None,
737
+ is_decoder=False,
738
+ ):
739
+ r"""
740
+ encoder_hidden_states (:obj:`torch.FloatTensor` of shape :obj:`(batch_size, sequence_length, hidden_size)`, `optional`):
741
+ Sequence of hidden-states at the output of the last layer of the encoder. Used in the cross-attention if
742
+ the model is configured as a decoder.
743
+ encoder_attention_mask (:obj:`torch.FloatTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
744
+ Mask to avoid performing attention on the padding token indices of the encoder input. This mask is used in
745
+ the cross-attention if the model is configured as a decoder. Mask values selected in ``[0, 1]``:
746
+ - 1 for tokens that are **not masked**,
747
+ - 0 for tokens that are **masked**.
748
+ past_key_values (:obj:`tuple(tuple(torch.FloatTensor))` of length :obj:`config.n_layers` with each tuple having 4 tensors of shape :obj:`(batch_size, num_heads, sequence_length - 1, embed_size_per_head)`):
749
+ Contains precomputed key and value hidden states of the attention blocks. Can be used to speed up decoding.
750
+ If :obj:`past_key_values` are used, the user can optionally input only the last :obj:`decoder_input_ids`
751
+ (those that don't have their past key value states given to this model) of shape :obj:`(batch_size, 1)`
752
+ instead of all :obj:`decoder_input_ids` of shape :obj:`(batch_size, sequence_length)`.
753
+ use_cache (:obj:`bool`, `optional`):
754
+ If set to :obj:`True`, :obj:`past_key_values` key value states are returned and can be used to speed up
755
+ decoding (see :obj:`past_key_values`).
756
+ """
757
+ output_attentions = (output_attentions if output_attentions is not None else self.config.output_attentions)
758
+ output_hidden_states = (
759
+ output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states)
760
+ return_dict = (return_dict if return_dict is not None else self.config.use_return_dict)
761
+
762
+ # use_cache = use_cache if use_cache is not None else self.config.use_cache
763
+
764
+ if input_ids is None:
765
+ assert (query_embeds is not None), 'You have to specify query_embeds when input_ids is None'
766
+
767
+ # past_key_values_length
768
+ past_key_values_length = (
769
+ past_key_values[0][0].shape[2] - self.config.query_length if past_key_values is not None else 0)
770
+
771
+ query_length = query_embeds.shape[1] if query_embeds is not None else 0
772
+
773
+ embedding_output = self.embeddings(
774
+ input_ids=input_ids,
775
+ position_ids=position_ids,
776
+ query_embeds=query_embeds,
777
+ past_key_values_length=past_key_values_length,
778
+ )
779
+
780
+ input_shape = embedding_output.size()[:-1]
781
+ batch_size, seq_length = input_shape
782
+ device = embedding_output.device
783
+
784
+ if attention_mask is None:
785
+ attention_mask = torch.ones(((batch_size, seq_length + past_key_values_length)), device=device)
786
+
787
+ # We can provide a self-attention mask of dimensions [batch_size, from_seq_length, to_seq_length]
788
+ # ourselves in which case we just need to make it broadcastable to all heads.
789
+ if is_decoder:
790
+ extended_attention_mask = self.get_extended_attention_mask(
791
+ attention_mask,
792
+ input_ids.shape,
793
+ device,
794
+ is_decoder,
795
+ has_query=(query_embeds is not None),
796
+ )
797
+ else:
798
+ extended_attention_mask = self.get_extended_attention_mask(attention_mask, input_shape, device, is_decoder)
799
+
800
+ # If a 2D or 3D attention mask is provided for the cross-attention
801
+ # we need to make broadcastable to [batch_size, num_heads, seq_length, seq_length]
802
+ if encoder_hidden_states is not None:
803
+ if type(encoder_hidden_states) == list:
804
+ encoder_batch_size, encoder_sequence_length, _ = encoder_hidden_states[0].size()
805
+ else:
806
+ (
807
+ encoder_batch_size,
808
+ encoder_sequence_length,
809
+ _,
810
+ ) = encoder_hidden_states.size()
811
+ encoder_hidden_shape = (encoder_batch_size, encoder_sequence_length)
812
+
813
+ if type(encoder_attention_mask) == list:
814
+ encoder_extended_attention_mask = [self.invert_attention_mask(mask) for mask in encoder_attention_mask]
815
+ elif encoder_attention_mask is None:
816
+ encoder_attention_mask = torch.ones(encoder_hidden_shape, device=device)
817
+ encoder_extended_attention_mask = self.invert_attention_mask(encoder_attention_mask)
818
+ else:
819
+ encoder_extended_attention_mask = self.invert_attention_mask(encoder_attention_mask)
820
+ else:
821
+ encoder_extended_attention_mask = None
822
+
823
+ # Prepare head mask if needed
824
+ # 1.0 in head_mask indicate we keep the head
825
+ # attention_probs has shape bsz x n_heads x N x N
826
+ # input head_mask has shape [num_heads] or [num_hidden_layers x num_heads]
827
+ # and head_mask is converted to shape [num_hidden_layers x batch x num_heads x seq_length x seq_length]
828
+ head_mask = self.get_head_mask(head_mask, self.config.num_hidden_layers)
829
+
830
+ encoder_outputs = self.encoder(
831
+ embedding_output,
832
+ attention_mask=extended_attention_mask,
833
+ head_mask=head_mask,
834
+ encoder_hidden_states=encoder_hidden_states,
835
+ encoder_attention_mask=encoder_extended_attention_mask,
836
+ past_key_values=past_key_values,
837
+ use_cache=use_cache,
838
+ output_attentions=output_attentions,
839
+ output_hidden_states=output_hidden_states,
840
+ return_dict=return_dict,
841
+ query_length=query_length,
842
+ )
843
+ sequence_output = encoder_outputs[0]
844
+ pooled_output = (self.pooler(sequence_output) if self.pooler is not None else None)
845
+
846
+ if not return_dict:
847
+ return (sequence_output, pooled_output) + encoder_outputs[1:]
848
+
849
+ return BaseModelOutputWithPoolingAndCrossAttentions(
850
+ last_hidden_state=sequence_output,
851
+ pooler_output=pooled_output,
852
+ past_key_values=encoder_outputs.past_key_values,
853
+ hidden_states=encoder_outputs.hidden_states,
854
+ attentions=encoder_outputs.attentions,
855
+ cross_attentions=encoder_outputs.cross_attentions,
856
+ )
857
+
858
+
859
+ class BertLMHeadModel(BertPreTrainedModel):
860
+
861
+ _keys_to_ignore_on_load_unexpected = [r'pooler']
862
+ _keys_to_ignore_on_load_missing = [r'position_ids', r'predictions.decoder.bias']
863
+
864
+ def __init__(self, config):
865
+ super().__init__(config)
866
+
867
+ self.bert = BertModel(config, add_pooling_layer=False)
868
+ self.cls = BertOnlyMLMHead(config)
869
+
870
+ self.init_weights()
871
+
872
+ def get_output_embeddings(self):
873
+ return self.cls.predictions.decoder
874
+
875
+ def set_output_embeddings(self, new_embeddings):
876
+ self.cls.predictions.decoder = new_embeddings
877
+
878
+ def forward(
879
+ self,
880
+ input_ids=None,
881
+ attention_mask=None,
882
+ position_ids=None,
883
+ head_mask=None,
884
+ query_embeds=None,
885
+ encoder_hidden_states=None,
886
+ encoder_attention_mask=None,
887
+ labels=None,
888
+ past_key_values=None,
889
+ use_cache=True,
890
+ output_attentions=None,
891
+ output_hidden_states=None,
892
+ return_dict=None,
893
+ return_logits=False,
894
+ is_decoder=True,
895
+ reduction='mean',
896
+ ):
897
+ r"""
898
+ encoder_hidden_states (:obj:`torch.FloatTensor` of shape :obj:`(batch_size, sequence_length, hidden_size)`, `optional`):
899
+ Sequence of hidden-states at the output of the last layer of the encoder. Used in the cross-attention if
900
+ the model is configured as a decoder.
901
+ encoder_attention_mask (:obj:`torch.FloatTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
902
+ Mask to avoid performing attention on the padding token indices of the encoder input. This mask is used in
903
+ the cross-attention if the model is configured as a decoder. Mask values selected in ``[0, 1]``:
904
+ - 1 for tokens that are **not masked**,
905
+ - 0 for tokens that are **masked**.
906
+ labels (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
907
+ Labels for computing the left-to-right language modeling loss (next word prediction). Indices should be in
908
+ ``[-100, 0, ..., config.vocab_size]`` (see ``input_ids`` docstring) Tokens with indices set to ``-100`` are
909
+ ignored (masked), the loss is only computed for the tokens with labels n ``[0, ..., config.vocab_size]``
910
+ past_key_values (:obj:`tuple(tuple(torch.FloatTensor))` of length :obj:`config.n_layers` with each tuple having 4 tensors of shape :obj:`(batch_size, num_heads, sequence_length - 1, embed_size_per_head)`):
911
+ Contains precomputed key and value hidden states of the attention blocks. Can be used to speed up decoding.
912
+ If :obj:`past_key_values` are used, the user can optionally input only the last :obj:`decoder_input_ids`
913
+ (those that don't have their past key value states given to this model) of shape :obj:`(batch_size, 1)`
914
+ instead of all :obj:`decoder_input_ids` of shape :obj:`(batch_size, sequence_length)`.
915
+ use_cache (:obj:`bool`, `optional`):
916
+ If set to :obj:`True`, :obj:`past_key_values` key value states are returned and can be used to speed up
917
+ decoding (see :obj:`past_key_values`).
918
+ Returns:
919
+ Example::
920
+ >>> from transformers import BertTokenizer, BertLMHeadModel, BertConfig
921
+ >>> import torch
922
+ >>> tokenizer = BertTokenizer.from_pretrained('bert-base-cased')
923
+ >>> config = BertConfig.from_pretrained("bert-base-cased")
924
+ >>> model = BertLMHeadModel.from_pretrained('bert-base-cased', config=config)
925
+ >>> inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
926
+ >>> outputs = model(**inputs)
927
+ >>> prediction_logits = outputs.logits
928
+ """
929
+ return_dict = (return_dict if return_dict is not None else self.config.use_return_dict)
930
+ if labels is not None:
931
+ use_cache = False
932
+ if past_key_values is not None:
933
+ query_embeds = None
934
+
935
+ outputs = self.bert(
936
+ input_ids,
937
+ attention_mask=attention_mask,
938
+ position_ids=position_ids,
939
+ head_mask=head_mask,
940
+ query_embeds=query_embeds,
941
+ encoder_hidden_states=encoder_hidden_states,
942
+ encoder_attention_mask=encoder_attention_mask,
943
+ past_key_values=past_key_values,
944
+ use_cache=use_cache,
945
+ output_attentions=output_attentions,
946
+ output_hidden_states=output_hidden_states,
947
+ return_dict=return_dict,
948
+ is_decoder=is_decoder,
949
+ )
950
+
951
+ sequence_output = outputs[0]
952
+ if query_embeds is not None:
953
+ sequence_output = outputs[0][:, query_embeds.shape[1]:, :]
954
+
955
+ prediction_scores = self.cls(sequence_output)
956
+
957
+ if return_logits:
958
+ return prediction_scores[:, :-1, :].contiguous()
959
+
960
+ lm_loss = None
961
+ if labels is not None:
962
+ # we are doing next-token prediction; shift prediction scores and input ids by one
963
+ shifted_prediction_scores = prediction_scores[:, :-1, :].contiguous()
964
+ labels = labels[:, 1:].contiguous()
965
+ loss_fct = CrossEntropyLoss(reduction=reduction, label_smoothing=0.1)
966
+ lm_loss = loss_fct(
967
+ shifted_prediction_scores.view(-1, self.config.vocab_size),
968
+ labels.view(-1),
969
+ )
970
+ if reduction == 'none':
971
+ lm_loss = lm_loss.view(prediction_scores.size(0), -1).sum(1)
972
+
973
+ if not return_dict:
974
+ output = (prediction_scores, ) + outputs[2:]
975
+ return ((lm_loss, ) + output) if lm_loss is not None else output
976
+
977
+ return CausalLMOutputWithCrossAttentions(
978
+ loss=lm_loss,
979
+ logits=prediction_scores,
980
+ past_key_values=outputs.past_key_values,
981
+ hidden_states=outputs.hidden_states,
982
+ attentions=outputs.attentions,
983
+ cross_attentions=outputs.cross_attentions,
984
+ )
985
+
986
+ def prepare_inputs_for_generation(self, input_ids, query_embeds, past=None, attention_mask=None, **model_kwargs):
987
+ # if model is used as a decoder in encoder-decoder model, the decoder attention mask is created on the fly
988
+ if attention_mask is None:
989
+ attention_mask = input_ids.new_ones(input_ids.shape)
990
+ query_mask = input_ids.new_ones(query_embeds.shape[:-1])
991
+ attention_mask = torch.cat([query_mask, attention_mask], dim=-1)
992
+
993
+ # cut decoder_input_ids if past is used
994
+ if past is not None:
995
+ input_ids = input_ids[:, -1:]
996
+
997
+ return {
998
+ 'input_ids': input_ids,
999
+ 'query_embeds': query_embeds,
1000
+ 'attention_mask': attention_mask,
1001
+ 'past_key_values': past,
1002
+ 'encoder_hidden_states': model_kwargs.get('encoder_hidden_states', None),
1003
+ 'encoder_attention_mask': model_kwargs.get('encoder_attention_mask', None),
1004
+ 'is_decoder': True,
1005
+ }
1006
+
1007
+ def _reorder_cache(self, past, beam_idx):
1008
+ reordered_past = ()
1009
+ for layer_past in past:
1010
+ reordered_past += (tuple(past_state.index_select(0, beam_idx) for past_state in layer_past), )
1011
+ return reordered_past
1012
+
1013
+
1014
+ class BertForMaskedLM(BertPreTrainedModel):
1015
+
1016
+ _keys_to_ignore_on_load_unexpected = [r'pooler']
1017
+ _keys_to_ignore_on_load_missing = [r'position_ids', r'predictions.decoder.bias']
1018
+
1019
+ def __init__(self, config):
1020
+ super().__init__(config)
1021
+
1022
+ self.bert = BertModel(config, add_pooling_layer=False)
1023
+ self.cls = BertOnlyMLMHead(config)
1024
+
1025
+ self.init_weights()
1026
+
1027
+ def get_output_embeddings(self):
1028
+ return self.cls.predictions.decoder
1029
+
1030
+ def set_output_embeddings(self, new_embeddings):
1031
+ self.cls.predictions.decoder = new_embeddings
1032
+
1033
+ def forward(
1034
+ self,
1035
+ input_ids=None,
1036
+ attention_mask=None,
1037
+ position_ids=None,
1038
+ head_mask=None,
1039
+ query_embeds=None,
1040
+ encoder_hidden_states=None,
1041
+ encoder_attention_mask=None,
1042
+ labels=None,
1043
+ output_attentions=None,
1044
+ output_hidden_states=None,
1045
+ return_dict=None,
1046
+ return_logits=False,
1047
+ is_decoder=False,
1048
+ ):
1049
+ r"""
1050
+ labels (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
1051
+ Labels for computing the masked language modeling loss. Indices should be in ``[-100, 0, ...,
1052
+ config.vocab_size]`` (see ``input_ids`` docstring) Tokens with indices set to ``-100`` are ignored
1053
+ (masked), the loss is only computed for the tokens with labels in ``[0, ..., config.vocab_size]``
1054
+ """
1055
+
1056
+ return_dict = (return_dict if return_dict is not None else self.config.use_return_dict)
1057
+
1058
+ outputs = self.bert(
1059
+ input_ids,
1060
+ attention_mask=attention_mask,
1061
+ position_ids=position_ids,
1062
+ head_mask=head_mask,
1063
+ query_embeds=query_embeds,
1064
+ encoder_hidden_states=encoder_hidden_states,
1065
+ encoder_attention_mask=encoder_attention_mask,
1066
+ output_attentions=output_attentions,
1067
+ output_hidden_states=output_hidden_states,
1068
+ return_dict=return_dict,
1069
+ is_decoder=is_decoder,
1070
+ )
1071
+
1072
+ if query_embeds is not None:
1073
+ sequence_output = outputs[0][:, query_embeds.shape[1]:, :]
1074
+ prediction_scores = self.cls(sequence_output)
1075
+
1076
+ if return_logits:
1077
+ return prediction_scores
1078
+
1079
+ masked_lm_loss = None
1080
+ if labels is not None:
1081
+ loss_fct = CrossEntropyLoss() # -100 index = padding token
1082
+ masked_lm_loss = loss_fct(prediction_scores.view(-1, self.config.vocab_size), labels.view(-1))
1083
+
1084
+ if not return_dict:
1085
+ output = (prediction_scores, ) + outputs[2:]
1086
+ return (((masked_lm_loss, ) + output) if masked_lm_loss is not None else output)
1087
+
1088
+ return MaskedLMOutput(
1089
+ loss=masked_lm_loss,
1090
+ logits=prediction_scores,
1091
+ hidden_states=outputs.hidden_states,
1092
+ attentions=outputs.attentions,
1093
+ )