QDHShamiro commited on
Commit
0ce0aa6
·
verified ·
1 Parent(s): 953651c

add training code for hf jobs

Browse files
Files changed (1) hide show
  1. code/model.py +117 -0
code/model.py ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn as nn
3
+ from torch.nn import functional as F
4
+
5
+
6
+ class KairoGPTConfig:
7
+ def __init__(self, vocab_size, block_size=4096, n_layer=14, n_head=14, n_embd=896, dropout=0.1):
8
+ self.vocab_size = vocab_size
9
+ self.block_size = block_size
10
+ self.n_layer = n_layer
11
+ self.n_head = n_head
12
+ self.n_embd = n_embd
13
+ self.dropout = dropout
14
+
15
+
16
+ class CausalSelfAttention(nn.Module):
17
+ def __init__(self, cfg):
18
+ super().__init__()
19
+ assert cfg.n_embd % cfg.n_head == 0
20
+ self.qkv = nn.Linear(cfg.n_embd, 3 * cfg.n_embd)
21
+ self.proj = nn.Linear(cfg.n_embd, cfg.n_embd)
22
+ self.attn_drop_p = cfg.dropout
23
+ self.resid_drop = nn.Dropout(cfg.dropout)
24
+ self.n_head = cfg.n_head
25
+
26
+ def forward(self, x):
27
+ B, T, C = x.shape
28
+ q, k, v = self.qkv(x).split(C, dim=2)
29
+ q = q.view(B, T, self.n_head, C // self.n_head).transpose(1, 2)
30
+ k = k.view(B, T, self.n_head, C // self.n_head).transpose(1, 2)
31
+ v = v.view(B, T, self.n_head, C // self.n_head).transpose(1, 2)
32
+
33
+ y = F.scaled_dot_product_attention(
34
+ q, k, v,
35
+ dropout_p=self.attn_drop_p if self.training else 0.0,
36
+ is_causal=True,
37
+ )
38
+ y = y.transpose(1, 2).contiguous().view(B, T, C)
39
+ return self.resid_drop(self.proj(y))
40
+
41
+
42
+ class Block(nn.Module):
43
+ def __init__(self, cfg):
44
+ super().__init__()
45
+ self.ln1 = nn.LayerNorm(cfg.n_embd)
46
+ self.attn = CausalSelfAttention(cfg)
47
+ self.ln2 = nn.LayerNorm(cfg.n_embd)
48
+ self.mlp = nn.Sequential(
49
+ nn.Linear(cfg.n_embd, 4 * cfg.n_embd),
50
+ nn.GELU(),
51
+ nn.Linear(4 * cfg.n_embd, cfg.n_embd),
52
+ nn.Dropout(cfg.dropout),
53
+ )
54
+
55
+ def forward(self, x):
56
+ x = x + self.attn(self.ln1(x))
57
+ x = x + self.mlp(self.ln2(x))
58
+ return x
59
+
60
+
61
+ class KairoGPT(nn.Module):
62
+ def __init__(self, cfg):
63
+ super().__init__()
64
+ self.cfg = cfg
65
+ self.tok_emb = nn.Embedding(cfg.vocab_size, cfg.n_embd)
66
+ self.pos_emb = nn.Parameter(torch.zeros(1, cfg.block_size, cfg.n_embd))
67
+ self.drop = nn.Dropout(cfg.dropout)
68
+ self.blocks = nn.Sequential(*[Block(cfg) for _ in range(cfg.n_layer)])
69
+ self.ln_f = nn.LayerNorm(cfg.n_embd)
70
+ self.head = nn.Linear(cfg.n_embd, cfg.vocab_size, bias=False)
71
+ self.apply(self._init_weights)
72
+
73
+ def _init_weights(self, module):
74
+ if isinstance(module, (nn.Linear, nn.Embedding)):
75
+ nn.init.normal_(module.weight, mean=0.0, std=0.02)
76
+ if isinstance(module, nn.Linear) and module.bias is not None:
77
+ nn.init.zeros_(module.bias)
78
+
79
+ def forward(self, idx, targets=None):
80
+ B, T = idx.shape
81
+ x = self.drop(self.tok_emb(idx) + self.pos_emb[:, :T, :])
82
+ x = self.blocks(x)
83
+ x = self.ln_f(x)
84
+ logits = self.head(x)
85
+
86
+ loss = None
87
+ if targets is not None:
88
+ loss = F.cross_entropy(logits.view(-1, logits.size(-1)), targets.view(-1))
89
+ return logits, loss
90
+
91
+ @torch.no_grad()
92
+ def generate(self, idx, max_new_tokens, temperature=0.8, top_k=40):
93
+ for _ in range(max_new_tokens):
94
+ idx_cond = idx[:, -self.cfg.block_size:]
95
+ logits, _ = self(idx_cond)
96
+ logits = logits[:, -1, :] / temperature
97
+ if top_k is not None:
98
+ v, _ = torch.topk(logits, top_k)
99
+ logits[logits < v[:, [-1]]] = float("-inf")
100
+ probs = F.softmax(logits, dim=-1)
101
+ next_id = torch.multinomial(probs, num_samples=1)
102
+ idx = torch.cat((idx, next_id), dim=1)
103
+ return idx
104
+
105
+ @torch.no_grad()
106
+ def generate_stream(self, idx, max_new_tokens, temperature=0.8, top_k=40):
107
+ for _ in range(max_new_tokens):
108
+ idx_cond = idx[:, -self.cfg.block_size:]
109
+ logits, _ = self(idx_cond)
110
+ logits = logits[:, -1, :] / temperature
111
+ if top_k is not None:
112
+ v, _ = torch.topk(logits, top_k)
113
+ logits[logits < v[:, [-1]]] = float("-inf")
114
+ probs = F.softmax(logits, dim=-1)
115
+ next_id = torch.multinomial(probs, num_samples=1)
116
+ idx = torch.cat((idx, next_id), dim=1)
117
+ yield next_id.item()