Instructions to use kurakurai/Luth-2-2B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use kurakurai/Luth-2-2B with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="kurakurai/Luth-2-2B") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("kurakurai/Luth-2-2B") model = AutoModelForMultimodalLM.from_pretrained("kurakurai/Luth-2-2B", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.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(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use kurakurai/Luth-2-2B with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "kurakurai/Luth-2-2B" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "kurakurai/Luth-2-2B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/kurakurai/Luth-2-2B
- SGLang
How to use kurakurai/Luth-2-2B 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 "kurakurai/Luth-2-2B" \ --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": "kurakurai/Luth-2-2B", "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 "kurakurai/Luth-2-2B" \ --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": "kurakurai/Luth-2-2B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use kurakurai/Luth-2-2B with Docker Model Runner:
docker model run hf.co/kurakurai/Luth-2-2B
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.
- 📄 Blog: Luth-2: Pushing the French Capabilities of SLMs with MOPD
- 🤗 Models: Luth-2-0.8B · Luth-2-2B
- 📊 Datasets: SFT · RL
- 💻 Code: GitHub
- 🏆 Leaderboard: French LLM Leaderboard
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:
- 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.
- 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

