376 lines
12 KiB
Markdown
376 lines
12 KiB
Markdown
|
|
---
|
|||
|
|
language:
|
|||
|
|
- ks
|
|||
|
|
- en
|
|||
|
|
license: gpl-3.0
|
|||
|
|
base_model:
|
|||
|
|
- sarvamai/sarvam-translate
|
|||
|
|
library_name: transformers
|
|||
|
|
pipeline_tag: text-generation
|
|||
|
|
tags:
|
|||
|
|
- translation
|
|||
|
|
- kashmiri
|
|||
|
|
- english
|
|||
|
|
- gemma3
|
|||
|
|
- sarvam-translate
|
|||
|
|
- low-resource
|
|||
|
|
- lora
|
|||
|
|
- merged
|
|||
|
|
model-index:
|
|||
|
|
- name: koshur-kouter-ks-en_v1
|
|||
|
|
results:
|
|||
|
|
- task:
|
|||
|
|
type: translation
|
|||
|
|
name: Translation (ks→en)
|
|||
|
|
dataset:
|
|||
|
|
name: benchmark_simple_ks2en_200
|
|||
|
|
type: custom
|
|||
|
|
metrics:
|
|||
|
|
- type: bleu
|
|||
|
|
value: 13.07
|
|||
|
|
name: BLEU
|
|||
|
|
- type: chrf
|
|||
|
|
value: 46.99
|
|||
|
|
name: chrF
|
|||
|
|
- type: exact_match
|
|||
|
|
value: 0.0
|
|||
|
|
name: Exact Match
|
|||
|
|
- task:
|
|||
|
|
type: translation
|
|||
|
|
name: Translation (internal eval)
|
|||
|
|
dataset:
|
|||
|
|
name: internal_eval
|
|||
|
|
type: custom
|
|||
|
|
metrics:
|
|||
|
|
- type: bleu
|
|||
|
|
value: 100.0
|
|||
|
|
name: BLEU
|
|||
|
|
- type: chrf
|
|||
|
|
value: 100.0
|
|||
|
|
name: chrF
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Koshur Kouter KS-EN v1
|
|||
|
|
|
|||
|
|
[](https://colab.research.google.com/#fileId=https://huggingface.co/Omarrran/koshur-kouter-ks-en_v1/blob/main/notebooks/colab_load_stage1_model.ipynb)
|
|||
|
|
|
|||
|
|
A Kashmiri ↔ English translation model fine-tuned from [`sarvamai/sarvam-translate`](https://huggingface.co/sarvamai/sarvam-translate) (Gemma 3, 4.5B parameters). A QLoRA adapter has been merged into the base weights and published as a fully self-contained `transformers`-compatible checkpoint.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Model Details
|
|||
|
|
|
|||
|
|
| | |
|
|||
|
|
|---|---|
|
|||
|
|
| **Authors** | Haq Nawaz Malik ([@Omarrran](https://huggingface.co/Omarrran)) · Nahfid Nissar ([@nafiboi](https://huggingface.co/nafiboi)) |
|
|||
|
|
| **Base model** | `sarvamai/sarvam-translate` |
|
|||
|
|
| **Architecture** | `Gemma3ForCausalLM` |
|
|||
|
|
| **Parameters** | ~4.55 B (bf16) |
|
|||
|
|
| **Languages** | Kashmiri (ks), English (en) |
|
|||
|
|
| **License** | GPL-3.0 |
|
|||
|
|
| **Precision** | bfloat16 |
|
|||
|
|
| **Context length** | 131,072 tokens |
|
|||
|
|
| **Vocabulary size** | 262,208 |
|
|||
|
|
| **Layers / hidden / heads / KV heads** | 34 / 2560 / 8 / 4 |
|
|||
|
|
| **Checkpoint size** | 8.48 GiB (5 shards) |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Intended Use
|
|||
|
|
|
|||
|
|
**Primary use cases**
|
|||
|
|
|
|||
|
|
- Kashmiri ↔ English machine translation, in either direction.
|
|||
|
|
- Downstream evaluation, comparison, and benchmarking of Kashmiri NLP systems.
|
|||
|
|
- Manual review workflows on mixed-direction prompts.
|
|||
|
|
- Direct loading via `transformers` without PEFT adapter merging.
|
|||
|
|
|
|||
|
|
**Out-of-scope use**
|
|||
|
|
|
|||
|
|
- Production-grade translation without human review.
|
|||
|
|
- Long-form document translation (model is tuned on short, sentence-level pairs).
|
|||
|
|
- Open-ended generation, dialogue, or any task other than translation.
|
|||
|
|
- Safety-critical applications (medical, legal, financial advice).
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Quickstart
|
|||
|
|
|
|||
|
|
### Installation
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
pip install -U transformers accelerate sentencepiece safetensors torch
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Load the model
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
import torch
|
|||
|
|
from transformers import AutoTokenizer, AutoModelForCausalLM
|
|||
|
|
|
|||
|
|
repo_id = "Omarrran/koshur-kouter-ks-en_v1"
|
|||
|
|
|
|||
|
|
tokenizer = AutoTokenizer.from_pretrained(repo_id)
|
|||
|
|
model = AutoModelForCausalLM.from_pretrained(
|
|||
|
|
repo_id,
|
|||
|
|
torch_dtype=torch.bfloat16,
|
|||
|
|
device_map="auto",
|
|||
|
|
).eval()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Translate
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
def first_nonempty_line(text: str) -> str:
|
|||
|
|
for line in text.splitlines():
|
|||
|
|
if line.strip():
|
|||
|
|
return line.strip()
|
|||
|
|
return text.strip()
|
|||
|
|
|
|||
|
|
|
|||
|
|
def translate(source: str, direction: str, max_new_tokens: int = 48) -> str:
|
|||
|
|
instructions = {
|
|||
|
|
"ks2en": "Translate the text below to English. Return only the translation.",
|
|||
|
|
"en2ks": "Translate the text below to Kashmiri. Return only the translation.",
|
|||
|
|
}
|
|||
|
|
messages = [
|
|||
|
|
{"role": "system", "content": instructions[direction]},
|
|||
|
|
{"role": "user", "content": source},
|
|||
|
|
]
|
|||
|
|
prompt = tokenizer.apply_chat_template(
|
|||
|
|
messages, tokenize=False, add_generation_prompt=True
|
|||
|
|
)
|
|||
|
|
inputs = tokenizer(
|
|||
|
|
prompt, return_tensors="pt", truncation=True, max_length=1024
|
|||
|
|
).to(model.device)
|
|||
|
|
|
|||
|
|
with torch.no_grad():
|
|||
|
|
outputs = model.generate(
|
|||
|
|
**inputs,
|
|||
|
|
max_new_tokens=max_new_tokens,
|
|||
|
|
do_sample=False,
|
|||
|
|
repetition_penalty=1.15,
|
|||
|
|
no_repeat_ngram_size=3,
|
|||
|
|
pad_token_id=tokenizer.eos_token_id,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
suffix = outputs[0][inputs.input_ids.shape[1]:]
|
|||
|
|
return first_nonempty_line(tokenizer.decode(suffix, skip_special_tokens=True))
|
|||
|
|
|
|||
|
|
|
|||
|
|
print(translate("Hello how are you doing today?.", "en2ks"))
|
|||
|
|
print(translate("کٔشیر چھُ اکھ خوبصورت جٲی", "ks2en"))
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
A ready-to-run notebook is included at `notebooks/colab_load_stage1_model.ipynb`.
|
|||
|
|
|
|||
|
|
[](https://colab.research.google.com/#fileId=https://huggingface.co/Omarrran/koshur-kouter-ks-en_v1/blob/main/notebooks/colab_load_stage1_model.ipynb)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Recommended Decoding
|
|||
|
|
|
|||
|
|
The model is sensitive to decoding settings. The defaults shipped in `generation_config.json` are tuned for stable translation rather than open-ended generation:
|
|||
|
|
|
|||
|
|
| Parameter | Value |
|
|||
|
|
|---|---|
|
|||
|
|
| `do_sample` | `False` |
|
|||
|
|
| `max_new_tokens` | `48` |
|
|||
|
|
| `repetition_penalty` | `1.15` |
|
|||
|
|
| `no_repeat_ngram_size` | `3` |
|
|||
|
|
|
|||
|
|
**Post-processing:** decode only the generated suffix and take the first non-empty line. Looser decoding (sampling, longer windows, no repetition penalty) produces continuation artifacts and quote-tail noise.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Training
|
|||
|
|
|
|||
|
|
### Procedure
|
|||
|
|
|
|||
|
|
The model was trained with a **QLoRA supervised fine-tuning** setup on a bidirectional Kashmiri ↔ English parallel corpus, on top of `sarvamai/sarvam-translate`. The resulting LoRA adapter was merged into the base weights; this release ships the merged checkpoint.
|
|||
|
|
|
|||
|
|
### Hyperparameters
|
|||
|
|
|
|||
|
|
| Hyperparameter | Value |
|
|||
|
|
|---|---|
|
|||
|
|
| Max sequence length | 512 |
|
|||
|
|
| Effective batch size | 32 |
|
|||
|
|
| Gradient accumulation | 1 |
|
|||
|
|
| Precision | bf16 |
|
|||
|
|
| Optimizer | `paged_adamw_8bit` |
|
|||
|
|
| Learning rate | 2 × 10⁻⁴ |
|
|||
|
|
| LR scheduler | cosine |
|
|||
|
|
| Warmup ratio | 0.03 |
|
|||
|
|
| Weight decay | 0.01 |
|
|||
|
|
| Max grad norm | 1.0 |
|
|||
|
|
| Epochs | 2 |
|
|||
|
|
| LoRA rank / alpha / dropout | 32 / 64 / 0.05 |
|
|||
|
|
| LoRA target modules | `q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj` |
|
|||
|
|
| Modules saved (full) | `lm_head, embed_tokens` |
|
|||
|
|
| Logging / eval / save steps | 10 / 250 / 250 |
|
|||
|
|
|
|||
|
|
### Observed training metrics
|
|||
|
|
|
|||
|
|
| Metric | Value |
|
|||
|
|
|---|---|
|
|||
|
|
| Total steps | 20,060 |
|
|||
|
|
| Wall-clock time | 5.19 h |
|
|||
|
|
| Peak VRAM | 12.88 GB |
|
|||
|
|
| Train loss — first logged | 8.0698 |
|
|||
|
|
| Train loss — best logged | 0.5632 |
|
|||
|
|
| Train loss — last step (step 20,060) | 0.5819 |
|
|||
|
|
| **Final train loss (averaged across run)** | **0.6242** |
|
|||
|
|
| Token accuracy — last / best | 0.8548 / 0.8557 |
|
|||
|
|
| Eval loss — first / best | 1.4610 / 1.2011 |
|
|||
|
|
| **Final eval loss (step 20,000)** | **1.2294** |
|
|||
|
|
|
|||
|
|
### Training curves
|
|||
|
|
|
|||
|
|
| Loss | Token accuracy | Eval loss | GPU memory |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
|  |  |  |  |
|
|||
|
|
|
|||
|
|
Raw training logs are available under `artifacts/`:
|
|||
|
|
- `stage1_training_log.jsonl`
|
|||
|
|
- `stage1_summary.json`
|
|||
|
|
- `stage1_eval.json`
|
|||
|
|
- `stage1_metrics_summary.json`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Evaluation
|
|||
|
|
|
|||
|
|
### Internal eval (200 samples)
|
|||
|
|
|
|||
|
|
| Metric | Value |
|
|||
|
|
|---|---|
|
|||
|
|
| BLEU | 100.0 |
|
|||
|
|
| chrF | 100.0 |
|
|||
|
|
|
|||
|
|
> ⚠️ **Caveat.** This score is implausibly perfect and almost certainly reflects an easy or in-distribution slice. It is reported here for completeness and **must not** be interpreted as a generalization estimate.
|
|||
|
|
|
|||
|
|
### `benchmark_simple_ks2en_200` (ks → en)
|
|||
|
|
|
|||
|
|
| Metric | Value |
|
|||
|
|
|---|---|
|
|||
|
|
| BLEU | 13.07 |
|
|||
|
|
| chrF | 46.99 |
|
|||
|
|
| Exact match | 0.00 |
|
|||
|
|
|
|||
|
|
The benchmark contains some noisy or mismatched references; scores should be interpreted as a lower-bound indicator rather than a clean evaluation. Files: `benchmarks/benchmark_simple_ks2en_200.{jsonl,stage1_eval.json}`.
|
|||
|
|
|
|||
|
|
### 500-sample mixed-direction review set (source-only)
|
|||
|
|
|
|||
|
|
A 500-sample source-only set is provided for **human review**. Automatic BLEU/chrF is not applicable.
|
|||
|
|
|
|||
|
|
| File | Purpose |
|
|||
|
|
|---|---|
|
|||
|
|
| `kashmiri_benchmark_500_source_only.jsonl` | Source prompts |
|
|||
|
|
| `kashmiri_benchmark_500_stage1_safe_pred.jsonl` | Model predictions |
|
|||
|
|
| `kashmiri_benchmark_500_stage1_safe_pred.{summary.json, xlsx, summary.xlsx}` | Aggregates and review-friendly spreadsheets |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Hardware Requirements
|
|||
|
|
|
|||
|
|
### Inference
|
|||
|
|
|
|||
|
|
| Setting | VRAM | Notes |
|
|||
|
|
|---|---|---|
|
|||
|
|
| Short bf16 inference (observed) | ~8.5 GB | Validated on Modal |
|
|||
|
|
| Recommended for short prompts | ≥ 12 GB | Comfortable headroom |
|
|||
|
|
| Long prompts / batching | 16–24 GB+ | Recommended |
|
|||
|
|
| CPU loading | ≥ 24 GB RAM | Full merged shards held in memory |
|
|||
|
|
| Colab | L4 / A100 | Use 4/8-bit quantization on smaller GPUs |
|
|||
|
|
|
|||
|
|
### Training (reference)
|
|||
|
|
|
|||
|
|
- Peak VRAM: **12.88 GB**
|
|||
|
|
- Wall-clock: **5.19 h** for 20,060 steps
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Repository Layout
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
.
|
|||
|
|
├── README.md
|
|||
|
|
├── config.json
|
|||
|
|
├── generation_config.json
|
|||
|
|
├── model.safetensors.index.json
|
|||
|
|
├── model-0000{1..5}-of-00005.safetensors
|
|||
|
|
├── tokenizer.json
|
|||
|
|
├── tokenizer.model
|
|||
|
|
├── artifacts/
|
|||
|
|
│ ├── config.json
|
|||
|
|
│ ├── stage1_eval.json
|
|||
|
|
│ ├── stage1_metrics_summary.json
|
|||
|
|
│ ├── stage1_summary.json
|
|||
|
|
│ └── stage1_training_log.jsonl
|
|||
|
|
├── assets/
|
|||
|
|
│ ├── stage1_training_loss.svg
|
|||
|
|
│ ├── stage1_token_accuracy.svg
|
|||
|
|
│ ├── stage1_eval_loss.svg
|
|||
|
|
│ └── stage1_gpu_alloc_gb.svg
|
|||
|
|
├── benchmarks/
|
|||
|
|
│ ├── benchmark_simple_ks2en_200.jsonl
|
|||
|
|
│ ├── benchmark_simple_ks2en_200.stage1_eval.json
|
|||
|
|
│ ├── kashmiri_benchmark_500_source_only.jsonl
|
|||
|
|
│ ├── kashmiri_benchmark_500_stage1_safe_pred.jsonl
|
|||
|
|
│ ├── kashmiri_benchmark_500_stage1_safe_pred.summary.json
|
|||
|
|
│ ├── kashmiri_benchmark_500_stage1_safe_pred.xlsx
|
|||
|
|
│ └── kashmiri_benchmark_500_stage1_safe_pred.summary.xlsx
|
|||
|
|
└── notebooks/
|
|||
|
|
└── colab_load_stage1_model.ipynb
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Limitations and Risks
|
|||
|
|
|
|||
|
|
- **Decoding sensitivity.** Output quality degrades sharply under sampling or loose repetition controls. Use the recommended deterministic settings.
|
|||
|
|
- **Length bias.** The model was trained on sentence-level pairs (≤ 512 tokens). Long-form translation is not supported.
|
|||
|
|
- **Internal eval is not generalization.** The 100/100 BLEU/chrF figure is a fixture, not a quality claim.
|
|||
|
|
- **Benchmark noise.** Reported BLEU/chrF on `benchmark_simple_ks2en_200` is depressed by reference noise; treat as indicative only.
|
|||
|
|
- **Domain coverage.** The training distribution skews toward general / literary Kashmiri; performance on technical, legal, or dialectal inputs is unverified.
|
|||
|
|
- **Artifacts.** Earlier decoding configurations occasionally produced quote-tail or continuation artifacts; the shipped `generation_config.json` mitigates but does not eliminate these.
|
|||
|
|
- **Low-resource caveat.** Kashmiri remains a low-resource language; reference quality, orthographic normalization, and dialectal coverage are open problems that bound any model trained on currently-available data.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Citation
|
|||
|
|
|
|||
|
|
If you use this model, please cite:
|
|||
|
|
|
|||
|
|
```bibtex
|
|||
|
|
@misc{malik2026koshurkouter,
|
|||
|
|
title = {Koshur Kouter KS-EN v1: A Merged QLoRA Kashmiri--English Translation Model},
|
|||
|
|
author = {Malik, Haq Nawaz and Nissar, Nahfid},
|
|||
|
|
year = {2026},
|
|||
|
|
howpublished = {\url{https://huggingface.co/Omarrran/koshur-kouter-ks-en_v1}},
|
|||
|
|
note = {Fine-tuned from sarvamai/sarvam-translate}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Please also cite the base model:
|
|||
|
|
|
|||
|
|
```bibtex
|
|||
|
|
@misc{sarvam2025translate,
|
|||
|
|
title = {Sarvam-Translate},
|
|||
|
|
author = {{Sarvam AI}},
|
|||
|
|
howpublished = {\url{https://huggingface.co/sarvamai/sarvam-translate}}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Acknowledgements
|
|||
|
|
|
|||
|
|
Built on top of `sarvamai/sarvam-translate`. Training and evaluation infrastructure run on Colab and Modal. Thanks to the broader Kashmiri NLP community whose data and tooling made this work possible.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Contact
|
|||
|
|
|
|||
|
|
- **Hugging Face:** [@Omarrran](https://huggingface.co/Omarrran) · [@nafiboi](https://huggingface.co/nafiboi)
|
|||
|
|
- **Issues / feedback:** open a discussion on the model repository.
|