rupkotha / finetune /README.md
Deb
rupkotha_1st_commit
f655146
|
Raw
History Blame Contribute Delete
4.73 kB
# Bengali distillation fine-tuning (`finetune/`)
Improve Stack A's weak Bengali by **fine-tuning MiniCPM-V 4.5 itself** — the
strongest OpenBMB-prize story (*"we improved the OpenBMB model for Bengali"*).
This stays on Stack A; only the served model weights change.
> Why fine-tune and not the IndicTrans2 pivot? The owner judged the pivot's
> translated register worse than native output. The native ceiling is MiniCPM's
> Bengali *generation*; fine-tuning on great Bengali raises that ceiling while
> keeping the warm native register. See the `bengali-quality-investigation` memory.
## The pipeline
```
drawings ──► [Gemma teacher] ──► Bengali stories ──► [purity gate] ──► train.json
LoRA fine-tune MiniCPM-V (vision frozen) ◄───┘
merge adapter
serve via vLLM ──► wire into Bengali path
```
| Stage | File | Where | Notes |
|---|---|---|---|
| 0. Source images | (manual, see below) | local | the real bottleneck |
| 1. Label + filter | `gen_labels.py` + `purity.py` | Modal (Gemma) | image → Bengali story, drop leaks |
| 2. LoRA train | `train_lora.py` | Modal A100 | ms-SWIFT (`model_type=minicpmv4_5`) |
| 3. Merge | `merge.py` | Modal A100 | adapter → full weights |
| 4. Serve | `serve_vllm.py` | Modal A10G | vLLM, no GGUF |
| 5. Wire | one branch in `core/vision_story.py` | local | route Bengali to the FT model |
## Stage 0 — source the drawings (`finetune/data/images/`)
Target ~300–500 diverse, on-distribution images. Mix all four:
- **Team-drawn crayon pics** — photograph ~100–150. Most authentic; do these first.
- **Quick, Draw!** — Google's doodle dataset (`https://quickdraw.withgoogle.com/data`);
pull a few categories (`.ndjson`/`.npy`), render strokes to PNG, optionally
composite 2–3 doodles into a scene.
- **Synthetic crayon** — an image model (e.g. SDXL) with prompts like
*"a child's crayon drawing of a house and the sun, simple, on white paper"*.
- **Toy / play photos** — stock or self-taken photos of toys/equipment.
Quality > quantity for LoRA. Keep them varied (objects, colours, scenes).
## Stage 1 — generate labels
```bash
modal deploy core/modal_infra.py # teacher served via run_vision_story
uv run python finetune/gen_labels.py --images finetune/data/images \
--out finetune/data/train.json --teacher gemma3:27b
```
Produces `train.json` (kept) and `train.json.rejected` (failed the gate). **Have a
Bengali speaker spot-check `kept`** — distillation caps the student at label quality.
Tune strictness in `purity.py` (`is_clean(max_foreign_letters=...)`).
## Stage 2 — LoRA train
Upload `finetune/data/` to the `rupkotha-finetune` Modal Volume, then validate
cheaply before the full run:
```bash
uv run modal run finetune/train_lora.py --max-steps 4 # smoke test
uv run modal run finetune/train_lora.py # full 3-epoch run
```
`train_lora.py` drives **ms-SWIFT** (`swift sft --model_type minicpmv4_5`), not
OpenBMB's official `finetune.py` — the latter pins torch 2.1.2 while MiniCPM-V 4.5
remote code needs torch>=2.4, and its finetune path doesn't target 4.5. SWIFT ships
a maintained recipe for this model so the dep matrix is solved. It converts our
MiniCPM `conversations` JSON to SWIFT's `messages`/`images` JSONL in-container.
Vision encoder frozen (`--freeze_vit true`), LoRA r=16 on the LLM `q/k/v/o_proj`.
SWIFT's nested checkpoint is copied to `out/lora-bengali/` so Stage 3 is unchanged.
## Stage 3 — merge
```bash
uv run modal run finetune/merge.py # → out/minicpm-v-bengali-merged/
```
## Stage 4 — serve + Stage 5 — wire
```bash
uv run modal deploy finetune/serve_vllm.py
```
Then set `FINETUNED_VISION_MODEL` in `core/model_config.py` to the merged path and
add a one-line branch in `core/vision_story.py`: when it's set and `language=="bn"`,
call `serve_vllm.generate_story_ft_remote(...)` instead of `generate_story_remote`.
(`run_translate`/pivot plumbing stays available as a fallback.)
## Evaluate
Hold out ~20 drawings; compare FT Bengali vs native Lever-#1 (`demo_story_bn_v2.wav`)
with a Bengali speaker. Ship the FT model only if it clearly wins.
## Cost / risk (hackathon reality)
Heaviest path: image curation (days) + ~1–3h A100 training + integration. Validated
upside: the Gemma teacher writes genuinely native Bengali (চাঁদমামা/পুকুর/খই), so the
student has an excellent target. Main risk is data volume/quality, not the method.