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,371 @@
1
+ """
2
+ Copyright (c) 2022, salesforce.com, inc.
3
+ All rights reserved.
4
+ SPDX-License-Identifier: BSD-3-Clause
5
+ For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ """
7
+
8
+ import torch
9
+ import torch.nn.functional as F
10
+ from copy import deepcopy
11
+ from torch import nn
12
+
13
+ from ...common.registry import registry
14
+ from ..base_model import MomentumDistilationMixin, SharedQueueMixin
15
+ from ..med import XBertEncoder, XBertLMHeadDecoder
16
+ from ..vit import VisionTransformerEncoder
17
+ from . import tie_encoder_decoder_weights
18
+ from .blip import BlipBase
19
+ from .blip_outputs import BlipIntermediateOutput, BlipOutput, BlipSimilarity
20
+
21
+
22
+ @registry.register_model('blip_pretrain')
23
+ class BlipPretrain(BlipBase, SharedQueueMixin, MomentumDistilationMixin):
24
+ """
25
+ BLIP pretrain model.
26
+
27
+ Supported model types:
28
+ - base: BLIP base model before pretraining.
29
+ """
30
+
31
+ PRETRAINED_MODEL_CONFIG_DICT = {
32
+ 'base': 'configs/models/blip_pretrain_base.yaml',
33
+ # "large": "configs/models/blip_pretrain_large.yaml",
34
+ }
35
+
36
+ def __init__(
37
+ self,
38
+ image_encoder,
39
+ text_encoder,
40
+ text_decoder,
41
+ queue_size,
42
+ alpha=0.4,
43
+ embed_dim=256,
44
+ momentum=0.995,
45
+ tie_enc_dec_weights=True,
46
+ max_txt_len=30,
47
+ ):
48
+ super().__init__()
49
+
50
+ self.tokenizer = self.init_tokenizer()
51
+
52
+ text_encoder.resize_token_embeddings(len(self.tokenizer))
53
+ text_decoder.resize_token_embeddings(len(self.tokenizer))
54
+
55
+ if tie_enc_dec_weights:
56
+ tie_encoder_decoder_weights(
57
+ encoder=text_encoder,
58
+ decoder=text_decoder.bert,
59
+ base_model_prefix='',
60
+ skip_key='/attention',
61
+ )
62
+
63
+ self.visual_encoder = image_encoder
64
+
65
+ self.text_encoder = text_encoder
66
+ self.text_decoder = text_decoder
67
+
68
+ # creating projection layers for ITC
69
+ text_width = text_encoder.config.hidden_size
70
+ vision_width = image_encoder.vision_width
71
+
72
+ self.vision_proj = nn.Linear(vision_width, embed_dim)
73
+ self.text_proj = nn.Linear(text_width, embed_dim)
74
+
75
+ self.itm_head = nn.Linear(text_width, 2)
76
+
77
+ # create the momentum encoder
78
+ self.visual_encoder_m = deepcopy(self.visual_encoder)
79
+ self.text_encoder_m = deepcopy(self.text_encoder)
80
+
81
+ self.vision_proj_m = deepcopy(self.vision_proj)
82
+ self.text_proj_m = deepcopy(self.text_proj)
83
+
84
+ self.model_pairs = [
85
+ [self.visual_encoder, self.visual_encoder_m],
86
+ [self.text_encoder, self.text_encoder_m],
87
+ [self.vision_proj, self.vision_proj_m],
88
+ [self.text_proj, self.text_proj_m],
89
+ ]
90
+ self.copy_params()
91
+
92
+ # create the queue
93
+ self.register_buffer('image_queue', torch.randn(embed_dim, queue_size))
94
+ self.register_buffer('text_queue', torch.randn(embed_dim, queue_size))
95
+ self.register_buffer('queue_ptr', torch.zeros(1, dtype=torch.long))
96
+
97
+ self.image_queue = nn.functional.normalize(self.image_queue, dim=0)
98
+ self.text_queue = nn.functional.normalize(self.text_queue, dim=0)
99
+
100
+ self.queue_size = queue_size
101
+ self.momentum = momentum
102
+ self.temp = nn.Parameter(0.07 * torch.ones([]))
103
+
104
+ self.alpha = alpha
105
+ self.max_txt_len = max_txt_len
106
+
107
+ def _rampup_factor(self, epoch, iters, num_iters_per_epoch):
108
+ return min(1, (epoch * num_iters_per_epoch + iters) / (2 * num_iters_per_epoch))
109
+
110
+ def forward(self, samples):
111
+ """
112
+ Args:
113
+ samples (dict): A dictionary containing the following keys:
114
+ - image (torch.Tensor): A tensor of shape (batch_size, 3, H, W). The input images. Default: H=224, W=224.
115
+ - text_input (list): A list of length batch_size, each element is a string of text/caption.
116
+ - epoch (int): The current epoch.
117
+ - iters (int): The current iteration.
118
+ - num_iters_per_epoch (int): The number of iterations per epoch.
119
+
120
+ Returns:
121
+ BlipOutput: A BlipOutput object containing loss and intermediate output. See ``lavis.models.blip_models.blip_outputs.BlipOutput`` for more details.
122
+
123
+ Examples:
124
+ >>> import torch
125
+ >>> from lavis.models import load_model
126
+ >>> model = load_model("blip_pretrain", "base")
127
+ >>> images = torch.randn(4, 3, 224, 224)
128
+ >>> text_input = ["caption of image 1", "another caption of image 1", "caption of image 2", "caption of image 3"]
129
+ >>> samples = {"image": images, "text_input": text_input, "epoch": 0, "iters": 0, "num_iters_per_epoch": 100}
130
+ >>> output = model(samples)
131
+ >>> output.keys()
132
+ odict_keys(['sims', 'intermediate_output', 'loss', 'loss_itc', 'loss_itm', 'loss_lm'])
133
+
134
+ >>> output.intermediate_output.keys()
135
+ odict_keys(['image_embeds', 'text_embeds', 'image_embeds_m', 'text_embeds_m', 'encoder_output', 'encoder_output_neg', 'itm_logits', 'itm_labels', 'decoder_output', 'decoder_labels'])
136
+ >>> output.intermediate_output.image_embeds.shape
137
+ >>> # shape: (batch_size, num_patches, embed_dim)
138
+ torch.Size([4, 197, 768])
139
+ >>> output.intermediate_output.text_embeds.shape
140
+ >>> # shape: (batch_size, max_txt_len, embed_dim)
141
+ torch.Size([4, 30, 768])
142
+ >>> output.intermediate_output.image_embeds_m.shape
143
+ >>> # shape: (batch_size, num_patches, embed_dim)
144
+ torch.Size([4, 197, 768])
145
+ >>> output.intermediate_output.text_embeds_m.shape
146
+ >>> # shape: (batch_size, max_txt_len, embed_dim)
147
+ torch.Size([4, 30, 768])
148
+ >>> output.intermediate_output.itm_logits.shape
149
+ >>> # shape: (batch_size * 3, 2)
150
+ torch.Size([12, 2])
151
+ >>> output.intermediate_output.itm_labels.shape
152
+ >>> # shape: (batch_size * 3,)
153
+ torch.Size([12])
154
+ >>> output.intermediate_output.encoder_output.last_hidden_state.shape
155
+ >>> # shape: (batch_size, max_txt_len, embed_dim)
156
+ torch.Size([4, 30, 768])
157
+ >>> output.intermediate_output.encoder_output_m.last_hidden_state.shape
158
+ >>> # shape: (batch_size, max_txt_len, embed_dim)
159
+ torch.Size([4, 30, 768])
160
+ >>> output.intermediate_output.decoder_output.logits.shape
161
+ >>> # shape: (batch_size, max_txt_len, vocab_size)
162
+ torch.Size([4, 30, 30524])
163
+ >>> output.intermediate_output.decoder_labels.shape
164
+ >>> # shape: (batch_size, max_txt_len)
165
+ torch.Size([4, 30])
166
+ """
167
+
168
+ image = samples['image']
169
+ caption = samples['text_input']
170
+
171
+ alpha = self.alpha * self._rampup_factor(
172
+ epoch=samples['epoch'],
173
+ iters=samples['iters'],
174
+ num_iters_per_epoch=samples['num_iters_per_epoch'],
175
+ )
176
+
177
+ with torch.no_grad():
178
+ self.temp.clamp_(0.001, 0.5)
179
+
180
+ # image embeddings and features
181
+ image_embeds = self.visual_encoder.forward_features(image)
182
+ image_atts = torch.ones(image_embeds.size()[:-1], dtype=torch.long).to(image.device)
183
+ image_feat = F.normalize(self.vision_proj(image_embeds[:, 0, :]), dim=-1)
184
+
185
+ text = self.tokenizer(
186
+ caption,
187
+ padding='max_length',
188
+ truncation=True,
189
+ max_length=self.max_txt_len,
190
+ return_tensors='pt',
191
+ ).to(image.device)
192
+
193
+ # text embeddings and features
194
+ text_output = self.text_encoder.forward_text(text)
195
+ text_embeds = text_output.last_hidden_state
196
+ text_feat = F.normalize(self.text_proj(text_embeds[:, 0, :]), dim=-1)
197
+
198
+ # get momentum features
199
+ with torch.no_grad():
200
+ self._momentum_update()
201
+ image_embeds_m = self.visual_encoder_m(image)
202
+ image_feat_m = F.normalize(self.vision_proj_m(image_embeds_m[:, 0, :]), dim=-1)
203
+ image_feat_all = torch.cat([image_feat_m.t(), self.image_queue.clone().detach()], dim=1)
204
+
205
+ text_output_m = self.text_encoder_m.forward_text(text)
206
+ text_embeds_m = text_output_m.last_hidden_state
207
+ text_feat_m = F.normalize(self.text_proj_m(text_embeds_m[:, 0, :]), dim=-1)
208
+ text_feat_all = torch.cat([text_feat_m.t(), self.text_queue.clone().detach()], dim=1)
209
+
210
+ sim_i2t_m = image_feat_m @ text_feat_all / self.temp
211
+ sim_t2i_m = text_feat_m @ image_feat_all / self.temp
212
+
213
+ sim_targets = torch.zeros(sim_i2t_m.size()).to(image.device)
214
+ sim_targets.fill_diagonal_(1)
215
+
216
+ sim_i2t_targets = (alpha * F.softmax(sim_i2t_m, dim=1) + (1 - alpha) * sim_targets)
217
+ sim_t2i_targets = (alpha * F.softmax(sim_t2i_m, dim=1) + (1 - alpha) * sim_targets)
218
+
219
+ sim_i2t = image_feat @ text_feat_all / self.temp
220
+ sim_t2i = text_feat @ image_feat_all / self.temp
221
+
222
+ loss_i2t = -torch.sum(F.log_softmax(sim_i2t, dim=1) * sim_i2t_targets, dim=1).mean()
223
+ loss_t2i = -torch.sum(F.log_softmax(sim_t2i, dim=1) * sim_t2i_targets, dim=1).mean()
224
+
225
+ loss_itc = (loss_i2t + loss_t2i) / 2
226
+
227
+ self._dequeue_and_enqueue(image_feat_m, text_feat_m)
228
+
229
+ # Image-text Matching
230
+ encoder_input_ids = text.input_ids.clone()
231
+ encoder_input_ids[:, 0] = self.tokenizer.enc_token_id
232
+
233
+ # forward the positve image-text pair
234
+ bs = image.size(0)
235
+ output_pos = self.text_encoder(
236
+ encoder_input_ids,
237
+ attention_mask=text.attention_mask,
238
+ encoder_hidden_states=image_embeds,
239
+ encoder_attention_mask=image_atts,
240
+ return_dict=True,
241
+ )
242
+
243
+ with torch.no_grad():
244
+ weights_t2i = F.softmax(sim_t2i[:, :bs], dim=1) + 1e-4
245
+ weights_t2i.fill_diagonal_(0)
246
+ weights_i2t = F.softmax(sim_i2t[:, :bs], dim=1) + 1e-4
247
+ weights_i2t.fill_diagonal_(0)
248
+
249
+ # select a negative image for each text
250
+ image_embeds_neg = []
251
+ for b in range(bs):
252
+ neg_idx = torch.multinomial(weights_t2i[b], 1).item()
253
+ image_embeds_neg.append(image_embeds[neg_idx])
254
+ image_embeds_neg = torch.stack(image_embeds_neg, dim=0)
255
+
256
+ # select a negative text for each image
257
+ text_ids_neg = []
258
+ text_atts_neg = []
259
+ for b in range(bs):
260
+ neg_idx = torch.multinomial(weights_i2t[b], 1).item()
261
+ text_ids_neg.append(encoder_input_ids[neg_idx])
262
+ text_atts_neg.append(text.attention_mask[neg_idx])
263
+
264
+ text_ids_neg = torch.stack(text_ids_neg, dim=0)
265
+ text_atts_neg = torch.stack(text_atts_neg, dim=0)
266
+
267
+ text_ids_all = torch.cat([encoder_input_ids, text_ids_neg], dim=0)
268
+ text_atts_all = torch.cat([text.attention_mask, text_atts_neg], dim=0)
269
+
270
+ image_embeds_all = torch.cat([image_embeds_neg, image_embeds], dim=0)
271
+ image_atts_all = torch.cat([image_atts, image_atts], dim=0)
272
+
273
+ output_neg = self.text_encoder(
274
+ text_ids_all,
275
+ attention_mask=text_atts_all,
276
+ encoder_hidden_states=image_embeds_all,
277
+ encoder_attention_mask=image_atts_all,
278
+ return_dict=True,
279
+ )
280
+
281
+ vl_embeddings = torch.cat(
282
+ [
283
+ output_pos.last_hidden_state[:, 0, :],
284
+ output_neg.last_hidden_state[:, 0, :],
285
+ ],
286
+ dim=0,
287
+ )
288
+ itm_logits = self.itm_head(vl_embeddings)
289
+
290
+ itm_labels = torch.cat(
291
+ [torch.ones(bs, dtype=torch.long), torch.zeros(2 * bs, dtype=torch.long)],
292
+ dim=0,
293
+ ).to(image.device)
294
+ loss_itm = F.cross_entropy(itm_logits, itm_labels)
295
+
296
+ # LM
297
+ decoder_input_ids = text.input_ids.clone()
298
+ decoder_input_ids[:, 0] = self.tokenizer.bos_token_id
299
+ decoder_targets = decoder_input_ids.masked_fill(decoder_input_ids == self.tokenizer.pad_token_id, -100)
300
+
301
+ decoder_output = self.text_decoder(
302
+ decoder_input_ids,
303
+ attention_mask=text.attention_mask,
304
+ encoder_hidden_states=image_embeds,
305
+ encoder_attention_mask=image_atts,
306
+ labels=decoder_targets,
307
+ return_dict=True,
308
+ )
309
+
310
+ loss_lm = decoder_output.loss
311
+
312
+ return BlipOutput(
313
+ loss=loss_itc + loss_itm + loss_lm,
314
+ loss_itc=loss_itc,
315
+ loss_itm=loss_itm,
316
+ loss_lm=loss_lm,
317
+ sims=BlipSimilarity(
318
+ sim_i2t=sim_i2t,
319
+ sim_t2i=sim_t2i,
320
+ sim_i2t_m=sim_i2t_m,
321
+ sim_t2i_m=sim_t2i_m,
322
+ sim_i2t_targets=sim_i2t_targets,
323
+ sim_t2i_targets=sim_t2i_targets,
324
+ ),
325
+ intermediate_output=BlipIntermediateOutput(
326
+ image_embeds=image_embeds,
327
+ text_embeds=text_embeds,
328
+ image_embeds_m=image_embeds_m,
329
+ text_embeds_m=text_embeds_m,
330
+ encoder_output=output_pos,
331
+ encoder_output_neg=output_neg,
332
+ itm_logits=itm_logits,
333
+ itm_labels=itm_labels,
334
+ decoder_output=decoder_output,
335
+ decoder_labels=decoder_targets,
336
+ ),
337
+ )
338
+
339
+ def reset_queue_ptr(self):
340
+ self.queue_ptr = torch.zeros(1, dtype=torch.long)
341
+
342
+ @classmethod
343
+ def from_config(cls, cfg=None):
344
+ # set from_pretrained=True to load weights for 'bert-base-uncased'
345
+ image_encoder = VisionTransformerEncoder.from_config(cfg, from_pretrained=True)
346
+ text_encoder = XBertEncoder.from_config(cfg, from_pretrained=True)
347
+ text_decoder = XBertLMHeadDecoder.from_config(cfg, from_pretrained=True)
348
+
349
+ embed_dim = cfg.get('embed_dim', 256)
350
+ momentum = cfg.get('momentum', 0.995)
351
+ alpha = cfg.get('alpha', 0.4)
352
+ max_txt_len = cfg.get('max_txt_len', 30)
353
+ queue_size = cfg.get('queue_size', 57600)
354
+
355
+ model = cls(
356
+ image_encoder=image_encoder,
357
+ text_encoder=text_encoder,
358
+ text_decoder=text_decoder,
359
+ embed_dim=embed_dim,
360
+ queue_size=queue_size,
361
+ momentum=momentum,
362
+ alpha=alpha,
363
+ tie_enc_dec_weights=True,
364
+ max_txt_len=max_txt_len,
365
+ )
366
+
367
+ # [IMPORTANT] to reset queue pointer to 0.
368
+ # Otherwise when updating last batch in the queue, the batch size and remaining queue length may be un-equal.
369
+ model.reset_queue_ptr()
370
+
371
+ return model