Banaxi-Tech commited on
Commit
645124a
·
verified ·
1 Parent(s): 0f701ea

Upload pico-30 checkpoint

Browse files
README.md ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language:
3
+ - en
4
+ library_name: transformers
5
+ pipeline_tag: text-generation
6
+ datasets:
7
+ - epfml/FineWeb-HQ
8
+ - HuggingFaceTB/smollm-corpus
9
+ tags:
10
+ - causal-lm
11
+ - base-model
12
+ - muon
13
+ - xsa-refresh
14
+ - custom-code
15
+ - trust-remote-code
16
+ ---
17
+
18
+ # BananaMind 2 Pico Test - 30%
19
+
20
+ This is the **30% checkpoint** of a 900,002-parameter
21
+ base causal language model. It is not instruction tuned.
22
+
23
+ ## Architecture
24
+
25
+ | Field | Value |
26
+ |---|---:|
27
+ | Parameters | 900,002 |
28
+ | Layers / hidden size | 6 / 96 |
29
+ | SwiGLU intermediate size | 380 |
30
+ | Query / KV heads | 6 / 2 |
31
+ | Head dimension | 16 |
32
+ | Context | 4,096 |
33
+ | Vocabulary | 384, tied |
34
+ | Refresh layers | 4 and 6 |
35
+ | Refresh kernel | Causal depthwise, width 9 |
36
+
37
+ The selective XSA refresh gate reads detached attention output as its signal,
38
+ reinjects the original input embedding as its value, and carries convolution
39
+ history alongside the K/V cache. Its learned residual scalar starts at zero.
40
+
41
+ ## Training
42
+
43
+ | Field | Value |
44
+ |---|---:|
45
+ | Progress | 30% |
46
+ | Tokens seen | 60,001,615,872 |
47
+ | Target tokens | 200,000,000,000 |
48
+ | Hardware | 4 x NVIDIA H200 |
49
+ | Matrix optimizer | Stock `torch.optim.Muon` |
50
+ | Muon peak LR | 0.07 |
51
+ | Embedding/control optimizer | AdamW, LR 0.004 |
52
+ | Precision | bfloat16 autocast |
53
+
54
+ | Token range | FineWeb-HQ | Cosmopedia v2 |
55
+ |---|---:|---:|
56
+ | 0.00B-100.00B | 80% | 20% |
57
+ | 100.00B-200.00B | 60% | 40% |
58
+
59
+ ## Usage
60
+
61
+ ```python
62
+ from transformers import AutoModelForCausalLM, AutoTokenizer
63
+
64
+ model_id = "Banaxi-Tech/pico-test"
65
+ tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
66
+ model = AutoModelForCausalLM.from_pretrained(model_id, trust_remote_code=True)
67
+ ```
checkpoint_metadata.json ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "parameters": 900002,
3
+ "architecture": {
4
+ "vocab_size": 384,
5
+ "hidden_size": 96,
6
+ "num_hidden_layers": 6,
7
+ "num_attention_heads": 6,
8
+ "num_key_value_heads": 2,
9
+ "head_dim": 16,
10
+ "intermediate_size": 380,
11
+ "refresh_layers": [
12
+ 3,
13
+ 5
14
+ ],
15
+ "refresh_kernel_size": 9,
16
+ "refresh_alpha_init": 0.0,
17
+ "max_position_embeddings": 4096,
18
+ "rope_theta": 100000.0,
19
+ "rms_norm_eps": 1e-06,
20
+ "initializer_range": 0.02,
21
+ "use_cache": true,
22
+ "transformers_version": "5.15.0",
23
+ "architectures": null,
24
+ "output_hidden_states": false,
25
+ "return_dict": true,
26
+ "dtype": null,
27
+ "chunk_size_feed_forward": 0,
28
+ "is_encoder_decoder": false,
29
+ "id2label": {
30
+ "0": "LABEL_0",
31
+ "1": "LABEL_1"
32
+ },
33
+ "label2id": {
34
+ "LABEL_0": 0,
35
+ "LABEL_1": 1
36
+ },
37
+ "problem_type": null,
38
+ "_name_or_path": "",
39
+ "tie_word_embeddings": true,
40
+ "bos_token_id": 1,
41
+ "eos_token_id": 2,
42
+ "pad_token_id": 0,
43
+ "unk_token_id": 3,
44
+ "model_type": "bananamind2_pico",
45
+ "output_attentions": false
46
+ },
47
+ "training_percent": 30,
48
+ "step": 6732,
49
+ "total_steps": 22439,
50
+ "tokens_seen": 60001615872,
51
+ "target_tokens": 200000000000,
52
+ "trained_token_target": 199996473344,
53
+ "tokens_per_step": 8912896,
54
+ "local_batch": 544,
55
+ "effective_global_batch": 2176,
56
+ "world_size": 4,
57
+ "gpu_name": "NVIDIA H200",
58
+ "optimizer": "Muon + AdamW",
59
+ "muon_peak_lr": 0.07,
60
+ "adamw_peak_lr": 0.004,
61
+ "architecture_revision": "ee5739850035c878ce4d9fc29fc38b075987e03b",
62
+ "tokenizer_revision": "ee5739850035c878ce4d9fc29fc38b075987e03b",
63
+ "dataset_revisions": {
64
+ "fineweb_hq": "e58199cdd52438d94405df1a4d8630cc5f13bf84",
65
+ "cosmopedia_v2": "3ba9d605774198c5868892d7a8deda78031a781f"
66
+ },
67
+ "source_tokens": {
68
+ "fineweb_hq": 48004857856,
69
+ "cosmopedia_v2": 11996758016
70
+ },
71
+ "elapsed_seconds": 8633.815947532654
72
+ }
config.json ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "vocab_size": 384,
3
+ "hidden_size": 96,
4
+ "num_hidden_layers": 6,
5
+ "num_attention_heads": 6,
6
+ "num_key_value_heads": 2,
7
+ "head_dim": 16,
8
+ "intermediate_size": 380,
9
+ "refresh_layers": [
10
+ 3,
11
+ 5
12
+ ],
13
+ "refresh_kernel_size": 9,
14
+ "refresh_alpha_init": 0.0,
15
+ "max_position_embeddings": 4096,
16
+ "rope_theta": 100000.0,
17
+ "rms_norm_eps": 1e-06,
18
+ "initializer_range": 0.02,
19
+ "use_cache": true,
20
+ "transformers_version": "5.15.0",
21
+ "architectures": [
22
+ "BananaMind2PicoForCausalLM"
23
+ ],
24
+ "output_hidden_states": false,
25
+ "return_dict": true,
26
+ "dtype": null,
27
+ "chunk_size_feed_forward": 0,
28
+ "is_encoder_decoder": false,
29
+ "id2label": {
30
+ "0": "LABEL_0",
31
+ "1": "LABEL_1"
32
+ },
33
+ "label2id": {
34
+ "LABEL_0": 0,
35
+ "LABEL_1": 1
36
+ },
37
+ "problem_type": null,
38
+ "_name_or_path": "Banaxi-Tech/pico-test",
39
+ "tie_word_embeddings": true,
40
+ "bos_token_id": 1,
41
+ "eos_token_id": 2,
42
+ "pad_token_id": 0,
43
+ "unk_token_id": 3,
44
+ "model_type": "bananamind2_pico",
45
+ "output_attentions": false,
46
+ "auto_map": {
47
+ "AutoConfig": "configuration_bananamind2pico.BananaMind2PicoConfig",
48
+ "AutoModelForCausalLM": "modeling_bananamind2pico.BananaMind2PicoForCausalLM"
49
+ },
50
+ "torch_dtype": "float32"
51
+ }
configuration_bananamind2pico.py ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Configuration for BananaMind 2 Pico."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from transformers import PretrainedConfig
6
+
7
+
8
+ class BananaMind2PicoConfig(PretrainedConfig):
9
+ model_type = "bananamind2_pico"
10
+
11
+ def __init__(
12
+ self,
13
+ vocab_size: int = 384,
14
+ hidden_size: int = 96,
15
+ num_hidden_layers: int = 6,
16
+ num_attention_heads: int = 6,
17
+ num_key_value_heads: int = 2,
18
+ head_dim: int = 16,
19
+ intermediate_size: int = 380,
20
+ refresh_layers: tuple[int, ...] | list[int] = (3, 5),
21
+ refresh_kernel_size: int = 9,
22
+ refresh_alpha_init: float = 0.0,
23
+ max_position_embeddings: int = 4096,
24
+ rope_theta: float = 100000.0,
25
+ rms_norm_eps: float = 1e-6,
26
+ initializer_range: float = 0.02,
27
+ tie_word_embeddings: bool = True,
28
+ use_cache: bool = True,
29
+ bos_token_id: int = 1,
30
+ eos_token_id: int = 2,
31
+ pad_token_id: int = 0,
32
+ unk_token_id: int = 3,
33
+ **kwargs,
34
+ ):
35
+ if hidden_size != num_attention_heads * head_dim:
36
+ raise ValueError("hidden_size must equal num_attention_heads * head_dim")
37
+ if num_attention_heads % num_key_value_heads:
38
+ raise ValueError("num_attention_heads must be divisible by num_key_value_heads")
39
+ if intermediate_size <= 0:
40
+ raise ValueError("intermediate_size must be positive")
41
+ if refresh_kernel_size <= 0 or refresh_kernel_size % 2 == 0:
42
+ raise ValueError("refresh_kernel_size must be a positive odd integer")
43
+ refresh_layers = tuple(int(index) for index in refresh_layers)
44
+ if len(refresh_layers) != len(set(refresh_layers)):
45
+ raise ValueError("refresh_layers must not contain duplicates")
46
+ if any(index < 0 or index >= num_hidden_layers for index in refresh_layers):
47
+ raise ValueError("refresh_layers contains an out-of-range zero-based index")
48
+
49
+ self.vocab_size = vocab_size
50
+ self.hidden_size = hidden_size
51
+ self.num_hidden_layers = num_hidden_layers
52
+ self.num_attention_heads = num_attention_heads
53
+ self.num_key_value_heads = num_key_value_heads
54
+ self.head_dim = head_dim
55
+ self.intermediate_size = intermediate_size
56
+ self.refresh_layers = list(refresh_layers)
57
+ self.refresh_kernel_size = refresh_kernel_size
58
+ self.refresh_alpha_init = refresh_alpha_init
59
+ self.max_position_embeddings = max_position_embeddings
60
+ self.rope_theta = rope_theta
61
+ self.rms_norm_eps = rms_norm_eps
62
+ self.initializer_range = initializer_range
63
+ self.use_cache = use_cache
64
+ super().__init__(
65
+ tie_word_embeddings=tie_word_embeddings,
66
+ bos_token_id=bos_token_id,
67
+ eos_token_id=eos_token_id,
68
+ pad_token_id=pad_token_id,
69
+ unk_token_id=unk_token_id,
70
+ **kwargs,
71
+ )
72
+
73
+ def parameter_counts(self) -> dict[str, int]:
74
+ """Return an analytical parameter breakdown for drift checks."""
75
+ hidden = self.hidden_size
76
+ query_width = self.num_attention_heads * self.head_dim
77
+ kv_width = self.num_key_value_heads * self.head_dim
78
+ embedding = self.vocab_size * hidden
79
+ attention = hidden * query_width + 2 * hidden * kv_width + query_width * hidden
80
+ qk_norms = 2 * self.head_dim
81
+ mlp = 3 * hidden * self.intermediate_size
82
+ block_norms = 2 * hidden
83
+ refresh = (
84
+ 3 * hidden * hidden
85
+ + hidden * self.refresh_kernel_size
86
+ + 3 * hidden
87
+ + 1
88
+ )
89
+ base_layer = attention + qk_norms + mlp + block_norms
90
+ total = (
91
+ embedding
92
+ + self.num_hidden_layers * base_layer
93
+ + len(self.refresh_layers) * refresh
94
+ + hidden
95
+ )
96
+ if not self.tie_word_embeddings:
97
+ total += embedding
98
+ return {
99
+ "total": total,
100
+ "embedding": embedding,
101
+ "base_layer": base_layer,
102
+ "attention_per_layer": attention + qk_norms,
103
+ "mlp_per_layer": mlp,
104
+ "refresh_per_selected_layer": refresh,
105
+ "refresh_layer_count": len(self.refresh_layers),
106
+ }
107
+
108
+
109
+ BananaMind2PicoConfig.register_for_auto_class("AutoConfig")
110
+
111
+ __all__ = ["BananaMind2PicoConfig"]
generation_config.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "_from_model_config": true,
3
+ "bos_token_id": 1,
4
+ "eos_token_id": 2,
5
+ "pad_token_id": 0,
6
+ "transformers_version": "5"
7
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:76305ca46bfffc3587baf2496a45410569dd30f75005239c54e4df67380f685a
3
+ size 3756344
modeling_bananamind2pico.py ADDED
@@ -0,0 +1,456 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """BananaMind 2 Pico causal LM with selective XSA refresh gates."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+ from typing import Optional
7
+
8
+ import torch
9
+ import torch.nn as nn
10
+ import torch.nn.functional as F
11
+ from transformers import PreTrainedModel
12
+ from transformers.cache_utils import Cache, DynamicCache
13
+ from transformers.generation.utils import GenerationMixin
14
+ from transformers.modeling_outputs import CausalLMOutputWithPast
15
+
16
+ try:
17
+ from .configuration_bananamind2pico import BananaMind2PicoConfig
18
+ except ImportError: # Standalone training jobs import the mounted/downloaded files.
19
+ from configuration_bananamind2pico import BananaMind2PicoConfig
20
+
21
+
22
+ class BananaMind2PicoRMSNorm(nn.Module):
23
+ def __init__(self, dim: int, eps: float = 1e-6):
24
+ super().__init__()
25
+ self.eps = eps
26
+ self.weight = nn.Parameter(torch.ones(dim))
27
+
28
+ def forward(self, hidden_states: torch.Tensor) -> torch.Tensor:
29
+ states = hidden_states.float()
30
+ states = states * torch.rsqrt(states.square().mean(-1, keepdim=True) + self.eps)
31
+ return (states * self.weight.float()).to(hidden_states.dtype)
32
+
33
+
34
+ def _rope_cos_sin(
35
+ head_dim: int,
36
+ positions: torch.Tensor,
37
+ theta: float,
38
+ ) -> tuple[torch.Tensor, torch.Tensor]:
39
+ inv_freq = 1.0 / (
40
+ theta
41
+ ** (
42
+ torch.arange(0, head_dim, 2, dtype=torch.float32, device=positions.device)
43
+ / head_dim
44
+ )
45
+ )
46
+ frequencies = torch.outer(positions.float(), inv_freq)
47
+ return frequencies.cos(), frequencies.sin()
48
+
49
+
50
+ def _apply_rope(
51
+ query: torch.Tensor,
52
+ key: torch.Tensor,
53
+ cosine: torch.Tensor,
54
+ sine: torch.Tensor,
55
+ ) -> tuple[torch.Tensor, torch.Tensor]:
56
+ query_dtype, key_dtype = query.dtype, key.dtype
57
+ cosine = cosine[None, None, :, :]
58
+ sine = sine[None, None, :, :]
59
+ query_pairs = query.float().reshape(*query.shape[:-1], -1, 2)
60
+ key_pairs = key.float().reshape(*key.shape[:-1], -1, 2)
61
+ query_even, query_odd = query_pairs.unbind(-1)
62
+ key_even, key_odd = key_pairs.unbind(-1)
63
+ query = torch.stack(
64
+ (query_even * cosine - query_odd * sine, query_even * sine + query_odd * cosine),
65
+ dim=-1,
66
+ ).flatten(-2)
67
+ key = torch.stack(
68
+ (key_even * cosine - key_odd * sine, key_even * sine + key_odd * cosine),
69
+ dim=-1,
70
+ ).flatten(-2)
71
+ return query.to(query_dtype), key.to(key_dtype)
72
+
73
+
74
+ class BananaMind2PicoCache(DynamicCache):
75
+ """K/V cache plus causal-convolution history for selected refresh layers."""
76
+
77
+ def __init__(self, config: BananaMind2PicoConfig):
78
+ try:
79
+ super().__init__(config=config)
80
+ except TypeError:
81
+ super().__init__()
82
+ self.refresh_states: list[torch.Tensor | None] = [
83
+ None for _ in range(config.num_hidden_layers)
84
+ ]
85
+
86
+ def refresh_input(
87
+ self,
88
+ layer_idx: int,
89
+ current: torch.Tensor,
90
+ history_size: int,
91
+ ) -> torch.Tensor:
92
+ history = self.refresh_states[layer_idx]
93
+ if history is None:
94
+ history = current.new_zeros(current.size(0), current.size(1), history_size)
95
+ elif history.size(-1) < history_size:
96
+ history = F.pad(history, (history_size - history.size(-1), 0))
97
+ convolution_input = torch.cat((history, current), dim=-1)
98
+ self.refresh_states[layer_idx] = convolution_input[..., -history_size:]
99
+ return convolution_input
100
+
101
+ def reorder_cache(self, beam_idx: torch.LongTensor):
102
+ super().reorder_cache(beam_idx)
103
+ self.refresh_states = [
104
+ None if state is None else state.index_select(0, beam_idx.to(state.device))
105
+ for state in self.refresh_states
106
+ ]
107
+
108
+ def batch_repeat_interleave(self, repeats: int):
109
+ super().batch_repeat_interleave(repeats)
110
+ self.refresh_states = [
111
+ None if state is None else state.repeat_interleave(repeats, dim=0)
112
+ for state in self.refresh_states
113
+ ]
114
+
115
+ def batch_select_indices(self, indices: torch.Tensor):
116
+ super().batch_select_indices(indices)
117
+ self.refresh_states = [
118
+ None if state is None else state.index_select(0, indices.to(state.device))
119
+ for state in self.refresh_states
120
+ ]
121
+
122
+ def crop(self, max_length: int):
123
+ current_length = self.get_seq_length()
124
+ target_length = current_length + max_length if max_length < 0 else max_length
125
+ if target_length < current_length:
126
+ raise NotImplementedError(
127
+ "BananaMind2PicoCache cannot roll back causal refresh state"
128
+ )
129
+ super().crop(max_length)
130
+
131
+
132
+ class BananaMind2PicoAttention(nn.Module):
133
+ def __init__(self, config: BananaMind2PicoConfig, layer_idx: int):
134
+ super().__init__()
135
+ self.layer_idx = layer_idx
136
+ self.num_heads = config.num_attention_heads
137
+ self.num_kv_heads = config.num_key_value_heads
138
+ self.head_dim = config.head_dim
139
+ self.num_kv_groups = self.num_heads // self.num_kv_heads
140
+ self.q_proj = nn.Linear(config.hidden_size, self.num_heads * self.head_dim, bias=False)
141
+ self.k_proj = nn.Linear(config.hidden_size, self.num_kv_heads * self.head_dim, bias=False)
142
+ self.v_proj = nn.Linear(config.hidden_size, self.num_kv_heads * self.head_dim, bias=False)
143
+ self.o_proj = nn.Linear(self.num_heads * self.head_dim, config.hidden_size, bias=False)
144
+ self.o_proj.BANANAMIND_SCALE_INIT = True
145
+ self.q_norm = BananaMind2PicoRMSNorm(self.head_dim, config.rms_norm_eps)
146
+ self.k_norm = BananaMind2PicoRMSNorm(self.head_dim, config.rms_norm_eps)
147
+
148
+ def forward(
149
+ self,
150
+ hidden_states: torch.Tensor,
151
+ cosine: torch.Tensor,
152
+ sine: torch.Tensor,
153
+ attention_mask: torch.Tensor | None = None,
154
+ past_key_values: Cache | None = None,
155
+ ) -> torch.Tensor:
156
+ batch_size, query_length, _ = hidden_states.shape
157
+ query = self.q_proj(hidden_states).view(
158
+ batch_size, query_length, self.num_heads, self.head_dim
159
+ ).transpose(1, 2)
160
+ key = self.k_proj(hidden_states).view(
161
+ batch_size, query_length, self.num_kv_heads, self.head_dim
162
+ ).transpose(1, 2)
163
+ value = self.v_proj(hidden_states).view(
164
+ batch_size, query_length, self.num_kv_heads, self.head_dim
165
+ ).transpose(1, 2)
166
+ query = self.q_norm(query)
167
+ key = self.k_norm(key)
168
+ query, key = _apply_rope(query, key, cosine, sine)
169
+
170
+ past_length = 0
171
+ if past_key_values is not None:
172
+ past_length = past_key_values.get_seq_length(self.layer_idx)
173
+ key, value = past_key_values.update(key, value, self.layer_idx)
174
+
175
+ key_length = key.size(-2)
176
+ key = key.repeat_interleave(self.num_kv_groups, dim=1)
177
+ value = value.repeat_interleave(self.num_kv_groups, dim=1)
178
+ is_causal = query_length > 1 and past_length == 0 and attention_mask is None
179
+ sdpa_mask = None
180
+ if not is_causal and query_length > 1:
181
+ query_positions = past_length + torch.arange(query_length, device=query.device)
182
+ key_positions = torch.arange(key_length, device=query.device)
183
+ sdpa_mask = (key_positions[None, :] <= query_positions[:, None])[None, None]
184
+ if attention_mask is not None:
185
+ key_padding = attention_mask.to(torch.bool)
186
+ if key_padding.size(-1) < key_length:
187
+ key_padding = F.pad(
188
+ key_padding,
189
+ (key_length - key_padding.size(-1), 0),
190
+ value=True,
191
+ )
192
+ else:
193
+ key_padding = key_padding[:, -key_length:]
194
+ key_padding = key_padding[:, None, None, :]
195
+ sdpa_mask = key_padding if sdpa_mask is None else sdpa_mask & key_padding
196
+ is_causal = False
197
+
198
+ output = F.scaled_dot_product_attention(
199
+ query,
200
+ key,
201
+ value,
202
+ attn_mask=sdpa_mask,
203
+ is_causal=is_causal,
204
+ )
205
+ output = output.transpose(1, 2).contiguous().view(
206
+ batch_size, query_length, self.num_heads * self.head_dim
207
+ )
208
+ return self.o_proj(output)
209
+
210
+
211
+ class BananaMind2PicoRefreshGate(nn.Module):
212
+ def __init__(self, config: BananaMind2PicoConfig, layer_idx: int):
213
+ super().__init__()
214
+ hidden = config.hidden_size
215
+ self.layer_idx = layer_idx
216
+ self.kernel_size = config.refresh_kernel_size
217
+ self.attention_norm = BananaMind2PicoRMSNorm(hidden, config.rms_norm_eps)
218
+ self.embedding_norm = BananaMind2PicoRMSNorm(hidden, config.rms_norm_eps)
219
+ self.output_norm = BananaMind2PicoRMSNorm(hidden, config.rms_norm_eps)
220
+ self.gate_proj = nn.Linear(hidden, hidden, bias=False)
221
+ self.value_proj = nn.Linear(hidden, hidden, bias=False)
222
+ self.out_proj = nn.Linear(hidden, hidden, bias=False)
223
+ self.out_proj.BANANAMIND_SCALE_INIT = True
224
+ # A real 2D parameter keeps the depthwise kernel eligible for stock Muon.
225
+ self.depthwise_kernel = nn.Parameter(torch.empty(hidden, self.kernel_size))
226
+ nn.init.normal_(self.depthwise_kernel, mean=0.0, std=config.initializer_range)
227
+ self.alpha = nn.Parameter(torch.tensor(float(config.refresh_alpha_init)))
228
+
229
+ def _causal_depthwise_conv(
230
+ self,
231
+ attention_signal: torch.Tensor,
232
+ past_key_values: BananaMind2PicoCache | None,
233
+ ) -> torch.Tensor:
234
+ signal = attention_signal.transpose(1, 2)
235
+ history_size = self.kernel_size - 1
236
+ if past_key_values is None:
237
+ convolution_input = F.pad(signal, (history_size, 0))
238
+ else:
239
+ convolution_input = past_key_values.refresh_input(
240
+ self.layer_idx,
241
+ signal,
242
+ history_size,
243
+ )
244
+ convolved = F.conv1d(
245
+ convolution_input,
246
+ self.depthwise_kernel.unsqueeze(1),
247
+ groups=signal.size(1),
248
+ )
249
+ return convolved.transpose(1, 2)
250
+
251
+ def forward(
252
+ self,
253
+ attention_output: torch.Tensor,
254
+ original_embedding: torch.Tensor,
255
+ past_key_values: BananaMind2PicoCache | None,
256
+ ) -> torch.Tensor:
257
+ attention_signal = self.attention_norm(attention_output.detach())
258
+ embedding_value = self.embedding_norm(original_embedding)
259
+ gate = self.gate_proj(attention_signal) + self._causal_depthwise_conv(
260
+ attention_signal,
261
+ past_key_values,
262
+ )
263
+ value = self.value_proj(embedding_value)
264
+ refreshed = self.output_norm(self.out_proj(F.silu(gate) * value))
265
+ return self.alpha * refreshed
266
+
267
+
268
+ class BananaMind2PicoMLP(nn.Module):
269
+ def __init__(self, config: BananaMind2PicoConfig):
270
+ super().__init__()
271
+ self.gate_proj = nn.Linear(config.hidden_size, config.intermediate_size, bias=False)
272
+ self.up_proj = nn.Linear(config.hidden_size, config.intermediate_size, bias=False)
273
+ self.down_proj = nn.Linear(config.intermediate_size, config.hidden_size, bias=False)
274
+ self.down_proj.BANANAMIND_SCALE_INIT = True
275
+
276
+ def forward(self, hidden_states: torch.Tensor) -> torch.Tensor:
277
+ return self.down_proj(
278
+ F.silu(self.gate_proj(hidden_states)) * self.up_proj(hidden_states)
279
+ )
280
+
281
+
282
+ class BananaMind2PicoBlock(nn.Module):
283
+ def __init__(self, config: BananaMind2PicoConfig, layer_idx: int):
284
+ super().__init__()
285
+ self.input_norm = BananaMind2PicoRMSNorm(config.hidden_size, config.rms_norm_eps)
286
+ self.attention = BananaMind2PicoAttention(config, layer_idx)
287
+ self.refresh = (
288
+ BananaMind2PicoRefreshGate(config, layer_idx)
289
+ if layer_idx in config.refresh_layers
290
+ else None
291
+ )
292
+ self.post_attention_norm = BananaMind2PicoRMSNorm(
293
+ config.hidden_size,
294
+ config.rms_norm_eps,
295
+ )
296
+ self.mlp = BananaMind2PicoMLP(config)
297
+
298
+ def forward(
299
+ self,
300
+ hidden_states: torch.Tensor,
301
+ original_embedding: torch.Tensor,
302
+ cosine: torch.Tensor,
303
+ sine: torch.Tensor,
304
+ attention_mask: torch.Tensor | None,
305
+ past_key_values: BananaMind2PicoCache | None,
306
+ ) -> torch.Tensor:
307
+ attention_output = self.attention(
308
+ self.input_norm(hidden_states),
309
+ cosine,
310
+ sine,
311
+ attention_mask=attention_mask,
312
+ past_key_values=past_key_values,
313
+ )
314
+ hidden_states = hidden_states + attention_output
315
+ if self.refresh is not None:
316
+ hidden_states = hidden_states + self.refresh(
317
+ attention_output,
318
+ original_embedding,
319
+ past_key_values,
320
+ )
321
+ return hidden_states + self.mlp(self.post_attention_norm(hidden_states))
322
+
323
+
324
+ class BananaMind2PicoPreTrainedModel(PreTrainedModel):
325
+ config_class = BananaMind2PicoConfig
326
+ base_model_prefix = "transformer"
327
+ supports_gradient_checkpointing = False
328
+ _no_split_modules = ["BananaMind2PicoBlock"]
329
+ _supports_sdpa = True
330
+ _supports_cache_class = True
331
+
332
+ def _init_weights(self, module: nn.Module):
333
+ std = self.config.initializer_range
334
+ if hasattr(module, "BANANAMIND_SCALE_INIT"):
335
+ std *= (2 * self.config.num_hidden_layers) ** -0.5
336
+ if isinstance(module, nn.Linear):
337
+ nn.init.normal_(module.weight, mean=0.0, std=std)
338
+ elif isinstance(module, nn.Embedding):
339
+ nn.init.normal_(module.weight, mean=0.0, std=std)
340
+
341
+
342
+ class BananaMind2PicoForCausalLM(BananaMind2PicoPreTrainedModel, GenerationMixin):
343
+ _tied_weights_keys = {"lm_head.weight": "transformer.wte.weight"}
344
+
345
+ @classmethod
346
+ def _supports_default_dynamic_cache(cls) -> bool:
347
+ return False
348
+
349
+ def __init__(self, config: BananaMind2PicoConfig):
350
+ super().__init__(config)
351
+ self.transformer = nn.ModuleDict(
352
+ {
353
+ "wte": nn.Embedding(config.vocab_size, config.hidden_size),
354
+ "h": nn.ModuleList(
355
+ [
356
+ BananaMind2PicoBlock(config, index)
357
+ for index in range(config.num_hidden_layers)
358
+ ]
359
+ ),
360
+ "ln_f": BananaMind2PicoRMSNorm(
361
+ config.hidden_size,
362
+ config.rms_norm_eps,
363
+ ),
364
+ }
365
+ )
366
+ self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False)
367
+ self.embedding_scale = math.sqrt(config.hidden_size)
368
+ self.post_init()
369
+ if config.tie_word_embeddings:
370
+ self.tie_weights()
371
+
372
+ def get_input_embeddings(self):
373
+ return self.transformer["wte"]
374
+
375
+ def set_input_embeddings(self, value):
376
+ self.transformer["wte"] = value
377
+
378
+ def get_output_embeddings(self):
379
+ return self.lm_head
380
+
381
+ def set_output_embeddings(self, value):
382
+ self.lm_head = value
383
+
384
+ def forward(
385
+ self,
386
+ input_ids: torch.LongTensor,
387
+ attention_mask: Optional[torch.Tensor] = None,
388
+ labels: Optional[torch.LongTensor] = None,
389
+ past_key_values: Optional[Cache] = None,
390
+ use_cache: Optional[bool] = None,
391
+ **kwargs,
392
+ ) -> CausalLMOutputWithPast:
393
+ if use_cache is None:
394
+ use_cache = self.config.use_cache and labels is None
395
+ if use_cache and past_key_values is None:
396
+ past_key_values = BananaMind2PicoCache(self.config)
397
+ if use_cache and not isinstance(past_key_values, BananaMind2PicoCache):
398
+ raise TypeError("BananaMind 2 Pico requires its cache for refresh state")
399
+ if not use_cache:
400
+ past_key_values = None
401
+
402
+ past_length = past_key_values.get_seq_length() if past_key_values is not None else 0
403
+ sequence_length = input_ids.size(1)
404
+ total_length = past_length + sequence_length
405
+ if total_length > self.config.max_position_embeddings:
406
+ raise ValueError(
407
+ f"Sequence length {total_length} exceeds "
408
+ f"{self.config.max_position_embeddings}"
409
+ )
410
+
411
+ original_embedding = self.transformer["wte"](input_ids) * self.embedding_scale
412
+ hidden_states = original_embedding
413
+ positions = torch.arange(
414
+ past_length,
415
+ total_length,
416
+ dtype=torch.float32,
417
+ device=input_ids.device,
418
+ )
419
+ cosine, sine = _rope_cos_sin(
420
+ self.config.head_dim,
421
+ positions,
422
+ self.config.rope_theta,
423
+ )
424
+ for block in self.transformer["h"]:
425
+ hidden_states = block(
426
+ hidden_states,
427
+ original_embedding,
428
+ cosine,
429
+ sine,
430
+ attention_mask,
431
+ past_key_values,
432
+ )
433
+ hidden_states = self.transformer["ln_f"](hidden_states)
434
+ logits = self.lm_head(hidden_states)
435
+
436
+ loss = None
437
+ if labels is not None:
438
+ loss = F.cross_entropy(
439
+ logits[..., :-1, :].float().reshape(-1, logits.size(-1)),
440
+ labels[..., 1:].reshape(-1),
441
+ ignore_index=-100,
442
+ )
443
+ return CausalLMOutputWithPast(
444
+ loss=loss,
445
+ logits=logits,
446
+ past_key_values=past_key_values,
447
+ )
448
+
449
+
450
+ BananaMind2PicoForCausalLM.register_for_auto_class("AutoModelForCausalLM")
451
+
452
+ __all__ = [
453
+ "BananaMind2PicoCache",
454
+ "BananaMind2PicoForCausalLM",
455
+ "BananaMind2PicoPreTrainedModel",
456
+ ]
special_tokens_map.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "pad_token": "<|pad|>",
3
+ "bos_token": "<|bos|>",
4
+ "eos_token": "<|eos|>",
5
+ "unk_token": "<|unk|>"
6
+ }
tokenizer.json ADDED
@@ -0,0 +1,991 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "version": "1.0",
3
+ "truncation": null,
4
+ "padding": null,
5
+ "added_tokens": [
6
+ {
7
+ "id": 0,
8
+ "content": "<|pad|>",
9
+ "single_word": false,
10
+ "lstrip": false,
11
+ "rstrip": false,
12
+ "normalized": false,
13
+ "special": true
14
+ },
15
+ {
16
+ "id": 1,
17
+ "content": "<|bos|>",
18
+ "single_word": false,
19
+ "lstrip": false,
20
+ "rstrip": false,
21
+ "normalized": false,
22
+ "special": true
23
+ },
24
+ {
25
+ "id": 2,
26
+ "content": "<|eos|>",
27
+ "single_word": false,
28
+ "lstrip": false,
29
+ "rstrip": false,
30
+ "normalized": false,
31
+ "special": true
32
+ },
33
+ {
34
+ "id": 3,
35
+ "content": "<|unk|>",
36
+ "single_word": false,
37
+ "lstrip": false,
38
+ "rstrip": false,
39
+ "normalized": false,
40
+ "special": true
41
+ }
42
+ ],
43
+ "normalizer": {
44
+ "type": "NFKC"
45
+ },
46
+ "pre_tokenizer": {
47
+ "type": "Sequence",
48
+ "pretokenizers": [
49
+ {
50
+ "type": "Split",
51
+ "pattern": {
52
+ "Regex": "\\d"
53
+ },
54
+ "behavior": "Isolated",
55
+ "invert": false
56
+ },
57
+ {
58
+ "type": "ByteLevel",
59
+ "add_prefix_space": false,
60
+ "trim_offsets": true,
61
+ "use_regex": true
62
+ }
63
+ ]
64
+ },
65
+ "post_processor": {
66
+ "type": "TemplateProcessing",
67
+ "single": [
68
+ {
69
+ "Sequence": {
70
+ "id": "A",
71
+ "type_id": 0
72
+ }
73
+ }
74
+ ],
75
+ "pair": [
76
+ {
77
+ "Sequence": {
78
+ "id": "A",
79
+ "type_id": 0
80
+ }
81
+ },
82
+ {
83
+ "Sequence": {
84
+ "id": "B",
85
+ "type_id": 1
86
+ }
87
+ }
88
+ ],
89
+ "special_tokens": {}
90
+ },
91
+ "decoder": {
92
+ "type": "ByteLevel",
93
+ "add_prefix_space": true,
94
+ "trim_offsets": true,
95
+ "use_regex": true
96
+ },
97
+ "model": {
98
+ "type": "BPE",
99
+ "dropout": null,
100
+ "unk_token": "<|unk|>",
101
+ "continuing_subword_prefix": null,
102
+ "end_of_word_suffix": null,
103
+ "fuse_unk": false,
104
+ "byte_fallback": false,
105
+ "ignore_merges": false,
106
+ "vocab": {
107
+ "<|pad|>": 0,
108
+ "<|bos|>": 1,
109
+ "<|eos|>": 2,
110
+ "<|unk|>": 3,
111
+ "!": 4,
112
+ "\"": 5,
113
+ "#": 6,
114
+ "$": 7,
115
+ "%": 8,
116
+ "&": 9,
117
+ "'": 10,
118
+ "(": 11,
119
+ ")": 12,
120
+ "*": 13,
121
+ "+": 14,
122
+ ",": 15,
123
+ "-": 16,
124
+ ".": 17,
125
+ "/": 18,
126
+ "0": 19,
127
+ "1": 20,
128
+ "2": 21,
129
+ "3": 22,
130
+ "4": 23,
131
+ "5": 24,
132
+ "6": 25,
133
+ "7": 26,
134
+ "8": 27,
135
+ "9": 28,
136
+ ":": 29,
137
+ ";": 30,
138
+ "<": 31,
139
+ "=": 32,
140
+ ">": 33,
141
+ "?": 34,
142
+ "@": 35,
143
+ "A": 36,
144
+ "B": 37,
145
+ "C": 38,
146
+ "D": 39,
147
+ "E": 40,
148
+ "F": 41,
149
+ "G": 42,
150
+ "H": 43,
151
+ "I": 44,
152
+ "J": 45,
153
+ "K": 46,
154
+ "L": 47,
155
+ "M": 48,
156
+ "N": 49,
157
+ "O": 50,
158
+ "P": 51,
159
+ "Q": 52,
160
+ "R": 53,
161
+ "S": 54,
162
+ "T": 55,
163
+ "U": 56,
164
+ "V": 57,
165
+ "W": 58,
166
+ "X": 59,
167
+ "Y": 60,
168
+ "Z": 61,
169
+ "[": 62,
170
+ "\\": 63,
171
+ "]": 64,
172
+ "^": 65,
173
+ "_": 66,
174
+ "`": 67,
175
+ "a": 68,
176
+ "b": 69,
177
+ "c": 70,
178
+ "d": 71,
179
+ "e": 72,
180
+ "f": 73,
181
+ "g": 74,
182
+ "h": 75,
183
+ "i": 76,
184
+ "j": 77,
185
+ "k": 78,
186
+ "l": 79,
187
+ "m": 80,
188
+ "n": 81,
189
+ "o": 82,
190
+ "p": 83,
191
+ "q": 84,
192
+ "r": 85,
193
+ "s": 86,
194
+ "t": 87,
195
+ "u": 88,
196
+ "v": 89,
197
+ "w": 90,
198
+ "x": 91,
199
+ "y": 92,
200
+ "z": 93,
201
+ "{": 94,
202
+ "|": 95,
203
+ "}": 96,
204
+ "~": 97,
205
+ "¡": 98,
206
+ "¢": 99,
207
+ "£": 100,
208
+ "¤": 101,
209
+ "¥": 102,
210
+ "¦": 103,
211
+ "§": 104,
212
+ "¨": 105,
213
+ "©": 106,
214
+ "ª": 107,
215
+ "«": 108,
216
+ "¬": 109,
217
+ "®": 110,
218
+ "¯": 111,
219
+ "°": 112,
220
+ "±": 113,
221
+ "²": 114,
222
+ "³": 115,
223
+ "´": 116,
224
+ "µ": 117,
225
+ "¶": 118,
226
+ "·": 119,
227
+ "¸": 120,
228
+ "¹": 121,
229
+ "º": 122,
230
+ "»": 123,
231
+ "¼": 124,
232
+ "½": 125,
233
+ "¾": 126,
234
+ "¿": 127,
235
+ "À": 128,
236
+ "Á": 129,
237
+ "Â": 130,
238
+ "Ã": 131,
239
+ "Ä": 132,
240
+ "Å": 133,
241
+ "Æ": 134,
242
+ "Ç": 135,
243
+ "È": 136,
244
+ "É": 137,
245
+ "Ê": 138,
246
+ "Ë": 139,
247
+ "Ì": 140,
248
+ "Í": 141,
249
+ "Î": 142,
250
+ "Ï": 143,
251
+ "Ð": 144,
252
+ "Ñ": 145,
253
+ "Ò": 146,
254
+ "Ó": 147,
255
+ "Ô": 148,
256
+ "Õ": 149,
257
+ "Ö": 150,
258
+ "×": 151,
259
+ "Ø": 152,
260
+ "Ù": 153,
261
+ "Ú": 154,
262
+ "Û": 155,
263
+ "Ü": 156,
264
+ "Ý": 157,
265
+ "Þ": 158,
266
+ "ß": 159,
267
+ "à": 160,
268
+ "á": 161,
269
+ "â": 162,
270
+ "ã": 163,
271
+ "ä": 164,
272
+ "å": 165,
273
+ "æ": 166,
274
+ "ç": 167,
275
+ "è": 168,
276
+ "é": 169,
277
+ "ê": 170,
278
+ "ë": 171,
279
+ "ì": 172,
280
+ "í": 173,
281
+ "î": 174,
282
+ "ï": 175,
283
+ "ð": 176,
284
+ "ñ": 177,
285
+ "ò": 178,
286
+ "ó": 179,
287
+ "ô": 180,
288
+ "õ": 181,
289
+ "ö": 182,
290
+ "÷": 183,
291
+ "ø": 184,
292
+ "ù": 185,
293
+ "ú": 186,
294
+ "û": 187,
295
+ "ü": 188,
296
+ "ý": 189,
297
+ "þ": 190,
298
+ "ÿ": 191,
299
+ "Ā": 192,
300
+ "ā": 193,
301
+ "Ă": 194,
302
+ "ă": 195,
303
+ "Ą": 196,
304
+ "ą": 197,
305
+ "Ć": 198,
306
+ "ć": 199,
307
+ "Ĉ": 200,
308
+ "ĉ": 201,
309
+ "Ċ": 202,
310
+ "ċ": 203,
311
+ "Č": 204,
312
+ "č": 205,
313
+ "Ď": 206,
314
+ "ď": 207,
315
+ "Đ": 208,
316
+ "đ": 209,
317
+ "Ē": 210,
318
+ "ē": 211,
319
+ "Ĕ": 212,
320
+ "ĕ": 213,
321
+ "Ė": 214,
322
+ "ė": 215,
323
+ "Ę": 216,
324
+ "ę": 217,
325
+ "Ě": 218,
326
+ "ě": 219,
327
+ "Ĝ": 220,
328
+ "ĝ": 221,
329
+ "Ğ": 222,
330
+ "ğ": 223,
331
+ "Ġ": 224,
332
+ "ġ": 225,
333
+ "Ģ": 226,
334
+ "ģ": 227,
335
+ "Ĥ": 228,
336
+ "ĥ": 229,
337
+ "Ħ": 230,
338
+ "ħ": 231,
339
+ "Ĩ": 232,
340
+ "ĩ": 233,
341
+ "Ī": 234,
342
+ "ī": 235,
343
+ "Ĭ": 236,
344
+ "ĭ": 237,
345
+ "Į": 238,
346
+ "į": 239,
347
+ "İ": 240,
348
+ "ı": 241,
349
+ "IJ": 242,
350
+ "ij": 243,
351
+ "Ĵ": 244,
352
+ "ĵ": 245,
353
+ "Ķ": 246,
354
+ "ķ": 247,
355
+ "ĸ": 248,
356
+ "Ĺ": 249,
357
+ "ĺ": 250,
358
+ "Ļ": 251,
359
+ "ļ": 252,
360
+ "Ľ": 253,
361
+ "ľ": 254,
362
+ "Ŀ": 255,
363
+ "ŀ": 256,
364
+ "Ł": 257,
365
+ "ł": 258,
366
+ "Ń": 259,
367
+ "Ġt": 260,
368
+ "Ġa": 261,
369
+ "in": 262,
370
+ "he": 263,
371
+ "re": 264,
372
+ "on": 265,
373
+ "Ġthe": 266,
374
+ "er": 267,
375
+ "Ġs": 268,
376
+ "at": 269,
377
+ "Ġo": 270,
378
+ "en": 271,
379
+ "Ġc": 272,
380
+ "Ġw": 273,
381
+ "es": 274,
382
+ "nd": 275,
383
+ "it": 276,
384
+ "ing": 277,
385
+ "is": 278,
386
+ "or": 279,
387
+ "ou": 280,
388
+ "al": 281,
389
+ "Ġp": 282,
390
+ "ed": 283,
391
+ "Ġf": 284,
392
+ "an": 285,
393
+ "Ġb": 286,
394
+ "Ġin": 287,
395
+ "ar": 288,
396
+ "Ġof": 289,
397
+ "Ġm": 290,
398
+ "Ġand": 291,
399
+ "Ġto": 292,
400
+ "Ġd": 293,
401
+ "ion": 294,
402
+ "ic": 295,
403
+ "le": 296,
404
+ "om": 297,
405
+ "Ġh": 298,
406
+ "as": 299,
407
+ "Ġth": 300,
408
+ "ent": 301,
409
+ "Ġe": 302,
410
+ "Ġre": 303,
411
+ "ct": 304,
412
+ "il": 305,
413
+ "ro": 306,
414
+ "Ġl": 307,
415
+ "st": 308,
416
+ "ve": 309,
417
+ "Ġn": 310,
418
+ "ly": 311,
419
+ "et": 312,
420
+ "Ġy": 313,
421
+ "Ġg": 314,
422
+ "id": 315,
423
+ "im": 316,
424
+ "ĠT": 317,
425
+ "se": 318,
426
+ "ation": 319,
427
+ "Ġbe": 320,
428
+ "ol": 321,
429
+ "ce": 322,
430
+ "ur": 323,
431
+ "ut": 324,
432
+ "ow": 325,
433
+ "ra": 326,
434
+ "ot": 327,
435
+ "ig": 328,
436
+ "Ġyou": 329,
437
+ "Ġis": 330,
438
+ "Ġu": 331,
439
+ "ĠS": 332,
440
+ "ĠA": 333,
441
+ "ĠI": 334,
442
+ "Ġfor": 335,
443
+ "ch": 336,
444
+ "ver": 337,
445
+ "Ġon": 338,
446
+ "Ġst": 339,
447
+ "am": 340,
448
+ "ay": 341,
449
+ "ĠC": 342,
450
+ "Ġthat": 343,
451
+ "ir": 344,
452
+ "ith": 345,
453
+ "el": 346,
454
+ "Ġhe": 347,
455
+ "ul": 348,
456
+ "ad": 349,
457
+ "âĢ": 350,
458
+ "Ġcon": 351,
459
+ "Ġwith": 352,
460
+ "Ġas": 353,
461
+ "ter": 354,
462
+ "if": 355,
463
+ "Ġwh": 356,
464
+ "Ġan": 357,
465
+ "Ġit": 358,
466
+ "ĠM": 359,
467
+ "Ġor": 360,
468
+ "Ġpro": 361,
469
+ "Ġal": 362,
470
+ "her": 363,
471
+ "ers": 364,
472
+ "em": 365,
473
+ "od": 366,
474
+ "ess": 367,
475
+ "Ġex": 368,
476
+ "ate": 369,
477
+ "ĠB": 370,
478
+ "ag": 371,
479
+ "ist": 372,
480
+ "Ġcom": 373,
481
+ "ri": 374,
482
+ "ĠP": 375,
483
+ "us": 376,
484
+ "ill": 377,
485
+ "res": 378,
486
+ "pp": 379,
487
+ "ab": 380,
488
+ "ke": 381,
489
+ "th": 382,
490
+ "ĠH": 383
491
+ },
492
+ "merges": [
493
+ [
494
+ "Ġ",
495
+ "t"
496
+ ],
497
+ [
498
+ "Ġ",
499
+ "a"
500
+ ],
501
+ [
502
+ "i",
503
+ "n"
504
+ ],
505
+ [
506
+ "h",
507
+ "e"
508
+ ],
509
+ [
510
+ "r",
511
+ "e"
512
+ ],
513
+ [
514
+ "o",
515
+ "n"
516
+ ],
517
+ [
518
+ "Ġt",
519
+ "he"
520
+ ],
521
+ [
522
+ "e",
523
+ "r"
524
+ ],
525
+ [
526
+ "Ġ",
527
+ "s"
528
+ ],
529
+ [
530
+ "a",
531
+ "t"
532
+ ],
533
+ [
534
+ "Ġ",
535
+ "o"
536
+ ],
537
+ [
538
+ "e",
539
+ "n"
540
+ ],
541
+ [
542
+ "Ġ",
543
+ "c"
544
+ ],
545
+ [
546
+ "Ġ",
547
+ "w"
548
+ ],
549
+ [
550
+ "e",
551
+ "s"
552
+ ],
553
+ [
554
+ "n",
555
+ "d"
556
+ ],
557
+ [
558
+ "i",
559
+ "t"
560
+ ],
561
+ [
562
+ "in",
563
+ "g"
564
+ ],
565
+ [
566
+ "i",
567
+ "s"
568
+ ],
569
+ [
570
+ "o",
571
+ "r"
572
+ ],
573
+ [
574
+ "o",
575
+ "u"
576
+ ],
577
+ [
578
+ "a",
579
+ "l"
580
+ ],
581
+ [
582
+ "Ġ",
583
+ "p"
584
+ ],
585
+ [
586
+ "e",
587
+ "d"
588
+ ],
589
+ [
590
+ "Ġ",
591
+ "f"
592
+ ],
593
+ [
594
+ "a",
595
+ "n"
596
+ ],
597
+ [
598
+ "Ġ",
599
+ "b"
600
+ ],
601
+ [
602
+ "Ġ",
603
+ "in"
604
+ ],
605
+ [
606
+ "a",
607
+ "r"
608
+ ],
609
+ [
610
+ "Ġo",
611
+ "f"
612
+ ],
613
+ [
614
+ "Ġ",
615
+ "m"
616
+ ],
617
+ [
618
+ "Ġa",
619
+ "nd"
620
+ ],
621
+ [
622
+ "Ġt",
623
+ "o"
624
+ ],
625
+ [
626
+ "Ġ",
627
+ "d"
628
+ ],
629
+ [
630
+ "i",
631
+ "on"
632
+ ],
633
+ [
634
+ "i",
635
+ "c"
636
+ ],
637
+ [
638
+ "l",
639
+ "e"
640
+ ],
641
+ [
642
+ "o",
643
+ "m"
644
+ ],
645
+ [
646
+ "Ġ",
647
+ "h"
648
+ ],
649
+ [
650
+ "a",
651
+ "s"
652
+ ],
653
+ [
654
+ "Ġt",
655
+ "h"
656
+ ],
657
+ [
658
+ "en",
659
+ "t"
660
+ ],
661
+ [
662
+ "Ġ",
663
+ "e"
664
+ ],
665
+ [
666
+ "Ġ",
667
+ "re"
668
+ ],
669
+ [
670
+ "c",
671
+ "t"
672
+ ],
673
+ [
674
+ "i",
675
+ "l"
676
+ ],
677
+ [
678
+ "r",
679
+ "o"
680
+ ],
681
+ [
682
+ "Ġ",
683
+ "l"
684
+ ],
685
+ [
686
+ "s",
687
+ "t"
688
+ ],
689
+ [
690
+ "v",
691
+ "e"
692
+ ],
693
+ [
694
+ "Ġ",
695
+ "n"
696
+ ],
697
+ [
698
+ "l",
699
+ "y"
700
+ ],
701
+ [
702
+ "e",
703
+ "t"
704
+ ],
705
+ [
706
+ "Ġ",
707
+ "y"
708
+ ],
709
+ [
710
+ "Ġ",
711
+ "g"
712
+ ],
713
+ [
714
+ "i",
715
+ "d"
716
+ ],
717
+ [
718
+ "i",
719
+ "m"
720
+ ],
721
+ [
722
+ "Ġ",
723
+ "T"
724
+ ],
725
+ [
726
+ "s",
727
+ "e"
728
+ ],
729
+ [
730
+ "at",
731
+ "ion"
732
+ ],
733
+ [
734
+ "Ġb",
735
+ "e"
736
+ ],
737
+ [
738
+ "o",
739
+ "l"
740
+ ],
741
+ [
742
+ "c",
743
+ "e"
744
+ ],
745
+ [
746
+ "u",
747
+ "r"
748
+ ],
749
+ [
750
+ "u",
751
+ "t"
752
+ ],
753
+ [
754
+ "o",
755
+ "w"
756
+ ],
757
+ [
758
+ "r",
759
+ "a"
760
+ ],
761
+ [
762
+ "o",
763
+ "t"
764
+ ],
765
+ [
766
+ "i",
767
+ "g"
768
+ ],
769
+ [
770
+ "Ġy",
771
+ "ou"
772
+ ],
773
+ [
774
+ "Ġ",
775
+ "is"
776
+ ],
777
+ [
778
+ "Ġ",
779
+ "u"
780
+ ],
781
+ [
782
+ "Ġ",
783
+ "S"
784
+ ],
785
+ [
786
+ "Ġ",
787
+ "A"
788
+ ],
789
+ [
790
+ "Ġ",
791
+ "I"
792
+ ],
793
+ [
794
+ "Ġf",
795
+ "or"
796
+ ],
797
+ [
798
+ "c",
799
+ "h"
800
+ ],
801
+ [
802
+ "v",
803
+ "er"
804
+ ],
805
+ [
806
+ "Ġ",
807
+ "on"
808
+ ],
809
+ [
810
+ "Ġs",
811
+ "t"
812
+ ],
813
+ [
814
+ "a",
815
+ "m"
816
+ ],
817
+ [
818
+ "a",
819
+ "y"
820
+ ],
821
+ [
822
+ "Ġ",
823
+ "C"
824
+ ],
825
+ [
826
+ "Ġth",
827
+ "at"
828
+ ],
829
+ [
830
+ "i",
831
+ "r"
832
+ ],
833
+ [
834
+ "it",
835
+ "h"
836
+ ],
837
+ [
838
+ "e",
839
+ "l"
840
+ ],
841
+ [
842
+ "Ġ",
843
+ "he"
844
+ ],
845
+ [
846
+ "u",
847
+ "l"
848
+ ],
849
+ [
850
+ "a",
851
+ "d"
852
+ ],
853
+ [
854
+ "â",
855
+ "Ģ"
856
+ ],
857
+ [
858
+ "Ġc",
859
+ "on"
860
+ ],
861
+ [
862
+ "Ġw",
863
+ "ith"
864
+ ],
865
+ [
866
+ "Ġa",
867
+ "s"
868
+ ],
869
+ [
870
+ "t",
871
+ "er"
872
+ ],
873
+ [
874
+ "i",
875
+ "f"
876
+ ],
877
+ [
878
+ "Ġw",
879
+ "h"
880
+ ],
881
+ [
882
+ "Ġa",
883
+ "n"
884
+ ],
885
+ [
886
+ "Ġ",
887
+ "it"
888
+ ],
889
+ [
890
+ "Ġ",
891
+ "M"
892
+ ],
893
+ [
894
+ "Ġo",
895
+ "r"
896
+ ],
897
+ [
898
+ "Ġp",
899
+ "ro"
900
+ ],
901
+ [
902
+ "Ġa",
903
+ "l"
904
+ ],
905
+ [
906
+ "he",
907
+ "r"
908
+ ],
909
+ [
910
+ "er",
911
+ "s"
912
+ ],
913
+ [
914
+ "e",
915
+ "m"
916
+ ],
917
+ [
918
+ "o",
919
+ "d"
920
+ ],
921
+ [
922
+ "es",
923
+ "s"
924
+ ],
925
+ [
926
+ "Ġe",
927
+ "x"
928
+ ],
929
+ [
930
+ "at",
931
+ "e"
932
+ ],
933
+ [
934
+ "Ġ",
935
+ "B"
936
+ ],
937
+ [
938
+ "a",
939
+ "g"
940
+ ],
941
+ [
942
+ "is",
943
+ "t"
944
+ ],
945
+ [
946
+ "Ġc",
947
+ "om"
948
+ ],
949
+ [
950
+ "r",
951
+ "i"
952
+ ],
953
+ [
954
+ "Ġ",
955
+ "P"
956
+ ],
957
+ [
958
+ "u",
959
+ "s"
960
+ ],
961
+ [
962
+ "il",
963
+ "l"
964
+ ],
965
+ [
966
+ "re",
967
+ "s"
968
+ ],
969
+ [
970
+ "p",
971
+ "p"
972
+ ],
973
+ [
974
+ "a",
975
+ "b"
976
+ ],
977
+ [
978
+ "k",
979
+ "e"
980
+ ],
981
+ [
982
+ "t",
983
+ "h"
984
+ ],
985
+ [
986
+ "Ġ",
987
+ "H"
988
+ ]
989
+ ]
990
+ }
991
+ }
tokenizer_config.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backend": "tokenizers",
3
+ "bos_token": "<|bos|>",
4
+ "clean_up_tokenization_spaces": false,
5
+ "eos_token": "<|eos|>",
6
+ "model_max_length": 4096,
7
+ "pad_token": "<|pad|>",
8
+ "tokenizer_class": "TokenizersBackend",
9
+ "unk_token": "<|unk|>"
10
+ }
tokenizer_training_manifest.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "format": "bananamind2_pico_tokenizer_v1",
3
+ "stage": "tokenizer_complete",
4
+ "vocab_size": 384,
5
+ "model_max_length": 8192,
6
+ "target_gib": 1.0,
7
+ "sources": [
8
+ {
9
+ "name": "fineweb_hq",
10
+ "dataset_id": "epfml/FineWeb-HQ",
11
+ "config": null,
12
+ "text_field": "text",
13
+ "byte_share": 0.75,
14
+ "revision": "e58199cdd52438d94405df1a4d8630cc5f13bf84",
15
+ "target_bytes": 805306368,
16
+ "consumed_bytes": 805307468
17
+ },
18
+ {
19
+ "name": "cosmopedia_v2",
20
+ "dataset_id": "HuggingFaceTB/smollm-corpus",
21
+ "config": "cosmopedia-v2",
22
+ "text_field": "text",
23
+ "byte_share": 0.25,
24
+ "revision": "3ba9d605774198c5868892d7a8deda78031a781f",
25
+ "target_bytes": 268435456,
26
+ "consumed_bytes": 268438475
27
+ }
28
+ ]
29
+ }
training_metrics.jsonl ADDED
The diff for this file is too large to render. See raw diff