What it is good at
Thai language modelling. Against the released base model, on held-out text the run never
trained on:
Table with columns: measurement, base, this model| measurement | base | this model |
|---|
| Thai Wikipedia, plain continuation loss | 1.7292 | 1.5334 (−11.3%) |
| FLORES Thai, plain continuation loss | 1.8975 | 1.8321 (−3.4%) |
| held-out loss over the training mixture | 1.5186 | 1.2590 (−17.1%) |
It also beats the base model on every one of the seven training corpora.
What it is not
This is a base model, not an assistant. The run trained on raw continuation, so
instruction following eroded, and every capability benchmark fell:
Table with columns: benchmark, items, base, this model| benchmark | items | base | this model |
|---|
| Belebele Thai, reading comprehension | 900 | 0.6689 | 0.4311 |
| MMMU validation | 900 | 0.4100 | 0.3011 |
| CV-Bench 2D and 3D | 2,638 | 0.8108 | 0.4215 |
| HumanEval, pass@1 | 164 | 0.2744 | 0.0610 |
Multiple choice was scored by the likelihood of the option letter, not by generated text, so
this is not an answer-format effect. The damage was done in the first 1.8B true tokens, and
the 1.5B-token cosine decay did not undo it.
Recommended use
- Start from a weight blend, not from this checkpoint directly. Interpolating 30% of the
way toward the released model recovers task capability to the base level and keeps 61% of
the Thai gain:
theta = base + 0.3 * (this - base).
- Then run a supervised pass on Thai and vision instruction data with 15% general replay.
The plan, the data mix, and the costs are in
docs/post_training_plan.md of the training
repository.
Training
Table | |
|---|
| base | Qwen/Qwen3-VL-2B-Instruct, revision 89644892… |
| mixture | wangchanlion_curated 35%, sea_vl_crawling 18%, cambrian_737k 14%, mammoth_vl_sea 12%, mathpile 10%, opc_code 10%, thai_handwriting 1% capped at 5 epochs |
| stages | 3.0B at 4096 constant, 1.5B annealed, 0.5B at 8192 |
| optimizer | Muon 5e-4 on hidden matrices, AdamW 1e-5 on embeddings and norms |
| hardware | one node, four A100-40GB, about 485 share-hours |
| checkpoint | tokens-5200796360.pt, step 444,960, stage 3 (long context) |
| tokens at export | 5.0B true (the tracker total reads 5,200,796,360, which carries the documented +200M label offset) |
Mixture sampling is token-proportional: a weighted fair queue picks the dataset with the
largest token deficit, so the realized mixture converges on effective tokens rather than rows.
Files
model.safetensors holds the parameters in the released class's layout, checked to load with
zero missing and zero unexpected keys. provenance.json records the base revision, the
checkpoint, and the counters at export time.
Limitations
- Thai OCR is not demonstrated: the benchmark measures at the floor under the single prompt
used, and needs per-task prompts to be informative.
- The evaluation slices are narrow, so treat the per-dataset numbers as directions.
- No capability benchmark showed a gain. The Thai gain is a language-modelling result.