Text Generation
Transformers
Safetensors
French
qwen3_5
image-text-to-text
french
conversational
edge
qwen

luth-2-banner

Luth-2-2B

Luth-2-2B is a 1.88B-parameter (text only) non-reasoning model, setting a new state of the art in French for its size across math, code, instruction following, general knowledge and tool calling. It is trained on a 3B-token French SFT mixture followed by multi-domain on-policy distillation (MOPD). The model outperforms every other model in its size class on our selected French benchmarks and stays competitive with larger models. It is small enough for efficient local and on-device deployment.

luth2_benchmarks_2b_portrait

Luth-2-2B inherits the VLM architecture of Qwen3.5-2B but was not trained on vision data. We do not recommend using it for vision tasks.

Model variants

Model Description
Luth-2-2B Original checkpoint in native format. Best for fine-tuning or inference with Transformers, vLLM and SGLang.
Luth-2-2B-GGUF Quantized format for llama.cpp and compatible tools. Optimized for CPU inference and reduced memory usage.

Training

Luth-2-2B is post-trained from Qwen3.5-2B in two stages:

  1. Supervised fine-tuning on Luth-2-Post-Training-SFT, a 3B-token French mixture spanning math (37.2%), knowledge (27.9%), code (22.2%), instruction following (6.5%) and tool calling (6.3%). Prompts were translated from English SFT datasets and answers regenerated with strong open-source teachers.
  2. Multi-domain on-policy distillation (MOPD). Three specialists (math, code, instruction following) are trained separately with GRPO on Luth-2-Post-Training-RL, then distilled back into the SFT student.

Inference

Luth-2-2B is supported by Transformers, vLLM, SGLang and more.

Quick start with Transformers:

from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer
model_id = "kurakurai/Luth-2-2B"
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    device_map="auto",
    dtype="bfloat16",
    # attn_implementation="flash_attention_2"  # uncomment on compatible GPU
)
tokenizer = AutoTokenizer.from_pretrained(model_id)
streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
prompt = "Quelle est la capitale de la France?"
input_ids = tokenizer.apply_chat_template(
    [{"role": "user", "content": prompt}],
    add_generation_prompt=True,
    return_tensors="pt",
    tokenize=True,
)["input_ids"].to(model.device)
output = model.generate(
    input_ids,
    do_sample=True,
    temperature=0.8,
    top_p=0.95,
    top_k=20,
    max_new_tokens=512,
    streamer=streamer,
)

Evaluation

Evaluations can be reproduced using our GitHub repository. The benchmarks are French subsets or verified translations, scored with temperature=0.6, top_p=0.95, top_k=20, thinking disabled, averaged over 10 runs.

French Benchmarks Luth-2-2B Luth-1.7B-Instruct Qwen3.5-2B
MGSM-rev2 86.52 75.72 64.60
AIME 24 17.00 10.33 11.67
AIME 25 19.00 7.00 6.67
Math-500 81.52 65.26 65.06
Global-MMLU-Lite 64.45 58.00 58.00
MMLU-ProX-Lite 55.24 41.10 47.20
GPQA-Diamond 41.97 30.20 36.80
IFEval 75.06 64.47 61.91
Multi-IF 69.67 46.05 45.38
HumanEval+ 66.00 56.44 37.56
MBPP+ 57.62 56.40 42.12
BFCL v2 68.91 71.05 51.78

See the French LLM Leaderboard for comparisons across models.

Contact

Questions or feedback? Reach us on LinkedIn: Maxence Lasbordes and Guillaume Pradel.

Citation

@misc{luth2,
  title  = {Luth-2: Pushing the French Capabilities of SLMs with MOPD},
  author = {Maxence Lasbordes and Guillaume Pradel},
  year   = {2026},
  url    = {https://huggingface.co/blog/MaxLSB/luth-2}
}
Downloads last month
54
Safetensors
Model size
2B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for kurakurai/Luth-2-2B

Finetuned
Qwen/Qwen3.5-2B
Finetuned
(308)
this model

Datasets used to train kurakurai/Luth-2-2B

Space using kurakurai/Luth-2-2B 1

Collection including kurakurai/Luth-2-2B