This repository contains only the PEFT LoRA adapter weights (264 MB) produced by QLoRA fine-tuning of Qwen3-4B on 17,944 Islamic Arabic question-answer pairs. Load it on top of the unquantized or BitsAndBytes-quantized base model.
1import torch
2from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
3from peft import PeftModel
4
5base_model_id = "Qwen/Qwen3-4B"
6adapter_id = "NightPrince/Qwen3-4B-Islamic-Arabic-LoRA"
7
8# Configure 4-bit quantization
9bnb_config = BitsAndBytesConfig(
10 load_in_4bit=True,
11 bnb_4bit_quant_type="nf4",
12 bnb_4bit_compute_dtype=torch.bfloat16,
13 bnb_4bit_use_double_quant=True,
14)
15
16# Load base model in 4-bit
17tokenizer = AutoTokenizer.from_pretrained(base_model_id)
18base_model = AutoModelForCausalLM.from_pretrained(
19 base_model_id,
20 quantization_config=bnb_config,
21 device_map="auto",
22)
23
24# Attach the LoRA adapter
25model = PeftModel.from_pretrained(base_model, adapter_id)
26model.eval()
27
28SYSTEM_PROMPT = (
29 "أنت مساعد عالم إسلامي متخصص. "
30 "أجب على الأسئلة بدقة استناداً إلى القرآن الكريم والسنة النبوية والفقه الإسلامي الكلاسيكي. "
31 "استشهد بالمصادر حيثما أمكن. كن موجزاً لكن شاملاً."
32)
33
34messages = [
35 {"role": "system", "content": SYSTEM_PROMPT},
36 {"role": "user", "content": "ما حكم صلاة الجمعة على المسافر؟"},
37]
38
39text = tokenizer.apply_chat_template(
40 messages,
41 tokenize=False,
42 add_generation_prompt=True,
43)
44inputs = tokenizer(text, return_tensors="pt").to(model.device)
45
46with torch.no_grad():
47 outputs = model.generate(
48 **inputs,
49 max_new_tokens=512,
50 temperature=0.7,
51 top_p=0.9,
52 do_sample=True,
53 )
54
55response = tokenizer.decode(outputs[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
56print(response)
1import torch
2from transformers import AutoTokenizer, AutoModelForCausalLM
3from peft import PeftModel
4
5base_model_id = "Qwen/Qwen3-4B"
6adapter_id = "NightPrince/Qwen3-4B-Islamic-Arabic-LoRA"
7
8tokenizer = AutoTokenizer.from_pretrained(base_model_id)
9base_model = AutoModelForCausalLM.from_pretrained(
10 base_model_id,
11 torch_dtype=torch.float16,
12 device_map="auto",
13)
14
15model = PeftModel.from_pretrained(base_model, adapter_id)
16model.eval()
If you want to merge the adapter into the base weights for faster inference (equivalent to the
merged model):
1# Requires loading base model in fp16 (not quantized) first
2merged_model = model.merge_and_unload()
3merged_model.save_pretrained("./Qwen3-4B-Islamic-Arabic-merged")
4tokenizer.save_pretrained("./Qwen3-4B-Islamic-Arabic-merged")
This adapter was produced by QLoRA fine-tuning (r=64, α=128) of Qwen3-4B on the
NightPrince/islamic-arabic-qa dataset over 3 epochs on 4× RTX 2080 Ti GPUs.
For full training details, hyperparameters, and evaluation results, see the
main model card.
1@misc{alnwsany2026qwen3islamicarbic,
2 author = {Yahya Alnwsany},
3 title = {Qwen3-4B-Islamic-Arabic: QLoRA Fine-Tuning of Qwen3-4B on Islamic Arabic Q\&A},
4 year = {2026},
5 howpublished = {\url{https://huggingface.co/NightPrince/Qwen3-4B-Islamic-Arabic}},
6 note = {Base model: Qwen/Qwen3-4B. Dataset: NightPrince/islamic-arabic-qa.}
7}
Apache 2.0 — consistent with the base model
Qwen/Qwen3-4B.