File size: 7,939 Bytes
271e253
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0ff3621
271e253
 
22bc47a
271e253
22bc47a
0ff3621
22bc47a
 
 
 
 
 
 
 
 
 
 
0ff3621
271e253
 
 
 
 
 
 
 
0ff3621
271e253
 
 
 
 
 
 
 
 
22bc47a
271e253
22bc47a
271e253
 
 
 
 
2fd4f23
271e253
22bc47a
 
 
 
2fd4f23
271e253
 
 
 
 
2fd4f23
271e253
22bc47a
271e253
2fd4f23
22bc47a
2fd4f23
 
271e253
22bc47a
 
 
 
 
271e253
2fd4f23
271e253
 
8e2c90b
 
 
 
 
 
 
 
271e253
 
8e2c90b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
271e253
 
 
 
2fd4f23
271e253
 
5d9154e
271e253
 
 
 
5d9154e
271e253
 
 
 
2fd4f23
271e253
 
2fd4f23
 
 
271e253
 
2fd4f23
271e253
 
 
2fd4f23
 
 
 
 
22bc47a
8e2c90b
 
 
 
 
 
271e253
 
 
 
 
2fd4f23
 
 
 
 
271e253
 
 
 
 
 
 
 
 
 
 
 
 
0ff3621
271e253
 
 
 
2fd4f23
271e253
 
 
 
 
 
 
2fd4f23
5d9154e
2fd4f23
271e253
0ff3621
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
---
license: apache-2.0
language:
- en
pipeline_tag: text-generation
tags:
- causal-lm
- gpt
- small-language-model
- arithmetic
- custom-tokenizer
- custom-code
- safetensors
- lm-evaluation-harness
datasets:
- openbmb/Ultra-FineWeb
- HuggingFaceFW/fineweb-edu
- HuggingFaceTB/finemath
- HuggingFaceTB/smollm-corpus
---

![bg](bg.png)

# Atom2.7m

Atom2.7m is a 2.74M-parameter causal language model for text continuation, with an arithmetic-aware tokenizer and digit-feature pathway designed to improve integer arithmetic behavior at very small scale.

The model keeps ordinary byte-level BPE behavior for general text while adding structured handling for arithmetic-sensitive spans: digits are atomic, operators are isolated, digit spans are represented least-significant-digit first, and derived place/role features are passed to the model.

On ArithMark 2.0, Atom2.7m reaches 69.24% accuracy, making it an unusually strong arithmetic-continuation model for its size. It should be understood as a compact research model for language modeling, tiny-LM experiments, arithmetic-aware tokenization, and resource-constrained inference, not as a chat assistant or broad mathematical reasoning system.

## Key result

| Model | Parameters | ArithMark 2.0 accuracy |
|---|---:|---:|
| Atom2.7m | 2.74M | **69.24%** |
| SmolLM2-1.7B | 1.7B | 66.12% |
| Qwen2.5-0.5B | 0.5B | 63.04% |

This comparison is limited to **ArithMark 2.0**. Atom2.7m is not claimed to be generally stronger than larger models; the result highlights the value of arithmetic-aware representation for integer arithmetic continuation.

## Model Details

- Architecture: decoder-only GPT
- Parameters: 2,738,880
- Layers: 5
- Hidden size: 192
- Attention heads: 4
- KV heads: 2
- Attention: grouped-query causal self-attention with RoPE and XSA projection
- Context length: 512
- Vocabulary size: 4,096
- Token embeddings: tied input/output embeddings
- Arithmetic feature embeddings:
  - `place_vocab_size`: 66
  - `role_vocab_size`: 12

## Tokenizer

Most tokenizers represent numbers as ordinary text fragments, which can obscure digit structure. Atom2.7m keeps normal byte-level BPE for general text, but uses a structured arithmetic path for numeric expressions.

For arithmetic-sensitive spans:

- digits `0`-`9` are atomic and never BPE-merged
- digit spans are emitted least-significant-digit first
- `+ - * / = ( )` are isolated atomic tokens
- whitespace is isolated from text
- arithmetic feature IDs are derived by the model from token IDs at inference time

This gives a very small causal LM an inductive bias that is better aligned with elementary integer arithmetic.

Use this model with `trust_remote_code=True`. The submission includes an `AtomTokenizer` remote-code wrapper in `tokenization_atom.py` so standard Hugging Face callers can use `AutoTokenizer.from_pretrained(...)`.

Training and custom tooling may still pass aligned `place_ids` and `role_ids`, but generic inference and evaluation only need `input_ids` and `attention_mask`.

## Usage

```python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = "UniversalComputingResearch/Atom2.7m"

tokenizer = AutoTokenizer.from_pretrained(
    model_id,
    trust_remote_code=True,
)

model = AutoModelForCausalLM.from_pretrained(
    model_id,
    trust_remote_code=True,
).eval()

text = "12 + 34 ="
inputs = tokenizer(text, return_tensors="pt", add_special_tokens=False)

with torch.no_grad():
    output_ids = model.generate(
        **inputs,
        max_new_tokens=3,
        do_sample=False,
    )

print(tokenizer.decode(output_ids[0], skip_special_tokens=True))
# 12 + 34 = 46
```

### Generation Cache

Atom2.7m derives arithmetic `place_ids` and `role_ids` from the full token sequence. During arithmetic generation, result digits need those features to be recomputed from the full current prefix. For this reason, the checkpoint defaults to `use_cache=False` for `model.generate(...)`. This is slower than KV-cache generation, but preserves the arithmetic feature annotations used by the model.

You can opt into faster cached generation when exact arithmetic-aware generation is not required:

```python
output_ids = model.generate(
    **inputs,
    max_new_tokens=32,
    use_cache=True,
)
```

Cached generation remains supported, but for arithmetic continuations it may
produce lower-quality results unless the caller supplies correctly updated
`place_ids` and `role_ids`.

## Evaluation

### ArithMark 2.0

Use the included benchmark script:

```bash
python benchmark_atom_arithmark.py \
  --checkpoint . \
  --data-path arithmark_2.0.jsonl \
  --batch-size 64 \
  --device cuda \
  --output benchmark_results/atom_arithmark_2.0_results.json
```

### lm-evaluation-harness

For lm-evaluation-harness tasks, use the standard `hf` model with remote code enabled:

```bash
lm_eval \
  --model hf \
  --model_args pretrained=.,trust_remote_code=True,dtype=bfloat16,max_length=548 \
  --tasks hellaswag,arc_easy,arc_challenge,piqa \
  --device cuda:0 \
  --batch_size auto:1 \
  --output_path benchmark_results/lm_eval
```

`max_length=548` is passed to the lm-evaluation-harness wrapper so long
multiple-choice continuations do not trip the harness assertion that a
continuation must fit inside the model window. The tokenizer also advertises
`model_max_length=548`, matching the longest sequence observed in this eval run.
The checkpoint was trained with a 512-token context, but the RoPE
implementation can score this slightly longer harness window.

For multiple-choice or benchmark-style evaluation, no special generation cache
setting is required. Log-likelihood scoring runs full `context + continuation`
forward passes, so arithmetic features are derived from the complete sequence.
This is the path used by the included ArithMark benchmark script and by
lm-evaluation-harness log-likelihood tasks.

## Results

| Benchmark | Metric | Value |
| --- | --- | ---: |
| ArithMark 2.0 | acc | 0.6924 |
| arc_challenge | acc_norm | 0.2099 |
| arc_easy | acc_norm | 0.3161 |
| hellaswag | acc_norm | 0.2701 |
| piqa | acc_norm | 0.5299 |

## Training Data

The pretraining mixture targeted about 3.5B tokens:

- Ultra-FineWeb: 900M
- FineWeb-Edu: 900M
- FineMath: 450M
- Cosmopedia-v2: 337.5M
- UltraData-Math-L2-preview: 337.5M
- Ultra-FineWeb-L3-en-QA-Synthetic: 225M
- Synthetic-Arithmetic: 350M

Synthetic-Arithmetic is canonical integer equation data. The training curriculum is included as `pretraining_curriculum.json`.

## Limitations

- This is a very small model and should be treated as an experimental research artifact.
- Use `trust_remote_code=True` so `AutoTokenizer` applies the digit-span transform.
- Numeric text is represented least-significant-digit first internally.
- Role annotations intentionally target strict integer equations, not broad math prose, decimals, rationals, or QA formats.

## Files

- `model.safetensors`: model weights
- `config.json`, `config.py`, `configuration_gpt.py`, `model.py`: custom model code
- `tokenizer.json`, `tokenization_atom.py`: tokenizer files and remote-code wrapper
- `benchmark_atom_arithmark.py`: ArithMark evaluation
- `arithmark_2.0.jsonl`: local ArithMark 2.0 data for the standalone benchmark script
- `pretraining_curriculum.json`: training curriculum

## References / Design Influences

- [Attention Is All You Need](https://arxiv.org/abs/1706.03762) - additive positional information in Transformer inputs
- [Exclusive Self Attention](https://arxiv.org/abs/2603.09078) - related attention work on reducing self-position dominance in sequence modeling
- [Position Coupling: Improving Length Generalization of Arithmetic Transformers Using Task Structure](https://arxiv.org/abs/2405.20671) - coupling digit positions by arithmetic significance
- [Transformers Can Do Arithmetic with the Right Embeddings](https://arxiv.org/abs/2405.17399) - digit-position embeddings for arithmetic