Instructions to use Fallovski/Xalaat-R1-4B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use Fallovski/Xalaat-R1-4B with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="Fallovski/Xalaat-R1-4B") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("Fallovski/Xalaat-R1-4B") model = AutoModelForCausalLM.from_pretrained("Fallovski/Xalaat-R1-4B", device_map="auto") 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=256) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use Fallovski/Xalaat-R1-4B with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "Fallovski/Xalaat-R1-4B" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "Fallovski/Xalaat-R1-4B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/Fallovski/Xalaat-R1-4B
- SGLang
How to use Fallovski/Xalaat-R1-4B 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 "Fallovski/Xalaat-R1-4B" \ --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": "Fallovski/Xalaat-R1-4B", "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 "Fallovski/Xalaat-R1-4B" \ --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": "Fallovski/Xalaat-R1-4B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use Fallovski/Xalaat-R1-4B with Docker Model Runner:
docker model run hf.co/Fallovski/Xalaat-R1-4B
Xalaat-R1-4B
Modรจle de raisonnement mathรฉmatique en wolof, obtenu par continued pretraining (CPT) puis instruction tuning (SFT) rsLoRA sur McGill-NLP/AfriqueQwen3.5-4B-50Langs. Le modรจle ร la racine du dรฉpรดt est la version fusionnรฉe CPT+SFT, chargeable directement, sans PEFT.
Ce qu'il sait faire : rรฉsoudre un problรจme arithmรฉtique posรฉ en wolof, en
dรฉtaillant les รฉtapes, et terminer par #### <rรฉponse>. Le SFT est intรฉgralement
du GSM8K traduit en wolof, avec un seul prompt systรจme. Rien n'รฉtablit sa
capacitรฉ en conversation wolof gรฉnรฉrale, et les mesures ci-dessous montrent
qu'elle n'y est pas.
Trois prรฉrequis d'infรฉrence
Sans ces trois conditions, le modรจle est hors distribution et dรฉgรฉnรจre. Ce ne sont pas des recommandations.
- Le prompt systรจme du SFT, reproduit dans l'exemple ci-dessous. Les 7273
exemples d'entraรฎnement le partagent tous, et 100 % de leurs rรฉponses
se terminent par
#### <rรฉponse><|im_end|>. Sans lui, le modรจle produit de la prose, n'atteint jamais le marqueur####, et n'รฉmet donc jamais sa fin de tour. enable_thinking=Falsedansapply_chat_template. Le corpus SFT a un bloc<think></think>vide ; le gabarit ne l'รฉcrit que si on passe ce paramรจtre. Par dรฉfaut il ouvre<think>et le modรจle part en boucle.transformers >= 5.5, la version qui introduit l'architectureqwen3_5. Testรฉ avec 5.15.1 ettorch2.13.0.
Arrรชt de gรฉnรฉration : corrigรฉ
L'ancien generation_config.json dรฉclarait eos_token_id: [248044, 248044], soit
<|endoftext|>, hรฉritรฉ du modรจle de base via _from_model_config: true. Or ce
modรจle est entraรฎnรฉ en ChatML et termine ses tours sur <|im_end|> (248046),
que rien n'รฉcoutait. C'est la cause des boucles de rรฉpรฉtition, un dรฉfaut de
configuration et non d'entraรฎnement : aucun rรฉentraรฎnement n'a รฉtรฉ nรฉcessaire.
generation_config.json dรฉclare maintenant eos_token_id: [248046, 248044] et
tokenizer_config.json a eos_token: "<|im_end|>". Un appel qui fixe lui-mรชme
eos_token_id reste la garantie la plus sรปre.
Usage
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
REPO = "Fallovski/Xalaat-R1-4B"
SYSTEM = (
"Yow, danga am xam-xam bu rรซy ci matรฉmatik ak ci Wolof. Sa liggรฉey mooy "
"jร ppale ma ci ay laaj matรฉmatik. Su ma la laajee ab laaj, wone ma ni nga "
"ko defee (tegtal bi) ci ay xร jj yu toppante (step-by-step), ba noppi, ci "
"tontu bu mujj bi, nga teg ci kanam '####'."
)
# device explicite plutรดt que device_map="auto", qui exige `accelerate`.
device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
tokenizer = AutoTokenizer.from_pretrained(REPO)
model = AutoModelForCausalLM.from_pretrained(REPO, dtype=torch.bfloat16).to(device).eval()
messages = [
{"role": "system", "content": SYSTEM},
{"role": "user", "content": "Am naa รฑaari mango, may naa benn, รฑaata mango la dess?"},
]
inputs = tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
enable_thinking=False,
return_tensors="pt",
return_dict=True,
).to(device)
out = model.generate(
**inputs,
max_new_tokens=512,
do_sample=False,
eos_token_id=[tokenizer.convert_tokens_to_ids("<|im_end|>"), tokenizer.eos_token_id],
pad_token_id=tokenizer.pad_token_id,
)
print(tokenizer.decode(out[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True))
# Am naa รฑaari mango, may naa benn, kon am naa 2-1=1 mango bu des.
# #### 1
Playground
playground.py, ร la racine du dรฉpรดt, est un seul fichier qui ne demande que
torch et transformers >= 5.5. Il applique les trois prรฉrequis ci-dessus par
dรฉfaut, donc il n'y a rien ร configurer pour essayer le modรจle.
python playground.py # conversation
python playground.py --prompt "รaata mango la dess?" # une seule question
python playground.py --prompt "โฆ" --temperatures 0 0.7 # la mรชme, plusieurs tirages
La rรฉponse s'affiche en flux, et sous elle le nombre extrait du #### โ ou un
avertissement quand la sortie sort du format. /sweep rejoue la derniรจre
question ร plusieurs tempรฉratures et donne l'accord entre tirages : quatre
tirages d'accord signalent un raisonnement tenu, quatre rรฉponses diffรฉrentes une
rรฉponse tirรฉe au sort. /aide liste les commandes.
รvaluation
lm_eval 0.4.12, transformers 5.15.1, torch 2.13.0, Apple M4 Max en MPS,
bfloat16, batch 1. Gabarit ChatML appliquรฉ, exemples few-shot prรฉsentรฉs comme de
vrais tours de conversation, eos_token_id=248046 imposรฉ. Le prompt systรจme du
SFT est utilisรฉ sur AfriMGSM uniquement : il est spรฉcifique aux mathรฉmatiques, et
l'appliquer aux trois autres tรขches les biaiserait.
AfriMGSM wolof โ le CPT+SFT est validรฉ
afrimgsm_cot_wol_prompt_1 (IrokoBench, Adelani et al. NAACL 2025), 250 exemples,
soit tout le split test. Mรฉtrique flexible-extract.
| Condition | Xalaat-R1-4B | Base AfriqueQwen | Rapport |
|---|---|---|---|
| 0-shot | 0,260 ยฑ 0,028 | 0,052 ยฑ 0,014 | ร5,0 |
| 3-shot | 0,308 ยฑ 0,029 | 0,060 ยฑ 0,015 | ร5,1 |
L'รฉcart vaut plus de sept erreurs-types dans les deux conditions. C'est la mesure qui justifie le CPT et le SFT.
strict-match vaut 0,00 pour les deux modรจles et ne dรฉpartage rien : son filtre
cherche "The answer is (N)", une formule anglaise, quand ce modรจle est entraรฎnรฉ
ร รฉcrire #### N. Ne pas lire ce 0 comme une incompรฉtence.
Le format explique une partie de l'รฉcart. Sur les mรชmes 250 sorties 0-shot :
Contient #### |
#### suivi d'un nombre |
Longueur mรฉdiane | |
|---|---|---|---|
| Xalaat-R1-4B | 79,2 % | 78,8 % | 299 car. |
| Base AfriqueQwen | 34,4 % | 1,2 % | 618 car. |
La base imite le marqueur sans s'en servir comme emplacement de rรฉponse : elle l'รฉcrit une fois sur trois, mais y met un nombre une fois sur cent. Ses sorties sont deux fois plus longues, signe qu'elle ne sait pas terminer son tour. Chez Xalaat, 0,8 % des sorties gardent une rรฉpรฉtition rรฉsiduelle.
Tรขches ร choix multiples โ aucun gain dรฉmontrรฉ
300 exemples, 3-shot, sans prompt systรจme.
| Tรขche | Xalaat-R1-4B | Base AfriqueQwen |
|---|---|---|
afrixnli_native_direct_wol (infรฉrence) |
0,380 ยฑ 0,028 | 0,363 ยฑ 0,028 |
belebele_wol_Latn (comprรฉhension) |
0,273 ยฑ 0,026 | 0,203 ยฑ 0,023 |
sib_wol_prompt_1 (classification de sujet) |
0,353 ยฑ 0,034 | 0,324 ยฑ 0,033 |
Les รฉcarts d'afrixnli et de sib tiennent dans les marges d'erreur. Celui de
belebele les dรฉpasse ร peine, mais 0,273 sur quatre choix reste le niveau du
hasard : les deux modรจles รฉchouent, l'un un peu moins mal que l'autre.
Le gain du fine-tuning est donc spรฉcifique ร la tรขche entraรฎnรฉe. C'est cohรฉrent avec un SFT entiรจrement constituรฉ de GSM8K traduit.
Limitations
- Domaine restreint. GSM8K traduit et un prompt systรจme de mathรฉmatiques : hors de ce cadre, rien n'est mesurรฉ.
- Numรฉraux wolof non standardisรฉs mal lus. En orthographe phonรฉtique,
nietetniee(รฑett, trois) sont interprรฉtรฉs comme 1. Les chiffres arabes, les numรฉraux franรงais (quinze,trois) et l'orthographe standardisรฉe (รฑaari,benn) fonctionnent. Une normalisation en amont est nรฉcessaire pour un usage rรฉel. - Artefacts d'entraรฎnement. 29,4 % du corpus SFT (2137 exemples) contient les
annotations calculatrices de GSM8K (
<<16-3-4=9>>), que le modรจle reproduit en sortie. ร nettoyer avant tout nouveau SFT. - Pollution translingue. Des tokens d'autres langues apparaissent occasionnellement dans des rรฉponses par ailleurs correctes.
- Wolof uniquement. Le CPT et le SFT ne ciblaient que le wolof, et l'รฉvaluation ci-dessus ne couvre que lui. Les 47 autres langues du modรจle de base ne sont pas mesurรฉes ici et un fine-tuning de cette ampleur les dรฉgrade gรฉnรฉralement.
- Corpus wolof d'entraรฎnement modeste au regard des standards du continued pretraining.
Reproduction
Six runs : deux en 0-shot sur AfriMGSM, quatre dans la suite 3-shot. Le mรชme jeu de commandes sert pour ce dรฉpรดt et pour le modรจle de base.
MODEL=Fallovski/Xalaat-R1-4B # ou McGill-NLP/AfriqueQwen3.5-4B-50Langs
SYS="Yow, danga am xam-xam bu rรซy ci matรฉmatik ak ci Wolof. Sa liggรฉey mooy jร ppale ma ci ay laaj matรฉmatik. Su ma la laajee ab laaj, wone ma ni nga ko defee (tegtal bi) ci ay xร jj yu toppante (step-by-step), ba noppi, ci tontu bu mujj bi, nga teg ci kanam '####'."
COMMON="--model hf --model_args pretrained=$MODEL,dtype=bfloat16 --device mps
--batch_size 1 --apply_chat_template --gen_kwargs eos_token_id=248046
--log_samples --output_path results/"
# AfriMGSM 0-shot, tout le split test (250)
lm_eval $COMMON --tasks afrimgsm_cot_wol_prompt_1 --num_fewshot 0 \
--system_instruction "$SYS"
# AfriMGSM 3-shot, exemples en tours de conversation
lm_eval $COMMON --tasks afrimgsm_cot_wol_prompt_1 --num_fewshot 3 \
--fewshot_as_multiturn --system_instruction "$SYS"
# choix multiples 3-shot, 300 exemples, sans prompt systรจme
lm_eval $COMMON --num_fewshot 3 --fewshot_as_multiturn --limit 300 \
--tasks afrixnli_native_direct_wol,belebele_wol_Latn,sib_wol_prompt_1
Deux รฉcarts de protocole ร connaรฎtre : le run 0-shot de la base n'a pas reรงu
eos_token_id=248046, contrairement ร celui de Xalaat (les deux runs 3-shot l'ont
reรงu et donnent le mรชme rapport, la conclusion n'en dรฉpend pas) ; et Xalaat a รฉtรฉ
รฉvaluรฉ sur 4b62576 en 0-shot puis 5486cbe ensuite, deux rรฉvisions qui ne
diffรจrent que par la suppression de dossiers de sauvegarde, ร poids identiques.
Compter environ 2 h 30 pour la suite 3-shot sur un M4 Max en MPS.
- Downloads last month
- -
Model tree for Fallovski/Xalaat-R1-4B
Base model
Qwen/Qwen3.5-4B-Base