kacperwikiel commited on
Commit
d6a86af
·
verified ·
1 Parent(s): fd0936c

Update tokenizer, configuration and training reports

Browse files
balanced_model.py ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Native Qwen3-style GQA model with explicit value residuals and tied embeddings.
2
+
3
+ State names match the reviewed JugnuVR checkpoint. Explicit v0 avoids a shared
4
+ mutable context dictionary in the training forward. No KV cache is implemented.
5
+ """
6
+ import torch
7
+ from torch import nn
8
+ from torch.nn import functional as F
9
+
10
+ class RMSNorm(nn.Module):
11
+ def __init__(self, width, eps=1e-6):
12
+ super().__init__(); self.weight=nn.Parameter(torch.ones(width)); self.eps=eps
13
+ def forward(self,x):
14
+ dtype=x.dtype; x=x.float(); x=x*torch.rsqrt(x.square().mean(-1,keepdim=True)+self.eps)
15
+ return self.weight*x.to(dtype)
16
+
17
+ class ValueProjection(nn.Linear):
18
+ def __init__(self,width,out,first):
19
+ super().__init__(width,out,bias=False)
20
+ if not first:self.vr_lambda=nn.Parameter(torch.zeros(1))
21
+
22
+ class Attention(nn.Module):
23
+ def __init__(self,c,index):
24
+ super().__init__();h=c['hidden_size'];self.heads=c['num_attention_heads'];self.kv=c['num_key_value_heads'];self.d=c.get('head_dim',h//self.heads);self.first=index==0
25
+ self.q_proj=nn.Linear(h,self.heads*self.d,bias=False);self.k_proj=nn.Linear(h,self.kv*self.d,bias=False)
26
+ self.v_proj=ValueProjection(h,self.kv*self.d,self.first);self.o_proj=nn.Linear(self.heads*self.d,h,bias=False)
27
+ self.q_norm=RMSNorm(self.d,c.get('rms_norm_eps',1e-6));self.k_norm=RMSNorm(self.d,c.get('rms_norm_eps',1e-6))
28
+ def forward(self,x,cos,sin,v0):
29
+ b,t,_=x.shape
30
+ q=self.q_norm(self.q_proj(x).view(b,t,self.heads,self.d)).transpose(1,2)
31
+ k=self.k_norm(self.k_proj(x).view(b,t,self.kv,self.d)).transpose(1,2)
32
+ v=self.v_proj(x)
33
+ if self.first:v0=v
34
+ else:v=v+self.v_proj.vr_lambda*v0
35
+ v=v.view(b,t,self.kv,self.d).transpose(1,2)
36
+ def rotate(z):return torch.cat((-z[...,self.d//2:],z[...,:self.d//2]),dim=-1)
37
+ q=q*cos+rotate(q)*sin;k=k*cos+rotate(k)*sin
38
+ k=k.repeat_interleave(self.heads//self.kv,dim=1);v=v.repeat_interleave(self.heads//self.kv,dim=1)
39
+ out=F.scaled_dot_product_attention(q,k,v,is_causal=True)
40
+ return self.o_proj(out.transpose(1,2).contiguous().view(b,t,-1)),v0
41
+
42
+ class MLP(nn.Module):
43
+ def __init__(self,c):
44
+ super().__init__();h=c['hidden_size'];f=c['intermediate_size']
45
+ self.gate_proj=nn.Linear(h,f,bias=False);self.up_proj=nn.Linear(h,f,bias=False);self.down_proj=nn.Linear(f,h,bias=False)
46
+ def forward(self,x):return self.down_proj(F.silu(self.gate_proj(x))*self.up_proj(x))
47
+
48
+ class Block(nn.Module):
49
+ def __init__(self,c,i):
50
+ super().__init__();self.self_attn=Attention(c,i);self.mlp=MLP(c)
51
+ self.input_layernorm=RMSNorm(c['hidden_size'],c.get('rms_norm_eps',1e-6));self.post_attention_layernorm=RMSNorm(c['hidden_size'],c.get('rms_norm_eps',1e-6))
52
+ def forward(self,x,cos,sin,v0):
53
+ a,v0=self.self_attn(self.input_layernorm(x),cos,sin,v0);x=x+a
54
+ return x+self.mlp(self.post_attention_layernorm(x)),v0
55
+
56
+ class Backbone(nn.Module):
57
+ def __init__(self,c):
58
+ super().__init__();self.embed_tokens=nn.Embedding(c['vocab_size'],c['hidden_size']);self.layers=nn.ModuleList([Block(c,i) for i in range(c['num_hidden_layers'])]);self.norm=RMSNorm(c['hidden_size'],c.get('rms_norm_eps',1e-6))
59
+
60
+ class BalancedLM(nn.Module):
61
+ def __init__(self,c):
62
+ super().__init__();self.config=dict(c)
63
+ assert c['num_attention_heads']%c['num_key_value_heads']==0
64
+ assert c['hidden_size']==c['num_attention_heads']*c.get('head_dim',64)
65
+ self.model=Backbone(c);self.lm_head=nn.Linear(c['hidden_size'],c['vocab_size'],bias=False);self.lm_head.weight=self.model.embed_tokens.weight
66
+ d=c.get('head_dim',64);theta=c.get('rope_parameters',{}).get('rope_theta',10000.)
67
+ inv=1./(theta**(torch.arange(0,d,2,dtype=torch.float32)/d))
68
+ phases=torch.outer(torch.arange(c['max_position_embeddings'],dtype=torch.float32),inv);phases=torch.cat((phases,phases),dim=-1)
69
+ self.register_buffer('cos',phases.cos()[None,None],persistent=False);self.register_buffer('sin',phases.sin()[None,None],persistent=False)
70
+ def forward(self,ids,targets=None):
71
+ x=self.model.embed_tokens(ids);v0=None;t=ids.shape[1]
72
+ for layer in self.model.layers:x,v0=layer(x,self.cos[:,:,:t],self.sin[:,:,:t],v0)
73
+ logits=self.lm_head(self.model.norm(x))
74
+ loss=None if targets is None else F.cross_entropy(logits.float().flatten(0,1),targets.flatten())
75
+ return logits,loss
76
+ @torch.no_grad()
77
+ def initialize(self,seed):
78
+ torch.manual_seed(seed)
79
+ for name,p in self.named_parameters():
80
+ if p.ndim==2:p.normal_(mean=0,std=0.02)
81
+ elif name.endswith('vr_lambda'):p.zero_()
82
+ else:p.fill_(1)
config.json ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "JugnuVRForCausalLM"
4
+ ],
5
+ "attention_bias": false,
6
+ "attention_dropout": 0.0,
7
+ "auto_map": {
8
+ "AutoConfig": "configuration_jugnu_vr.JugnuVRConfig",
9
+ "AutoModelForCausalLM": "modeling_jugnu_vr.JugnuVRForCausalLM"
10
+ },
11
+ "bos_token_id": 0,
12
+ "dtype": "float32",
13
+ "eos_token_id": 0,
14
+ "head_dim": 64,
15
+ "hidden_act": "silu",
16
+ "hidden_size": 576,
17
+ "initializer_range": 0.02,
18
+ "intermediate_size": 2496,
19
+ "layer_types": [
20
+ "full_attention",
21
+ "full_attention",
22
+ "full_attention",
23
+ "full_attention",
24
+ "full_attention",
25
+ "full_attention",
26
+ "full_attention",
27
+ "full_attention",
28
+ "full_attention",
29
+ "full_attention",
30
+ "full_attention",
31
+ "full_attention",
32
+ "full_attention",
33
+ "full_attention",
34
+ "full_attention",
35
+ "full_attention",
36
+ "full_attention",
37
+ "full_attention",
38
+ "full_attention",
39
+ "full_attention",
40
+ "full_attention",
41
+ "full_attention",
42
+ "full_attention",
43
+ "full_attention",
44
+ "full_attention",
45
+ "full_attention"
46
+ ],
47
+ "max_position_embeddings": 2048,
48
+ "max_window_layers": 28,
49
+ "model_type": "jugnu_vr",
50
+ "num_attention_heads": 9,
51
+ "num_hidden_layers": 26,
52
+ "num_key_value_heads": 3,
53
+ "pad_token_id": null,
54
+ "rms_norm_eps": 1e-06,
55
+ "rope_parameters": {
56
+ "rope_theta": 10000.0,
57
+ "rope_type": "default"
58
+ },
59
+ "sliding_window": null,
60
+ "tie_word_embeddings": true,
61
+ "transformers_version": "5.16.1",
62
+ "use_cache": true,
63
+ "use_sliding_window": false,
64
+ "vocab_size": 24576
65
+ }
load_model.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from pathlib import Path
3
+ import torch
4
+ from safetensors.torch import load_file
5
+ from tokenizers import Tokenizer
6
+ from balanced_model import BalancedLM
7
+
8
+ def load_model(directory,device='cpu'):
9
+ path=Path(directory);m=BalancedLM(json.loads((path/'config.json').read_text()))
10
+ state=load_file(str(path/'model.safetensors'));state['lm_head.weight']=state['model.embed_tokens.weight']
11
+ m.load_state_dict(state,strict=True);return m.eval().to(device),Tokenizer.from_file(str(path/'tokenizer.json'))
reports/benchmark/result.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "tokens_per_second": 999441.1017687789,
3
+ "timed_updates": 20,
4
+ "seconds": 10.491623749956489,
5
+ "parameters": 149333081,
6
+ "note": "Synthetic systems benchmark, not training or quality evidence"
7
+ }
reports/deadline.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"ready_by_utc":"2026-10-01T13:00:00+00:00","ready_by_warsaw":"2026-10-01 15:00","free_reservation_confirmed_by_user":true,"reserve_seconds_for_evaluation_and_upload":4200}
reports/sources/finemath/manifest.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "repo": "HuggingFaceTB/finemath",
3
+ "revision": "e92b25a616738fe95dc186b64dfb19f9c8525594",
4
+ "license": "odc-by",
5
+ "used_files": [
6
+ {
7
+ "path": "finemath-4plus/train-00045-of-00064.parquet",
8
+ "sha256": "2c3e25eccc80c71af05c1c27a260fb25d5743169dbace5e3ecdd18e6b96c277e"
9
+ }
10
+ ],
11
+ "tokens": 100117355,
12
+ "validation_tokens": 503280,
13
+ "docs": 66751,
14
+ "overlap_rejected": 23,
15
+ "sha256": "f03351e6b661140e6fb0db3afb8d83e72a668b76a4d8715608d24b0ec85a26b4",
16
+ "validation_sha256": "180832b085910a6a2b31ae42e42118edd380b7007c23268d60f6d69f89e01688",
17
+ "tokenizer_sha256": "d1ffe47f6fd8cc19ba7c3e5d2537699d6a99d09b584d3319944f4e40fe6c44ea",
18
+ "split": "document hash 1% held out",
19
+ "decontamination": "normalized 13-word exact overlap and exact short sentences; not semantic guarantee"
20
+ }
reports/status.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"stage":"preparing_corpus_and_benchmarking","initialization":"from_scratch","parameters":149333081,"vocab_size":24576,"ready_by_warsaw":"2026-10-01 15:00","leaderboard_result":"not_measured"}
reports/tokenizer-selection.json ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "selected": {
3
+ "vocab": 24576,
4
+ "ffn": 2496,
5
+ "parameters": 149333081,
6
+ "weighted_tokens_per_byte": 0.21982151683772885,
7
+ "measurements": {
8
+ "fineweb_edu": {
9
+ "tokens": 108258,
10
+ "bytes": 500330,
11
+ "bytes_per_token": 4.621644589776275
12
+ },
13
+ "dclm_edu": {
14
+ "tokens": 113785,
15
+ "bytes": 502955,
16
+ "bytes_per_token": 4.42022234916729
17
+ },
18
+ "cosmopedia": {
19
+ "tokens": 96667,
20
+ "bytes": 500651,
21
+ "bytes_per_token": 5.179130416791666
22
+ },
23
+ "finemath": {
24
+ "tokens": 149111,
25
+ "bytes": 509813,
26
+ "bytes_per_token": 3.4190167056756375
27
+ },
28
+ "edge_cases": {
29
+ "tokens": 67,
30
+ "bytes": 130,
31
+ "bytes_per_token": 1.9402985074626866
32
+ }
33
+ },
34
+ "fit_seconds": 6.842154794954695
35
+ },
36
+ "candidates": [
37
+ {
38
+ "vocab": 16384,
39
+ "ffn": 2592,
40
+ "parameters": 148927577,
41
+ "weighted_tokens_per_byte": 0.2296576476963851,
42
+ "measurements": {
43
+ "fineweb_edu": {
44
+ "tokens": 113155,
45
+ "bytes": 500330,
46
+ "bytes_per_token": 4.421634041801069
47
+ },
48
+ "dclm_edu": {
49
+ "tokens": 118553,
50
+ "bytes": 502955,
51
+ "bytes_per_token": 4.242448525132219
52
+ },
53
+ "cosmopedia": {
54
+ "tokens": 101369,
55
+ "bytes": 500651,
56
+ "bytes_per_token": 4.938896506821612
57
+ },
58
+ "finemath": {
59
+ "tokens": 155627,
60
+ "bytes": 509813,
61
+ "bytes_per_token": 3.275864727842855
62
+ },
63
+ "edge_cases": {
64
+ "tokens": 72,
65
+ "bytes": 130,
66
+ "bytes_per_token": 1.8055555555555556
67
+ }
68
+ },
69
+ "fit_seconds": 9.067338421940804
70
+ },
71
+ {
72
+ "vocab": 24576,
73
+ "ffn": 2496,
74
+ "parameters": 149333081,
75
+ "weighted_tokens_per_byte": 0.21982151683772885,
76
+ "measurements": {
77
+ "fineweb_edu": {
78
+ "tokens": 108258,
79
+ "bytes": 500330,
80
+ "bytes_per_token": 4.621644589776275
81
+ },
82
+ "dclm_edu": {
83
+ "tokens": 113785,
84
+ "bytes": 502955,
85
+ "bytes_per_token": 4.42022234916729
86
+ },
87
+ "cosmopedia": {
88
+ "tokens": 96667,
89
+ "bytes": 500651,
90
+ "bytes_per_token": 5.179130416791666
91
+ },
92
+ "finemath": {
93
+ "tokens": 149111,
94
+ "bytes": 509813,
95
+ "bytes_per_token": 3.4190167056756375
96
+ },
97
+ "edge_cases": {
98
+ "tokens": 67,
99
+ "bytes": 130,
100
+ "bytes_per_token": 1.9402985074626866
101
+ }
102
+ },
103
+ "fit_seconds": 6.842154794954695
104
+ },
105
+ {
106
+ "vocab": 32768,
107
+ "ffn": 2384,
108
+ "parameters": 149019737,
109
+ "weighted_tokens_per_byte": 0.2144127319251325,
110
+ "measurements": {
111
+ "fineweb_edu": {
112
+ "tokens": 105600,
113
+ "bytes": 500330,
114
+ "bytes_per_token": 4.737973484848485
115
+ },
116
+ "dclm_edu": {
117
+ "tokens": 111026,
118
+ "bytes": 502955,
119
+ "bytes_per_token": 4.530065029812836
120
+ },
121
+ "cosmopedia": {
122
+ "tokens": 94072,
123
+ "bytes": 500651,
124
+ "bytes_per_token": 5.321998044051365
125
+ },
126
+ "finemath": {
127
+ "tokens": 145642,
128
+ "bytes": 509813,
129
+ "bytes_per_token": 3.50045316598234
130
+ },
131
+ "edge_cases": {
132
+ "tokens": 63,
133
+ "bytes": 130,
134
+ "bytes_per_token": 2.0634920634920637
135
+ }
136
+ },
137
+ "fit_seconds": 7.331924270954914
138
+ }
139
+ ],
140
+ "criterion": "Smallest vocabulary within 3% of best weighted held-out token compression; provisional pending speed check.",
141
+ "tokenizer_training_sha256": "c15bad040cf3eaf9e0053539bff3039601f9a4db7e89a0acd6db0e03e4cced49",
142
+ "tokenizer_sha256": "d1ffe47f6fd8cc19ba7c3e5d2537699d6a99d09b584d3319944f4e40fe6c44ea",
143
+ "normalization": "none; byte fallback alphabet; preserve Unicode and whitespace; digit groups max3",
144
+ "parameters_cap": 149500000,
145
+ "data_mix": {
146
+ "fineweb_edu": 0.65,
147
+ "dclm_edu": 0.2,
148
+ "cosmopedia": 0.1,
149
+ "finemath": 0.05
150
+ },
151
+ "status": "roundtrip_passed"
152
+ }
reports/train.toml ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ seed = 1337
2
+ block = 2048
3
+ micro_batch = 16
4
+ accumulation = 2
5
+ adam_lr = 0.0015
6
+ muon_lr = 0.02
7
+ weight_decay = 0.1
8
+ clip = 1.0
9
+ checkpoint_every = 500
10
+ log_every = 20
11
+ compile = true
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff