Files

107 lines
3.8 KiB
Markdown
Raw Permalink Normal View History

---
license: apache-2.0
base_model: Qwen/Qwen2.5-Coder-1.5B-Instruct
tags:
- code
- python
- qlora
- lora
- peft
- qwen2
- text-generation
datasets:
- sahil2801/CodeAlpaca-20k
language:
- en
pipeline_tag: text-generation
library_name: transformers
---
# qwen2.5-coder-1.5b-CodeSLM-Nihal
A **QLoRA fine-tune of Qwen2.5-Coder-1.5B-Instruct** into a **terse, code-first Python assistant**,
built as a hands-on, phase-by-phase fine-tuning learning project on a single 8 GB consumer GPU
(NVIDIA RTX 5060).
The base model is a capable coder but chronically verbose — every answer trails a prose essay. This
fine-tune trains it to reply with **correct, minimal code and nothing else.**
## Headline result
![Output length: 78% shorter after fine-tuning](./token_reduction.png)
On 18 held-out prompts (greedy decoding), average output length dropped **from 272 to 60 tokens
(78%)** while core algorithm correctness was preserved.
## Training curve
![Training vs. validation loss](./loss_curve.png)
| Checkpoint (epoch) | Validation loss |
|---|---|
| 0.13 | 0.5157 |
| 0.38 | 0.5020 |
| 0.88 | 0.4927 |
| 1.00 | 0.4928 |
Train and validation loss tracked each other the entire run — clean convergence, **no overfitting.**
Final train loss **0.4906**; validation mean token-accuracy **~85.4%**.
> These are training/next-token metrics plus a qualitative 18-prompt comparison. No standardized code
> benchmark (HumanEval/MBPP) was run.
## Training details
| | |
|---|---|
| Base | `Qwen/Qwen2.5-Coder-1.5B-Instruct` |
| Method | QLoRA (4-bit NF4 base + LoRA), completion-only loss |
| Dataset | `sahil2801/CodeAlpaca-20k` → Qwen ChatML (19,020 train / 1,002 val) |
| LoRA | r=16, α=32, dropout=0.05, targets q/k/v/o/gate/up/down |
| Trainable params | 18.46M (~1.18%) |
| Schedule | 1 epoch, 1,189 steps, LR 2e-4 cosine + 3% warmup |
| Batch | 2 × 8 grad-accum = effective 16 |
| Optimizer | paged_adamw_8bit, bf16, gradient checkpointing, max_len 1024 |
| Hardware | 1× RTX 5060 (8 GB), ~50 min, peak VRAM 3.32 GB |
## Files in this repo
- **Root** — merged fp16 model (Transformers format); load directly with `from_pretrained`.
- **`adapter/`** — the standalone LoRA adapter (~36 MB) to apply onto the base yourself.
- **`gguf/`** — `…-f16.gguf` (full precision) and `…-Q4_K_M.gguf` (~986 MB) for llama.cpp / Ollama.
## Usage
### Transformers
```python
from transformers import AutoModelForCausalLM, AutoTokenizer
m = "MohdNihal03/qwen2.5-coder-1.5b-CodeSLM-Nihal"
tok = AutoTokenizer.from_pretrained(m)
model = AutoModelForCausalLM.from_pretrained(m, device_map="auto")
msgs = [{"role": "user", "content": "Write a Python function that reverses a string without slicing."}]
ids = tok.apply_chat_template(msgs, add_generation_prompt=True, return_tensors="pt").to(model.device)
print(tok.decode(model.generate(ids, max_new_tokens=128)[0][ids.shape[1]:], skip_special_tokens=True))
```
### Ollama
```
ollama run mohdnihalll03/qwen2.5-coder-1.5b-codeslm-nihal
```
Prompt format: Qwen2.5 ChatML. Suggested: `temperature 0.2`, stop on `<|im_start|>` / `<|im_end|>`.
## Limitations
- **Style over correctness:** fine-tuning changed formatting far more than correctness. A few subtle
base-model bugs persist (an email-regex character-class quirk; a `@timer` decorator missing
`functools.wraps`), and one bracket-matching answer regressed to a logic bug on empty-stack input.
**Review generated code before use.**
- Python-focused; 1.5B params + 4-bit quantization — not a substitute for a large frontier model.
- Occasional instruction drift (`print` vs `return`, tabulation vs memoization).
## Attribution
- Base: Qwen2.5-Coder-1.5B-Instruct (© Alibaba Cloud, Apache-2.0)
- Data: `sahil2801/CodeAlpaca-20k`
- Fine-tuned by **Nihal** as a QLoRA learning project (TRL / PEFT / bitsandbytes).