Instructions to use birgermoell/Qwen3.5-9B-EU-SFT with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use birgermoell/Qwen3.5-9B-EU-SFT with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="birgermoell/Qwen3.5-9B-EU-SFT") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("birgermoell/Qwen3.5-9B-EU-SFT") model = AutoModelForCausalLM.from_pretrained("birgermoell/Qwen3.5-9B-EU-SFT") messages = [ {"role": "user", "content": "Who are you?"}, ] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=40) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use birgermoell/Qwen3.5-9B-EU-SFT with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "birgermoell/Qwen3.5-9B-EU-SFT" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "birgermoell/Qwen3.5-9B-EU-SFT", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/birgermoell/Qwen3.5-9B-EU-SFT
- SGLang
How to use birgermoell/Qwen3.5-9B-EU-SFT with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "birgermoell/Qwen3.5-9B-EU-SFT" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "birgermoell/Qwen3.5-9B-EU-SFT", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "birgermoell/Qwen3.5-9B-EU-SFT" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "birgermoell/Qwen3.5-9B-EU-SFT", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use birgermoell/Qwen3.5-9B-EU-SFT with Docker Model Runner:
docker model run hf.co/birgermoell/Qwen3.5-9B-EU-SFT
Qwen3.5-9B-EU-SFT (v1)
European-language instruction-tuned variant of Qwen3.5-9B, fine-tuned on the OpenEuroLLM Dolci / EuroBlocks multilingual instruction mix. Part of the OpenEuroLLM Task 4.6 post-training effort, trained on the LUMI supercomputer (AMD MI250X / ROCm).
What it is: a first-pass SFT bootstrap that measurably improves European-language instruction following and reasoning over the base model, while preserving English ability. Not a final artifact — see Limitations and Roadmap.
Results — EU evaluation holdouts
Evaluated on birgermoell/oellm-eu-eval-holdouts-v1
(deterministic per-task scoring, dev split). Overall accuracy 59.3% → 68.1% (+8.8).
| Task bucket | Base Qwen3.5-9B | This model (SFT) | Δ |
|---|---|---|---|
| instruction_following | 6.7 | 73.3 | +66.6 |
| reasoning_math | 73.3 | 93.3 | +20.0 |
| grounded_qa | 100 | 100 | — |
| civic_safety | 100 | 100 | — |
| summarization | 100 | 100 | — |
| no_answer | 100 | 93.3 | −6.7 |
| translationese_preference | 53.3 | 53.3 | — |
| locale_formatting | 0 | 0 | — |
| tool_calling | 0 | 0 | — |
(Quick read, 10 prompts/bucket — per-bucket trends are robust; treat absolute values for the small buckets as indicative. A fuller eval is in progress.)
The headline: instruction following 6.7 → 73.3 — the base model rarely produced the required answer format in European languages; this model reliably does.
Example generation (Swedish)
Real output from this model. Prompt: Vad är meningen med livet?
(max_new_tokens=2048, temperature=0.7). The model is a reasoning model — it emits an
internal chain-of-thought inside <think>…</think>, then the final answer. For a clean,
answer-only response use enable_thinking=False in tokenizer.apply_chat_template(...) or
strip the <think>…</think> block.
Reasoning trace (the model's <think> block — click to expand)
Here's a thinking process that leads to the suggested response:
1. Analyze the Request:
* Question: "Vad är meningen med livet?" (What is the meaning of life?)
* Language: Swedish.
* Nature of Question: Philosophical, subjective, open-ended, potentially profound.
* Goal: Provide a thoughtful, balanced answer that acknowledges the complexity without
imposing a single definitive answer.
2. Determine the Approach: avoid a single dogmatic answer; present different perspectives
(philosophical, scientific, religious, personal); encourage the user to reflect.
3. Drafting the Content (Internal Monologue): existentialism (Sartre, Camus); religion;
science (evolution, purposelessness); personal meaning (happiness, relationships).
4. Refining in Swedish, 5. Polishing/Structuring (bullet points), 6. Final review (tone,
natural Swedish, not preachy), 7-8. Final polish.
Okay, let's write the response based on this thought process.
Final answer (after </think>):
Frågan om livets mening är en av de mest grundläggande och diskuterade frågorna i mänskligheten. Det finns inget enkelt eller universellt svar, men här är några olika perspektiv som kan hjälpa dig att tänka vidare:
- Filosofiskt perspektiv: Många filosofer har diskuterat livets mening under årtusenden. Existentialister som Jean-Paul Sartre och Albert Camus menade att människor måste skapa sin egen mening, eftersom det inte finns en inbyggd mening.
- Religiöst perspektiv: I många religioner finns det en tydlig mening med livet, som att tjäna Gud eller att följa en specifik väg till evigheten.
- Vetenskapligt perspektiv: Från ett vetenskapligt perspektiv kan man argumentera för att livet inte har någon inneboende mening, eftersom universum inte verkar ha ett specifikt syfte.
- Personligt perspektiv: För många människor är livets mening att hitta tillfredsställelse i vardagliga saker som att älska andra, skapa konst, hjälpa andra eller uppnå personliga mål.
- Existentialistiskt perspektiv: Enligt existentialismen är det upp till varje individ att skapa sin egen mening.
- Humanistiskt perspektiv: Många anser att livets mening är att skapa en bättre värld för andra, genom att främja jämlikhet och rättvisa.
- Spiritualistiskt perspektiv: Många anser att livets mening är att lära sig och växa, genom att utforska sin andliga sida.
Det finns ingen enda rätt svar på frågan om livets mening, och det är upp till varje individ att hitta sin egen mening. … Det är viktigare att leva ett meningsfullt liv, snarare än att hitta en specifik mening med livet. Livet är ett mysterium, och det är ok att inte ha alla svar.
Observations: fluent, idiomatic Swedish with a clear structure; the long conclusion repeats itself a few times (an over-generation tendency that the planned preference-optimization stage should reduce).
Training
| Base model | Qwen/Qwen3.5-9B (instruct, native 262K context) |
| Method | Full-parameter SFT (FSDP ZeRO-3, bf16) |
| Data | Dolci tulu3-euroblocks-85-15: EuroBlocks EU-multilingual instructions (85%) + Tülu-3 English replay (15%) |
| Examples | ~400k (subset of 1.08M) |
| Sequence length | 4096, packed |
| Optimizer | AdamW, LR 1e-5, cosine, warmup 0.03 |
| Hardware | 1× LUMI-G node (8× MI250X GCD), ROCm 6.4 |
| Framework | TRL SFTTrainer + 🤗 Transformers |
Code & full reproduction: https://github.com/BirgerMoell/qwen35-posttrain (docs/RUNBOOK.md).
Intended use
European-language assistant / instruction following across 24+ EU languages, especially mid/low-resource languages where the base model has the most headroom. Research artifact for the OpenEuroLLM project.
Limitations
- First bootstrap run — trained on synthetic + translated instruction data; translationese is not yet addressed (that's the next, preference-tuning, stage).
- No tool-use or locale-formatting training — those buckets score 0 (as does the base).
- Preference optimization (SimPO) and verifiable RL (GRPO on EU exams) are planned follow-ups.
- Inherits the base model's biases and knowledge cutoff.
Roadmap (OpenEuroLLM T4.6)
SFT (this model) → preference optimization (SimPO, reference-free) → RLVR/GRPO on European exam MCQs → broad eval. See the repo for the full plan and the distillation strategy.
License
Apache 2.0 (inherits Qwen/Qwen3.5-9B). Training data: Dolci/EuroBlocks (see OpenEuroLLM
dataset cards for component licenses).
Citation
@misc{oellm-qwen35-9b-eu-sft,
title = {Qwen3.5-9B-EU-SFT: European-language instruction tuning of Qwen3.5-9B},
author = {Moëll, Birger and OpenEuroLLM Task 4.6},
year = {2026},
url = {https://github.com/BirgerMoell/qwen35-posttrain}
}
- Downloads last month
- 21
docker model run hf.co/birgermoell/Qwen3.5-9B-EU-SFT