| |
| |
| |
| |
| |
| |
|
|
| import math |
| import torch |
| import torch.nn as nn |
| from timm.models.layers import trunc_normal_ as __call_trunc_normal_ |
|
|
| from vlmo.torchscale.model.BEiT3 import BEiT3 |
| from vlmo.torchscale.architecture.config import EncoderConfig |
|
|
|
|
| def trunc_normal_(tensor, mean=0.0, std=1.0): |
| __call_trunc_normal_(tensor, mean=mean, std=std, a=-std, b=std) |
|
|
|
|
| def _get_base_config( |
| img_size=224, |
| patch_size=16, |
| drop_path_rate=0, |
| checkpoint_activations=None, |
| mlp_ratio=4, |
| vocab_size=64010, |
| encoder_layers=12, |
| encoder_embed_dim=768, |
| encoder_attention_heads=12, |
| share_layer=False, |
| share_attn=False, |
| deepnorm=False, |
| mask_ratio=0, |
| max_text_len=52, |
| one_attn=False, |
| **kwargs |
| ): |
| return EncoderConfig( |
| img_size=img_size, |
| patch_size=patch_size, |
| vocab_size=vocab_size, |
| multiway=True, |
| layernorm_embedding=False, |
| normalize_output=True, |
| no_output_layer=True, |
| drop_path_rate=drop_path_rate, |
| encoder_embed_dim=encoder_embed_dim, |
| encoder_attention_heads=encoder_attention_heads, |
| encoder_layers=encoder_layers, |
| encoder_ffn_embed_dim=int(encoder_embed_dim * mlp_ratio), |
| checkpoint_activations=checkpoint_activations, |
| share_layer=share_layer, |
| share_attn=share_attn, |
| deepnorm=deepnorm, |
| mask_ratio=mask_ratio, |
| max_text_len=max_text_len, |
| one_attn=one_attn, |
| ) |
|
|
|
|
| def _get_large_config( |
| img_size=224, |
| patch_size=16, |
| drop_path_rate=0, |
| checkpoint_activations=None, |
| mlp_ratio=4, |
| vocab_size=64010, |
| encoder_layers=24, |
| encoder_embed_dim=1024, |
| encoder_attention_heads=16, |
| share_layer=False, |
| share_attn=False, |
| deepnorm=False, |
| mask_ratio=0, |
| max_text_len=52, |
| one_attn=False, |
| **kwargs |
| ): |
| return EncoderConfig( |
| img_size=img_size, |
| patch_size=patch_size, |
| vocab_size=vocab_size, |
| multiway=True, |
| layernorm_embedding=False, |
| normalize_output=True, |
| no_output_layer=True, |
| drop_path_rate=drop_path_rate, |
| encoder_embed_dim=encoder_embed_dim, |
| encoder_attention_heads=encoder_attention_heads, |
| encoder_layers=encoder_layers, |
| encoder_ffn_embed_dim=int(encoder_embed_dim * mlp_ratio), |
| checkpoint_activations=checkpoint_activations, |
| share_layer=share_layer, |
| share_attn=share_attn, |
| deepnorm=deepnorm, |
| mask_ratio=mask_ratio, |
| max_text_len=max_text_len, |
| one_attn=one_attn, |
| ) |
|
|
|
|
| def _get_huge_config( |
| img_size=224, |
| patch_size=16, |
| drop_path_rate=0, |
| checkpoint_activations=None, |
| mlp_ratio=4, |
| vocab_size=30522, |
| encoder_layers=32, |
| encoder_embed_dim=4096, |
| encoder_attention_heads=32, |
| share_layer=False, |
| share_attn=False, |
| deepnorm=False, |
| mask_ratio=0, |
| max_text_len=52, |
| one_attn=False, |
| **kwargs |
| ): |
| return EncoderConfig( |
| img_size=img_size, |
| patch_size=patch_size, |
| vocab_size=vocab_size, |
| multiway=True, |
| layernorm_embedding=False, |
| normalize_output=True, |
| no_output_layer=True, |
| drop_path_rate=drop_path_rate, |
| encoder_embed_dim=encoder_embed_dim, |
| encoder_attention_heads=encoder_attention_heads, |
| encoder_layers=encoder_layers, |
| encoder_ffn_embed_dim=int(encoder_embed_dim * mlp_ratio), |
| checkpoint_activations=checkpoint_activations, |
| share_layer=share_layer, |
| share_attn=share_attn, |
| deepnorm=deepnorm, |
| mask_ratio=mask_ratio, |
| max_text_len=max_text_len, |
| one_attn=one_attn, |
| ) |
|
|
|
|
| class BEiT3Wrapper(nn.Module): |
| def __init__(self, args, **kwargs): |
| super().__init__() |
| self.args = args |
| self.beit3 = BEiT3(args) |
| self.apply(self._init_weights) |
|
|
| def fix_init_weight(self): |
| def rescale(param, layer_id): |
| param.div_(math.sqrt(2.0 * layer_id)) |
|
|
| for layer_id, layer in enumerate(self.blocks): |
| rescale(layer.attn.proj.weight.data, layer_id + 1) |
| rescale(layer.mlp.fc2.weight.data, layer_id + 1) |
|
|
| def get_num_layers(self): |
| return self.beit3.encoder.num_layers |
|
|
| @torch.jit.ignore |
| def no_weight_decay(self): |
| return { |
| "pos_embed", |
| "cls_token", |
| "beit3.encoder.embed_positions.A.weight", |
| "beit3.vision_embed.cls_token", |
| "logit_scale", |
| } |
|
|
| def _init_weights(self, m): |
| if isinstance(m, nn.Linear): |
| trunc_normal_(m.weight, std=0.02) |
| if isinstance(m, nn.Linear) and m.bias is not None: |
| nn.init.constant_(m.bias, 0) |
| elif isinstance(m, nn.LayerNorm): |
| nn.init.constant_(m.bias, 0) |
| nn.init.constant_(m.weight, 1.0) |
|
|