junmingg commited on
Commit
06f3bc7
·
verified ·
1 Parent(s): c01b908

Upload README.md with huggingface_hub

Browse files
Files changed (1) hide show
  1. README.md +119 -21
README.md CHANGED
@@ -1,21 +1,119 @@
1
- ---
2
- base_model: unsloth/qwen2.5-coder-7b-instruct-bnb-4bit
3
- tags:
4
- - text-generation-inference
5
- - transformers
6
- - unsloth
7
- - qwen2
8
- license: apache-2.0
9
- language:
10
- - en
11
- ---
12
-
13
- # Uploaded finetuned model
14
-
15
- - **Developed by:** junmingg
16
- - **License:** apache-2.0
17
- - **Finetuned from model :** unsloth/qwen2.5-coder-7b-instruct-bnb-4bit
18
-
19
- This qwen2 model was trained 2x faster with [Unsloth](https://github.com/unslothai/unsloth) and Huggingface's TRL library.
20
-
21
- [<img src="https://raw.githubusercontent.com/unslothai/unsloth/main/images/unsloth%20made%20with%20love.png" width="200"/>](https://github.com/unslothai/unsloth)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ base_model: Qwen/Qwen2.5-Coder-7B-Instruct
4
+ datasets:
5
+ - b-mc2/sql-create-context
6
+ language:
7
+ - en
8
+ library_name: transformers
9
+ pipeline_tag: text-generation
10
+ tags:
11
+ - text-to-sql
12
+ - text2sql
13
+ - sql
14
+ - qlora
15
+ - peft
16
+ - unsloth
17
+ - qwen2.5
18
+ ---
19
+
20
+ # Qwen2.5-Coder-7B Text-to-SQL (QLoRA)
21
+
22
+ A QLoRA fine-tune of [`Qwen/Qwen2.5-Coder-7B-Instruct`](https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct)
23
+ that turns a **SQL schema + a natural-language question** into **a single SQL query**. Trained on a single
24
+ RTX 3090 with [Unsloth](https://github.com/unslothai/unsloth) + TRL, completion-only loss.
25
+
26
+ > Trained and evaluated by `junmingg`. Code + reproducible eval harness:
27
+ > https://github.com/junmingg/Unsloth-Qwen2.5-Coder-7b-Text-to-SQL-SFT
28
+
29
+ ## Results (held-out 500 examples)
30
+
31
+ | Model | Exact match | Semantic equiv. | SQL validity |
32
+ |---|---|---|---|
33
+ | Base `Qwen2.5-Coder-7B-Instruct` (zero-shot) | 3.8% | 67.0% | 100.0% |
34
+ | **+ QLoRA (this model)** | **78.8%** | **86.2%** | **99.2%** |
35
+
36
+ ![benchmark](benchmark.png)
37
+
38
+ - **Exact match** = canonicalized string match (via `sqlglot`); a strict *lower bound* — different-but-correct
39
+ SQL fails it.
40
+ - **Semantic equivalence** = an independent LLM judge (GLM-5-Turbo) decides whether the predicted SQL is
41
+ equivalent to the gold for the question. This is the headline correctness metric.
42
+ - **SQL validity** = fraction of predictions that parse under `sqlglot`.
43
+
44
+ Fine-tuning lifted exact-match by **+75.0 points** and semantic-equivalence by **+19.2 points** on prompts the
45
+ model never saw during training (0/500 test prompts appear in the training data). The large exact-match jump
46
+ is the model learning the dataset's SQL conventions (quoting, value formatting); the semantic jump is genuine
47
+ correctness beyond formatting.
48
+
49
+ ### Label-noise ablation
50
+
51
+ A variant trained with malformed gold answers filtered out of the training set
52
+ (`junmingg/qwen2.5-coder-7b-text2sql-filtered`) reaches the same accuracy with slightly higher validity
53
+ (100% on valid-reference test rows). Cleaning 0.32% of train labels moved validity, not accuracy — details in
54
+ the [repo README](https://github.com/junmingg/Unsloth-Qwen2.5-Coder-7b-Text-to-SQL-SFT).
55
+
56
+ ## Usage
57
+
58
+ The model was trained with a specific system prompt and ChatML format — **use the same formatting** for best
59
+ results.
60
+
61
+ ```python
62
+ from transformers import AutoModelForCausalLM, AutoTokenizer
63
+ import torch
64
+
65
+ REPO = "junmingg/qwen2.5-coder-7b-text2sql"
66
+ model = AutoModelForCausalLM.from_pretrained(REPO, torch_dtype=torch.bfloat16, device_map="auto")
67
+ tok = AutoTokenizer.from_pretrained(REPO)
68
+
69
+ SYSTEM = ("You are a precise text-to-SQL engine. Given a SQL schema and a natural-language "
70
+ "question, respond with a single valid SQL query and nothing else.")
71
+
72
+ schema = "CREATE TABLE head (age INTEGER, name TEXT)"
73
+ question = "How many heads of the departments are older than 56?"
74
+
75
+ messages = [
76
+ {"role": "system", "content": SYSTEM},
77
+ {"role": "user", "content": f"Schema:\n{schema}\n\nQuestion: {question}"},
78
+ ]
79
+ inputs = tok.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device)
80
+ out = model.generate(inputs, max_new_tokens=256, do_sample=False)
81
+ print(tok.decode(out[0][inputs.shape[1]:], skip_special_tokens=True))
82
+ # -> SELECT COUNT(*) FROM head WHERE age > 56
83
+ ```
84
+
85
+ LoRA adapters only (smaller): `junmingg/qwen2.5-coder-7b-text2sql-lora`.
86
+ GGUF quants (`q4_k_m`, `q8_0`) for llama.cpp / Ollama: `junmingg/qwen2.5-coder-7b-text2sql-GGUF`.
87
+
88
+ ## Training
89
+
90
+ | | |
91
+ |---|---|
92
+ | Base | `Qwen/Qwen2.5-Coder-7B-Instruct` (4-bit QLoRA) |
93
+ | Data | [`b-mc2/sql-create-context`](https://huggingface.co/datasets/b-mc2/sql-create-context), 25k train / 500 held-out test (seed 42) |
94
+ | LoRA | r=16, α=16, dropout=0, all linear layers |
95
+ | Schedule | 1 epoch (~1,557 steps), effective batch 16, lr 2e-4 cosine, warmup 0.03 |
96
+ | Precision / optim | bf16, `adamw_8bit`, `max_seq_length=2048` |
97
+ | Loss | completion-only (prompt masked; loss on the SQL answer only) |
98
+ | Hardware / time | 1× RTX 3090, ~59 min |
99
+
100
+ ## Evaluation methodology
101
+
102
+ Both base and fine-tuned models are evaluated with **identical** prompting and greedy decoding on the **same**
103
+ held-out 500-example test set (disjoint from train; verified 0 prompt overlap). Semantic equivalence is scored
104
+ by an independent LLM judge (GLM-5-Turbo). Reporting both exact-match and semantic-equivalence is deliberate:
105
+ exact-match is a lower bound, semantic-equivalence is the fairer correctness signal. The full harness is in the
106
+ linked repo (`python -m src.eval`, `python -m src.judge`).
107
+
108
+ ## Limitations
109
+
110
+ - Trained on synthetic, largely single-table schemas (`sql-create-context`, derived from WikiSQL + Spider);
111
+ not evaluated for SQL-injection safety or complex multi-join queries.
112
+ - The dataset contains a small amount of label noise (~0.3–0.6% of gold answers are themselves unparseable —
113
+ WikiSQL artifacts); the model's rare "invalid" outputs are predominantly faithful reproductions of those
114
+ malformed references rather than novel errors.
115
+ - Outputs should be validated/parameterized before execution against a real database.
116
+
117
+ ## License & attribution
118
+
119
+ Apache-2.0 (inherited from the base model). Training data: `b-mc2/sql-create-context` (CC-BY-4.0).