Downloads · 30 days
17
4% of all-time downloads
JonaPoka/Qwen3.5-4B-Finnish
Qwen3.5-4B-Finnish is a text generation model from JonaPoka. Use it when you need the model to write or continue text. It is set up for transformers. The card lists the license as apache-2.0.
A Finnish instruction fine-tune of Qwen/Qwen3.5-4B. This is a merged full checkpoint (LoRA baked in), not a PEFT adapter and not a Finnish continued-pretrain like Poro 2, Ahma, or Viking. The base is a latest-general…
Downloads · 30 days
17
4% of all-time downloads
All-time downloads
447
Public
Parameters
4.5B
9.4 GB on disk
Likes
1
Public
Click a slice to open those files.
.safetensors9.1 GB · 100%
From the Hugging Face model README
A Finnish instruction fine-tune of Qwen/Qwen3.5-4B. This is a merged full checkpoint (LoRA baked in), not a PEFT adapter and not a Finnish continued-pretrain like Poro 2, Ahma, or Viking. The base is a latest-general multilingual model (Apache-2.0).
Thinking is off. The vision tower was frozen; this release is text-only. There is no DPO in this checkpoint (TRL 1.12 needed a newer torch FSDPModule; TRL 0.22.2 broke on transformers 5.16).
Hub id: JonaPoka/Qwen3.5-4B-Finnish. Load it like the Qwen base — no PEFT required.
Use enable_thinking=False in the Qwen3.5 chat template.
A 4B experimental fine-tune is not a native grammarian, not a historian, and not a Poro replacement. It still mixes Finnish cases on rules, and it still invents extra 1917 history. Prefer a 9B run on a 48 GB GPU if you need a serious Finnish assistant. Do not use this for legal, medical, or official advice.
Needs transformers>=4.57. This repo is the merged 4B checkpoint (~8.5 GB).
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "JonaPoka/Qwen3.5-4B-Finnish"
tok = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="auto",
trust_remote_code=True,
)
messages = [
{
"role": "system",
"content": (
"Olet avulias tekoälyavustaja. Vastaa suomeksi, ellei käyttäjä "
"nimenomaan pyydä toista kieltä. Käytä luontevaa, kieliopillisesti oikeaa suomea."
),
},
{
"role": "user",
"content": "Selitä lyhyesti, miten suomen kielen partitiivi toimii. Anna kolme esimerkkiä.",
},
]
enc = tok.apply_chat_template(
messages,
add_generation_prompt=True,
enable_thinking=False,
return_tensors="pt",
return_dict=True,
)
out = model.generate(
**{k: v.to(model.device) for k, v in enc.items()},
max_new_tokens=192,
do_sample=False,
repetition_penalty=1.08,
)
print(tok.decode(out[0][enc["input_ids"].shape[-1] :], skip_special_tokens=True))
If AutoModelForCausalLM fails to load the hybrid Qwen3.5 checkpoint, use AutoModelForImageTextToText with the same arguments. Stop on <|im_end|>. A light repetition penalty (≈1.08) reduces the ice-density loops we saw in greedy decode.
Training used one LoRA (rank 64) continued across four SFT stages, then merged into the base. You do not need peft at inference.
One LoRA, continued — not four separate models. Rank 64, alpha 128, dropout 0.05. Targets full-attention (q/k/v/o_proj), Gated DeltaNet (in_proj_qkv, in_proj_z, in_proj_a, in_proj_b, out_proj), and MLP (gate/up/down_proj). Sequence 1024, QLoRA 4-bit NF4, assistant-only loss, batch 4 × accum 4 (effective 16). Hardware: 1× RTX 3090 / 3090 Ti, 24 GB.
| Data | 15,000-row quality slice of a 68k filtered mix: scored Poro-2 Finnish HQ, Turku paraphrase + FLORES, capped AutoIF-FI, Parsebank WebQA, tiny human chat |
| Recipe | lr=1e-4, 1 epoch, 938 steps in 4h 55m |
| Train loss | 0.935 · token acc ~0.77 |
| Why | Qwen3.5 has not been SFT’d on Finnish instruction data. This pass teaches “answer in Finnish.” |
We did not dump the unfiltered 1.4M Poro-2 collection. Judge labels (HYÖDYLLINEN) are not native Finnish.
| Data | 13,672 rows the 15k run never saw, after dropping already-trained ids, n_chars>2400, markdown essays, English leftovers, calques, EN-target FLORES, non-Parsebank WebQA. Plus 10 handwritten gold dialogues ×12. |
| Recipe | continue the Stage 1 adapter, lr=4e-5, 1 epoch, 855 steps in 4h 39m |
| Train loss | 0.958 · token acc ~0.76 |
Gold was ~1% of this mix, so morphology barely moved. Register and stopping did.
Replaying the 68k would mostly memorize Llama-3.3 Finnish essays. Stage 3 continues the Stage 2 adapter on new licensed text converted to user→assistant turns (the gold is already in the source: Wikipedia lead, or the actual next paragraph).
| Source | Rows | License | Task |
|---|---|---|---|
Finnish Wikipedia (Finnish-NLP/wikipedia_20231101_fi_cleaned) | 4,500 explain + 1,500 continue | CC BY-SA | “Selitä lyhyesti {title}” → lead; next-paragraph continuation |
Project Gutenberg Finnish (Varho/gutenberg-fi) | 4,000 continue + 800 extractive leads | Public domain (USA) | Continue the next paragraph |
Finnish Wikinews (Fumika/Wikinews-multilingual, lang=fi) | 110 | CC BY-2.5 | Short news piece from the headline |
| Handwritten gold | 296 | this project | Light sprinkle so partitive / email / 1917 patches are not wiped |
| Total | 11,206 | 1 epoch, 701 / 701 steps in 1h 39m, lr=3e-5, train loss 2.005 |
Not included (would block a public Hub release): Yle and STT full-text archives (Kielipankki academic / no redistribution), Helsingin Sanomat, scraped commercial newsletters. Not used: raw continued pretraining on whole books (that strips instruction following).
Continue the Stage 3 native LoRA. Config: configs/sft_qlora_4b_polish.yaml. No DPO after this.
| Data | 75 handwritten gold dialogues ×48 (3,600) + 700 Turku paraphrase + 300 Finnish FLORES = 4,600 rows |
| Recipe | lr=2e-5, 1 epoch, 288 / 288 steps in ~55 min |
| Train loss | 0.262 · token acc 0.956 |
This merged checkpoint contains Stages 1–4. The LoRA was trained, then baked into Qwen/Qwen3.5-4B.
There is no public Finnish instruction leaderboard we trust for a 4B adapter. Evaluation is a fixed smoke set: the same prompts after every run, greedy decode, thinking off, max_new_tokens=192, repetition_penalty=1.08.
| Prompt | Stage 1 (15k) | Stage 2 (clean 13.7k) | Stage 3 (native 11.2k) | Stage 4 (gold polish) |
|---|---|---|---|---|
| Partitive | Allative -lle / genitive -n as “partitive” | Wrong rule (-sta+-n); kahvia / leipää | Still -n; kahvia / leipää kept | Examples kahvia / autoa / kirjaa are right; the stated rule still mentions -n |
| Dentist email | English calque | Finnish register; [Your Name] | Finnish; [Nimi]; Hämähäkkilääkäri in the subject | Real Finnish cancellation; [Nimi]; no Hämähäkkilääkäri |
| Lake ice | Density idea, then a loop | Inverted + loop | Same invert + loop | Open prompt a bit clumsy but not inverted; leading “is ice denser?” is correct |
| EN→FI | Komitea siirsi päätöksen seuraavaan torstaihin. | Same, good | Same, good | Komitea siirsi päätöstä seuraavaan torstaihin. (partitive object) |
| 1917 | 6 Dec + Commonwealth 1955 + leaked user | 6 Dec right; Commonwealth gone | 6 Dec right; Commonwealth 1955 returned | 6 Dec 1917 right; still invents extra history (1919 peace / YK as independence) |
| YK 1955 (leading) | — | — | Correct | Correct: Yhdistyneet kansakunnat, not the Commonwealth |
| Calque (“tämä viesti löytää sinut hyvin”) | — | — | Says Ei, then repeats the calque | Rejected correctly |
Stage 3 paraphrases already had ice-density and YK 1955 right; Stage 4 moved the open ice prompt off the invert, cleaned the dentist email, and made partitive examples usable. The partitive rule and the open 1917 prompt are still unreliable.
How to read this. Stage 1 solved language lock. Stage 2 improved register and stopping. Stage 3 added native-text style; leading factual prompts can work while open versions still fail. Stage 4 is a gold-heavy polish of that same LoRA, not a new model and not DPO.
-n. Do not trust morphology explanations.@misc{qwen35-4b-finnish,
title = {Qwen3.5-4B Finnish (experimental)},
author = {JonaPoka},
year = {2026},
howpublished = {Hugging Face},
url = {https://huggingface.co/JonaPoka/Qwen3.5-4B-Finnish},
note = {Merged LoRA SFT on Qwen/Qwen3.5-4B, thinking disabled, no DPO}
}
Base model: Qwen Team, Qwen3.5.