ColUltraVBERT / modeling_ultravbert.py
hmellor's picture
hmellor HF Staff
athrael-soju's picture
Duplicate from athrael-soju/ColUltraVBERT
e730d84
Raw History Blame Contribute Delete
1.85 kB
from torch import nn
from transformers import AutoModel
from transformers.models.modernvbert.modeling_modernvbert import (
ModernVBertConnector,
ModernVBertModel,
ModernVBertPreTrainedModel,
)
from transformers.models.ultrabert.modeling_ultrabert import UltrabertRMSNorm
from .configuration_ultravbert import UltraVBertConfig
class UltraVBertConnector(ModernVBertConnector):
def __init__(self, config: UltraVBertConfig):
super().__init__(config)
# UltraBERT's first layer takes embeddings unnormalized; raw projections would swamp its token embeddings.
self.norm = (
UltrabertRMSNorm(config.text_config.hidden_size, eps=config.text_config.rms_norm_eps)
if config.connector_norm
else nn.Identity()
)
def forward(self, image_hidden_states):
return self.norm(super().forward(image_hidden_states))
class UltraVBertModel(ModernVBertModel):
config_class = UltraVBertConfig
_keys_to_ignore_on_load_unexpected = [r"vision_model\.head\."]
def __init__(self, config: UltraVBertConfig):
# ModernVBertModel.__init__ builds ModernVBertConnector; the rest of its body follows unchanged.
ModernVBertPreTrainedModel.__init__(self, config)
self.padding_idx = config.text_config.pad_token_id
self.vocab_size = config.text_config.vocab_size
self.vision_model = AutoModel.from_config(config.vision_config)
self.connector = UltraVBertConnector(config)
self.text_model = AutoModel.from_config(config.text_config)
self.image_seq_len = int(
((config.vision_config.image_size // config.vision_config.patch_size) ** 2)
/ (config.pixel_shuffle_factor**2)
)
self.image_token_id = config.image_token_id
self.post_init()
__all__ = ["UltraVBertModel"]