Squeal-Studio/drakon_28m-base
drakon_28m-base is a compact ~28M parameter language model pretrained from scratch on Russian-language text. It uses a hybrid architecture combining Depthwise Causal Conv, MinGRU, and Full Causal Attention with RoPE — every 3rd block is an attention block.
This is a base model (pretraining only). Instruction-tuned (SFT) version is in progress.
Research and Experimental Model. Designed for experimentation and research. Given its size, performance on complex tasks will be limited.
Model Description
- Architecture: Drakon (Depthwise Conv + MinGRU + Causal Attention with RoPE)
- Parameters: ~28.5M
- Tokenizer: Custom BPE, vocab_size = 24,001
- Context length: 1024 tokens
Architecture Details
| Parameter | Value |
|---|---|
| hidden_size | 448 |
| num_layers | 12 |
| num_attention_heads | 8 |
| attention_every_n_layers | 3 |
| num_attention_layers | 4 |
| num_mingru_layers | 8 |
| conv_kernel_size | 4 |
| ffn_ratio | 2.0 |
| dropout | 0.1 |
| position_embedding | RoPE |
| normalization | RMSNorm (pre-norm) |
| block_pattern | [ConvMinGRU, ConvMinGRU, Attention] x 4 |
Training Details
- Dataset: ~5.5M documents, 10gb, ~1.5B unique tokens, ~3B tokens total (2 epochs)
- Preprocessing: Unicode normalization (NFKC), Cyrillic-ratio filtering, degenerate-repetition filtering, digit/punctuation-ratio filtering, Wikipedia, Fineweb2, cultura paragraph-level chunking, short-utterance grouping, exact deduplication (SHA-256), and approximate deduplication (MinHash/LSH)
- Sequence length: 1024 tokens
- Epochs: 2
- Batch size: 16 per device, gradient accumulation steps 8 (effective batch size 128)
- Learning rate: 4e-4 (cosine schedule, warmup 1500 steps)
- Weight decay: 0.01
- Max grad norm: 1.0
- Steps: 22,924
- Precision: fp16
- Seed: 42
Sources:
| Source | Documents | Characters |
|---|---|---|
| cultura_ru_edu | 649,700 | 1,194,216,253 |
| fineweb2_ru | 649,493 | 1,107,124,811 |
| wikipedia | 642,803 | 1,078,959,165 |
| taiga_proza | 549,206 | 967,503,171 |
| habr | 499,169 | 830,954,448 |
| ru_news | 329,573 | 552,286,936 |
| opensubtitles | 199,970 | 104,917,728 |
Evaluation
| Step | Eval Loss | Perplexity |
|---|---|---|
| 5,000 | 3.4508 | 31.5 |
| 10,000 | 3.2175 | 25.0 |
| 15,000 | 3.1293 | 22.9 |
| 22,924 | 3.0893 | 22.0 |
Training Curve

Usage
from transformers import AutoModelForCausalLM, AutoTokenizer
repo = "Squeal-Studio/drakon_28m-base"
tok = AutoTokenizer.from_pretrained(repo, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(repo, trust_remote_code=True).eval().cuda()
inputs = tok("Однажды в лесу", return_tensors="pt").to("cuda")
inputs.pop("token_type_ids", None)
out = model.generate(
**inputs,
max_new_tokens=150,
do_sample=True,
temperature=0.8,
top_k=50,
repetition_penalty=1.1,
)
print(tok.decode(out[0], skip_special_tokens=True))
Generation Examples
Prompt: Однажды утром я проснулся и
Однажды утром я проснулся и почувствовал, как в ушах у меня мелькает голос: "Скажи
мне, что ты не хочешь быть рядом с тобой"
- Я... - прошептал он. — Ты же знаешь, что это так. Это был мой первый шанс!
Мне было страшно! И когда мы шли к нему домой, то его лицо стало совсем светло.
Он смотрел на меня с улыбкой и говорил: "Я люблю тебя!"
Prompt: Дорогие друзья! Сегодня мы
Дорогие друзья! Сегодня мы познакомимся с одним из самых интересных и популярных
блюд в мире.
Очень часто хочется побывать на кухне, чтобы приготовить вкусный ужин. Не стоит
забывать о том что у нас есть много разных рецептов приготовления пищи: это
диетические блюда, которые содержат множество полезных веществ, помогающих нам
справиться со многими недугами организма.
Prompt: Погода сегодня была
Погода сегодня была очень солнечной, но как и в прошлом году, это был самый
теплый день для зимы.
В течение года погода стала более прохладной, чем днем на солнце. С 1946 по 2015
год температура воздуха в зимний период составляла около +3 градусов. Среднегодовая
температура воздуха составила -7,8°С. В этот же период зимой температура воздуха
поднялась до +10,7°C. Температура воздуха понизилась до +25...+26°C.
Prompt: Когда я был маленьким, мы с бабушкой
Когда я был маленьким, мы с бабушкой ходили в школу и играли на гитаре. В 1960
году мне было очень трудно понять, почему папа так сильно меня любил. Я не знал,
что он должен был быть таким же взрослым, как и мама. Мне казалось его жизнь
интересной. Он был прав: когда родители говорили о том, что мать хочет жить, то
они считали себя "неправдоподобными". Но отец понимал это иначе, потому что у
него были разные причины для того, чтобы стать отцом. И он решил, что ему нравится.
- Да, но я люблю тебя! - сказал дедушка. — Я тебе не нравлюсь.
Он хотел сказать, а он боялся, что будет лучше. Потому что он не мог знать, где
ты родишь сына, который живет до сих пор. А вот если бы бабушка была матерью, то
она могла бы получить от нее все больше удовольствия.
Prompt: В выходные мы поехали на дачу, где
В выходные мы поехали на дачу, где дед жил. В этот раз за городом стояла наша
любимая семья — отец, и мама, которая была рядом с нами в тот день, называла
меня Анечкой. И я приехала к нам домой.
- Ну что ты, - сказала она ей, - мне нужно было идти к бабушке...
На следующий вечер у нас родилась дочь, а родители сказали:
- Мама, а то бабушка будет жить в Москве, не знаю куда ехать, да еще и там
учиться надо!
Scope & Limitations
- The architecture is still raw and prototype-level — expect rough edges
- Designed for architectural experiments and educational purposes
- Context length of 1024 tokens limits long-range coherence
- Not intended for production use
License
Apache 2.0