File size: 4,063 Bytes
b6d5568
80469dc
 
 
f1c52e0
80469dc
 
 
 
 
f1c52e0
80469dc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b6d5568
80469dc
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
---
base_model: unsloth/granite-4.0-350m-unsloth-bnb-4bit
library_name: peft
pipeline_tag: text-generation
tags:
- base_model:adapter:unsloth/granite-4.0-350m-unsloth-bnb-4bit
- lora
- sft
- transformers
- trl
- unsloth
- text-to-sql
license: apache-2.0
datasets:
- b-mc2/sql-create-context
---

# Model Card for granite_sql (checkpoint-6000)

LoRA adapter fine-tuning IBM Granite 4.0 350M for text-to-SQL generation: given a
`CREATE TABLE` schema and a natural-language question, generate the corresponding SQL query.

## Model Details

### Model Description

This checkpoint (step 6000 of 6432, epoch 2.80/3) is the best-performing checkpoint
of the run — lowest eval loss among all saved checkpoints (see Results).

- **Model type:** LoRA adapter (PEFT) on a causal LM
- **Language(s):** SQL (generation), English (instructions)
- **License:** Apache 2.0 (inherited from base model)
- **Finetuned from model:** [unsloth/granite-4.0-350m-unsloth-bnb-4bit](https://huggingface.co/unsloth/granite-4.0-350m-unsloth-bnb-4bit) (IBM Granite 4.0, 350M, GraniteMoeHybrid)

## How to Get Started with the Model

```python
from unsloth import FastLanguageModel

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="/workspace/outputs/granite_sql_train/checkpoint-6000",
    load_in_4bit=False,
    device_map="cuda:0",
)
FastLanguageModel.for_inference(model)

instruction = """Generate ONLY the SQL query for the following database.

Do not explain your answer.
Do not include markdown.
Do not include any additional text.

Schema:
{schema}

Question:
{question}

SQL:"""

messages = [{"role": "user", "content": [{"type": "text", "text": instruction.format(schema=schema, question=question)}]}]
input_text = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
inputs = tokenizer(input_text, add_special_tokens=False, return_tensors="pt").to("cuda")
output = model.generate(**inputs, max_new_tokens=256, use_cache=True, temperature=0.7, top_p=0.8, top_k=20)
```

## Training Details

### Training Data

[b-mc2/sql-create-context](https://huggingface.co/datasets/b-mc2/sql-create-context) —
schema + natural-language-question + SQL-answer triples. Split via
`train_test_split(test_size=10000, seed=42, shuffle=True)`: remaining rows for train, 10,000 held out for eval.

### Training Procedure

LoRA (r=16, alpha=32, dropout=0, bias=none, no rslora) applied to
`q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj, shared_mlp.input_linear, shared_mlp.output_linear`,
trained with Unsloth + TRL SFTTrainer.

#### Training Hyperparameters

- **Training regime:** bf16 mixed precision
- Epochs: 3 | Per-device train batch size: 32 | Per-device eval batch size: 64 | Grad accumulation: 1
- Learning rate: 2e-4, linear schedule, 50 warmup steps
- Optimizer: adamw_8bit, weight decay 0.001, max grad norm 1.0
- Seed: 3407 | Eval every 200 steps | Save every 500 steps

#### Speeds, Sizes, Times

Full run: 6432 steps / 3 epochs, train_runtime ≈ 2567s. This adapter checkpoint: ~26.7MB (`adapter_model.safetensors`).

## Evaluation

### Testing Data & Metrics

10,000-row held-out split of `b-mc2/sql-create-context` (see Training Data), evaluated by SFT eval loss (cross-entropy) every 200 steps.

### Results

| Checkpoint | Step | Eval loss |
|---|---|---|
| checkpoint-4000 | 4000 | 0.02830 |
| checkpoint-5000 | 5000 | 0.02811 |
| **checkpoint-6000** | **6000** | **0.02673 (best saved)** |
| checkpoint-6432 (final) | 6432 | ~0.02746 (nearest eval at step 6400) |

Lowest eval_loss observed during training was 0.02630 at step 5200, but no checkpoint was
saved at that exact step (checkpoints every 500 steps, eval every 200), so checkpoint-6000
is the closest usable minimum. `load_best_model_at_end` was not enabled, so this checkpoint
was selected manually by comparing `eval_loss` across saved checkpoints.

## Compute Infrastructure

### Hardware

- 1× NVIDIA A100 40GB

### Software

- Unsloth
- Transformers
- PyTorch

---

## Model Card Authors

- Yian

## Contact

- https://github.com/Siruenyian