AI PRACTICE · LANGUAGE MODELS · OPEN MATERIALS

A small language should be as good in open models as in paid ones.

One GPU, one person, every step measured. I taught the open language model Qwen3.8-27B proper Estonian on a single RTX 5090. Here are the results with their denominators, the mistakes with their price, the model and code in the open, and a textbook you can download right now.

Model public, Apache 2.0 Code public, MIT Textbook v1, September 2026 Language layer being rebuilt
BRIDGE · The story of one project

Why I sat behind one GPU for nine days.

Starting point

Open language models speak English well and Estonian carelessly. They inflect wrongly, mix up verb government and write sentences no Estonian would write. Paid models are better, but behind them are someone else's decisions and someone else's price. I wanted to know how far one person gets with one ordinary gaming PC, if every step is measured.

I chose Qwen3.8-27B as the base, an open-weights model with 27 billion parameters, and trained it with QLoRA on a single RTX 5090 with 32 GB of memory. The project started on 22 August 2026. In nine days I ran 34 saved training runs: first 13 targeted skill rounds, where each round's material came from the model's own mistakes in the previous round, then 110 million tokens of continued pretraining on edited Estonian prose, and finally surgical repair rounds on top of that.

What I learned

The most expensive lesson was not technical. It was about measurement. My 200-task Estonian test was meant as a locked check, but I looked at it after every round and chose the next batch by it. By definition that makes it a development set, not a test. The number that comes out of it is biased upwards, and I do not know by how much. That is exactly why every number on this page carries its denominator and its limitation next to it, in the same type size.

Second lesson: a small targeted dose beats a large general one. 720 examples aimed at one specific error gave more than 81,268 general examples. And third: the model's own mistakes are the best training material there is. The same data as one big batch scored 9 points lower than 13 rounds where each round looked at the previous one's errors.

Why in the open

Estonian is a small language. Its training must be publicly available and the work must carry forward into future models, not stay on one person's hard drive. This work has no economic weight for me, neither direct nor indirect. The code is MIT, the adapters Apache 2.0, the reports CC BY 4.0. The mistakes are public too, because they teach more than a clean final result.

Base modelQwen3.8-27B
Hardware1 × RTX 5090, 32 GB
MethodQLoRA · SFT · DPO · CPT
Training runs34 in nine days
Targeted rounds13
Continued pretraining110.2 M tokens · 35.3 h
Throughput~870 tok/s · 450 W
Eval set200 tasks · 151 scored
Started22 August 2026
Public1 September 2026
BRIDGE · Results

Every number with its denominator.

A number without a denominator cannot be checked. Here are the four measurements I made, and next to each one what it says and what it does not say. The most defensible is perplexity, because no round was tuned against it.

Perplexity · fiction · most defensible
22.215.4−31 %
600 held-out passages · measured on the pure language layer (CPT) · nothing was tuned against it
What it saysThe model predicts edited Estonian prose a third better than before.
What it does not sayThe split was at passage level, not at work level. Lower perplexity does not mean an equally large improvement in grammar.
EstQA reading · external test · F1
86.993.6F1
TalTech's 200 test questions · result of the whole pipeline, including a dose from EstQA's training split · EM 73.5 → 86.5
What it saysReading and answering in Estonian improved on an external test I did not write myself.
What it does not sayThis is not CPT alone. The model saw EstQA's training split; cloud models on the same test did not.
Estonian skills set · development score
61.786.1%
151 auto-scored tasks out of 200 · development set, not a test · optimised over 13 rounds · no independent blind test yet
What it saysInflection 51.7 → 91.7, verb government 87.5 → 100, morphology 11.6 → 98.1 on my own set.
What it does not sayIt is not comparable to other models on their own benchmarks. The upward bias is of unknown size.
MMLU-et general knowledge · a drop
68.766.0%
300 questions · measured on the 30 Aug checkpoint · stated, not hidden
What it saysThe language gain cost 2.7 points of general knowledge. Improvement in one skill does not prove nothing was forgotten.
What it does not sayExactly why. No control run without the language layer was made, so the cause remains a hypothesis.

All numbers, checkpoints and the three measurement errors found later are in the repo file PARANDUSED.md. Read it before quoting any number.

BRIDGE · Lab journal

Two weeks, six turning points.

  1. 22 Aug 2026

    Kick-off and baseline

    Data inventory, a 200-task Estonian test, base model measured: 61.7 %.

  2. 23 Aug

    First round starts at 00:01

    Rule-generated inflection examples, round-tripped through Vabamorf. From there, round after round from the model's own errors.

  3. 25 Aug

    Round 10 and the council

    84.7 % on the dev set, but EstQA fell below base. Three different models review the plan and find the gaps.

  4. 30 Aug

    Language layer and champion

    110 M tokens of prose, perplexity −31 %. Surgical rounds on top, EstQA recovers to 93.6. LIHV2 is the final state.

  5. 1 Sep

    Public and corrected

    Adapters, GGUF and corpus on Hugging Face. Cross-checking finds three measurement errors; every public artefact is corrected.

  6. 4 Sep

    Language layer withdrawn

    Four errors at once. The pure language layer alone made the model 5.6 points worse on the dev set. Rebuilding, behind a rule gate.

BRIDGE · Mistakes and lessons

Seven mistakes that cost about 12 days of GPU.

Every mistake here is measured, not generalised. Without a price a lesson is not convincing and cannot be handed on. None of them raised an error. Every time, the script said "done".

NoMistakeMeasured priceHow it was found
01Packing assumed 4 characters per token. In Estonian it is 2.8.About 22 % of the corpus was silently truncated and never reached the model.A second model asked in cross-review whether chunk counts and token counts matched. They did not.
02Replay data was declared in the code but never used.The pure language layer took the model from 61.7 to 56.1, a 5.6-point forgetting.By checking an outside recommendation against the code, not against the documents.
03Perplexity was measured on one genre only.Modern news text got 16.4 % worse and nobody saw it.A multi-genre baseline before the next training run.
04The "locked test" was actually a development set.86.1 % is not a test result. The bias is of unknown size.Cross-model review: three independent models read the textbook.
05Data was uncleaned: wiki markup, OCR noise, template text.About 24 % of the corpus was not whole Estonian text.A seven-criteria data audit on 4 September.
06The learning rate decayed to zero inside every block instead of across the run.About 20 % of every block trained on nothing.By reading the trainer state file, not the log.
07A chat variant was trained on raw text without instruction examples.Loss of instruction skill, part of mistake 02.By reading the EstLLM paper, the only published Estonian CPT mix.

On 4 September I withdrew the language layer. Not because the result was bad, but because I could no longer say which part of the result was the language layer and which part was chance. If one error had been enough, four at once leave no choice.

Now everything we know about training an Estonian model lives in one repository and one rules file. A rule the machine does not check is a suggestion. Suggestions get forgotten.

What is different now

36 rules, 33 of them mandatory, each born from a measured mistake and each with its price. The rules file is not documentation. A pre-check reads it, and training does not start if any mandatory rule is unmet.

Packing uses the tokenizer, not character counts. Replay data is really in the mix. Perplexity is measured on at least five genres, in every block. And the validation set exists before training, not after.

BRIDGE · Open materials

Everything you can download and reproduce.

Hugging Face · modelApache 2.0

Merged model GGUF, Q6_K

The champion checkpoint in one file, Ollama Modelfile included. Trained without think mode: use think=false. Q5 or better; Q4 produced measurably worse text.

Open model card ↗
Hugging Face · adaptersApache 2.0

Three LoRA adapters

The final champion (language layer + surgical rounds), the pure language layer as a research object, and the 13-round skills path without a language layer. Each with its own measurements and warnings.

Open adapters ↗
Hugging Face · datasetper entry

Estonian inflection corpus

11,011 entries, each with its source and licence. Entries with an unresolved licence are withheld until cleared. Round-tripped through the Vabamorf morphological analyser.

Open dataset ↗
GitHub · code and reportsMIT · CC BY 4.0

The whole pipeline and lab journal

50 numbered scripts and 26 orchestration chains: data processing, rule-based generators, QLoRA training, locked eval and external benchmarks. Reports, council synthesis, the corrections file.

Open repo ↗
GitHub · PARANDUSED.mdread first

What was wrong and what was fixed

Three measurement errors, the development-set warning and the licence position, written down before anyone else had to ask. The numbers look weaker after the correction. That is correct.

Read the corrections ↗
GitHub · final reportCC BY 4.0

Final report 30 Aug 2026

What was measured on which checkpoint, by category. A phrase probe on 378 unseen cells, cloud models as context on the same EstQA sample, and what must not be read into it.

Open report ↗
Textbook · PDF · free · in Estonian

Training language models: from understanding to the first controlled experiment.

This book grew out of this very project: collecting data, running experiments, making mistakes and fixing them. 20 chapters, exercises with answers, a glossary and two runnable labs. You do not need to know a single acronym at the start. Written in Estonian.

Download, PDF 63 pp · A4 · 0.3 MB · v1 · September 2026
For whom and about what
  • For the beginner who wants to understand what training actually does
  • For the language or domain expert who wants to contribute
  • For the developer who wants to run a first experiment with intent
  • For the teacher: questions, worked examples, worksheets
  • How a model learns and what happens inside it
  • Data, LoRA and QLoRA, settings, measurement
  • Estonian: check your checker too
  • Hardware, memory, time and energy
  • Lab on Ubuntu and NVIDIA: a first LoRA training run
  • Lab on an Apple Silicon Mac: a first MLX training run
BRIDGE · Reproducing

The same path with another language or model.

The recipe is sequential because every step depends on the previous one's measurement. Script numbers refer to files in the repo.

01 · scripts 05, 08

Build a small locked test

Aimed at your language's weaknesses. And keep it locked: if you look at it after every round, it is no longer a test.

02 · script 07b

Measure the base, find the gaps

Where does the model fail most? That is where the first dose goes, not where the data is most plentiful.

03 · scripts 03, 16, 26

A rule-based generator

Plus a morphological analyser as the check. For Estonian, Vabamorf. The shape of the example must match the shape of the use.

04 · scripts 15, 17, 06

Surgical rounds from the model's own errors

2 to 3 hours each. Read the errors before collecting more text. 130 examples for one error gave +2.1 points.

05 · scripts 19, 14

DPO only on fresh errors

On-policy. 9,543 foreign preference pairs made the model 6 points worse; 244 of its own pairs added a point.

06 · scripts 42–44, 46

Language layer once the skills ceiling is reached

CPT on quality prose gives the language, SFT gives the skills. Replay in the mix, validation set before, not after.

07 · scripts 28, 31, 38

External tests as the honest check

EstQA, MMLU-et, HumanEval. And check the packaged model separately: quantisation and think mode break things silently.

After all of it

Write the mistakes down with their price

A rule the machine does not check is a suggestion. Turn every mistake into a rule that the pre-check actually reads before the next run.

BRIDGE · The rest of the AI practice

The language model is one system among several.

I do not talk about AI from the sidelines. Every day I run several AI systems that do real work: they write and check code, keep my knowledge base current and run Evoluna's matching. The same discipline as in the language model project applies to each of them: one model builds, another reviews, and the measured result beats the feeling.

This is also the backbone of my mentoring work. When I talk with a leader about AI-era decisions, it does not come from a book. It comes from systems that are running right now. See the full AI practice on the home page →

Estonian model Qwen3.8-ETPost-training of an open model on one GPU, measured and public. Language layer being rebuilt.
Public
Multi-agent development systemsAutonomous agent workflows that build, cross-check and ship code to production.
In production
Personal AI knowledge baseYears of archive in a local search system, nightly distillation, a local model for sensitive content.
In production
Evoluna matching engineAlgorithm + LLM explanation that helps people find the right mentor, coach or therapist.
In production
Cross-model reviewNone of my code is finished until a different model family has reviewed it. That is where mistakes 01 and 04 on this page came from.
Rule

If you have a corpus, a question or the same problem, write to me.

Data with a clear licence. An independent blind test that would make the numbers truly defensible. Or simply a question about how to start with your own language or domain. I answer personally.

Write: info@pertlomp.com
For leaders who want to talk about AI-era decisions: book a session via Evoluna.