KyleLopez commited on
Commit
a3ccfc2
·
verified ·
1 Parent(s): 0fef788

Upload 2 files

Browse files
Files changed (2) hide show
  1. README.md +44 -0
  2. model_587404722_deit_huge.py +126 -0
README.md ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: cc-by-4.0
3
+ tags:
4
+ - adamw
5
+ - approx-gelu
6
+ - batchnorm
7
+ - bilinear
8
+ - deit
9
+ - flash
10
+ - generation
11
+ - huge
12
+ - kaiming
13
+ - step
14
+ ---
15
+
16
+ # model_587404722_deit_huge.py
17
+
18
+ ## Model Overview
19
+
20
+ A **huge**-scale implementation of the **deit** architecture, built for **generation** tasks.
21
+
22
+ ## Architecture
23
+
24
+ - **Architecture**: deit
25
+ - **Scale**: huge
26
+ - **Attention**: flash
27
+ - **Fusion strategy**: bilinear
28
+ - **Task head**: generation
29
+ - **Activation**: approx gelu
30
+ - **Normalization**: batchnorm
31
+ - **Initialization**: kaiming
32
+
33
+ ## Training
34
+
35
+ - **Optimizer**: adamw
36
+ - **LR scheduler**: step
37
+
38
+ ## Files
39
+
40
+ - `model_587404722_deit_huge.py` — main artifact of this repository
41
+
42
+ ## License
43
+
44
+ See the license field above.
model_587404722_deit_huge.py ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn as nn
3
+ import math
4
+
5
+
6
+ class DeitModel(nn.Module):
7
+ '''
8
+ deit model with flash attention.
9
+ Scale: huge (dim=640, layers=12, heads=8)
10
+ Fusion: bilinear, Task: generation
11
+ '''
12
+
13
+ def __init__(self, embed_dim=640, num_layers=12, num_heads=8, num_classes=10):
14
+ super().__init__()
15
+ self.embed_dim = embed_dim
16
+ self.num_layers = num_layers
17
+ self.num_heads = num_heads
18
+
19
+ # image patch embedding
20
+ self.patch_proj = nn.Conv2d(3, embed_dim, kernel_size=16, stride=16)
21
+ self.cls_token = nn.Parameter(torch.randn(1, 1, embed_dim) * 0.02)
22
+ self.pos_embed = nn.Parameter(torch.randn(1, 197, embed_dim) * 0.02)
23
+ self.dropout = nn.Dropout(0.1)
24
+
25
+ # image transformer blocks
26
+ self.image_blocks = nn.ModuleList([
27
+ nn.TransformerEncoderLayer(
28
+ embed_dim, num_heads, embed_dim * 4, 0.1,
29
+ activation='gelu', batch_first=True, norm_first=True
30
+ )
31
+ for _ in range(num_layers)
32
+ ])
33
+ self.image_norm = nn.LayerNorm(embed_dim)
34
+
35
+ # text embedding
36
+ self.text_embed = nn.Embedding(30522, embed_dim, padding_idx=0)
37
+ self.text_pos = nn.Parameter(torch.randn(1, 128, embed_dim) * 0.02)
38
+ self.text_blocks = nn.ModuleList([
39
+ nn.TransformerEncoderLayer(
40
+ embed_dim, num_heads, embed_dim * 4, 0.1,
41
+ activation='gelu', batch_first=True, norm_first=True
42
+ )
43
+ for _ in range(num_layers)
44
+ ])
45
+ self.text_norm = nn.LayerNorm(embed_dim)
46
+
47
+ # fusion
48
+ self.fusion_blocks = nn.ModuleList([
49
+ nn.TransformerEncoderLayer(
50
+ embed_dim, num_heads, embed_dim * 4, 0.1,
51
+ activation='gelu', batch_first=True, norm_first=True
52
+ )
53
+ for _ in range(2)
54
+ ])
55
+ self.fusion_norm = nn.LayerNorm(embed_dim)
56
+
57
+ # task head
58
+ self.classifier = nn.Sequential(
59
+ nn.Linear(embed_dim, embed_dim),
60
+ nn.GELU(approximate='quick'),
61
+ nn.Dropout(0.1),
62
+ nn.Linear(embed_dim, num_classes),
63
+ )
64
+
65
+ self._initialize_weights()
66
+
67
+ def _initialize_weights(self):
68
+ for m in self.modules():
69
+ if isinstance(m, nn.Linear):
70
+ nn.init.kaiming_normal_(m.weight, mode='fan_out')
71
+ if m.bias is not None:
72
+ nn.init.zeros_(m.bias)
73
+ elif isinstance(m, nn.Embedding):
74
+ nn.init.trunc_normal_(m.weight, std=0.02)
75
+ if m.padding_idx is not None:
76
+ m.weight[m.padding_idx].zero_()
77
+ elif isinstance(m, nn.LayerNorm):
78
+ nn.init.ones_(m.weight)
79
+ nn.init.zeros_(m.bias)
80
+
81
+ def encode_image(self, images):
82
+ x = self.patch_proj(images)
83
+ x = x.flatten(2).transpose(1, 2)
84
+ cls = self.cls_token.expand(x.size(0), -1, -1)
85
+ x = torch.cat([cls, x], dim=1)
86
+ x = x + self.pos_embed
87
+ x = self.dropout(x)
88
+ for block in self.image_blocks:
89
+ x = block(x)
90
+ return self.image_norm(x)
91
+
92
+ def encode_text(self, input_ids, attention_mask=None):
93
+ x = self.text_embed(input_ids)
94
+ x = x + self.text_pos[:, :input_ids.size(1)]
95
+ x = self.dropout(x)
96
+ padding = (attention_mask == 0) if attention_mask is not None else None
97
+ for block in self.text_blocks:
98
+ x = block(x, src_key_padding_mask=padding)
99
+ return self.text_norm(x)
100
+
101
+ def forward(self, images, input_ids, attention_mask=None, labels=None):
102
+ image_features = self.encode_image(images)
103
+ text_features = self.encode_text(input_ids, attention_mask)
104
+
105
+ fused = text_features
106
+ for block in self.fusion_blocks:
107
+ fused = block(fused)
108
+ fused = self.fusion_norm(fused[:, 0])
109
+ logits = self.classifier(fused)
110
+
111
+ loss = None
112
+ if labels is not None:
113
+ loss = nn.functional.cross_entropy(logits, labels)
114
+
115
+ return {'logits': logits, 'loss': loss}
116
+
117
+
118
+ if __name__ == '__main__':
119
+ model = DeitModel()
120
+ total = sum(p.numel() for p in model.parameters())
121
+ print(f'DeitModel: {total:,} params ({total/1e6:.2f}M)')
122
+ img = torch.randn(2, 3, 224, 224)
123
+ ids = torch.randint(0, 30522, (2, 128))
124
+ mask = torch.ones(2, 128)
125
+ out = model(img, ids, mask, torch.tensor([0, 1]))
126
+ print(f'Output: {out["logits"].shape}, Loss: {out["loss"].item():.4f}')