--- base_model: LiquidAI/LFM2.5-VL-450M library_name: peft license: apache-2.0 tags: - lora - sft - trl - vision-language - earth-observation - sentinel-2 - simsat - liquid-ai --- # SimSat LFM2.5-VL-450M v1 — LoRA adapter (superseded by v3) > **NOTE — superseded by [`HumanAIConvention/simsat-lfm25vl-450m-v3`](https://huggingface.co/HumanAIConvention/simsat-lfm25vl-450m-v3).** > v1 stays published for reference; v3 is canonical. v3 holdout numbers > (+18.8 pp action / -47 pp MAE over v1 Run 14) are documented on the v3 > model card. LoRA fine-tune of [`LiquidAI/LFM2.5-VL-450M`](https://huggingface.co/LiquidAI/LFM2.5-VL-450M) trained on operator-reviewed Sentinel-2 tiles for the **AI in Space Hackathon (DPhi Space x Liquid AI)** — Liquid Track. ## Holdout eval (matched-pair, 32 samples, 8 per action class) | Metric | Base | Tuned (this adapter) | Tuned + `repetition_penalty=1.05` (Run A) | |---|---|---|---| | `exact_action_agreement` | 0.250 | 0.656 | **0.750** | | `score_mae` (lower is better) | 0.312 | 0.102 | **0.080** | | `parse_rate` | 1.000 | 0.906 | **1.000** | The 9.4 pp parse-rate dip on tuned-without-rep_penalty came from a numeric-field repetition loop on a single scene. Run A confirmed `repetition_penalty=1.05, no_repeat_ngram_size=20` at inference time recovers parse rate to 1.000 and lifts action agreement +9.4 pp without any retraining. v3 replicates this decode hardening AND adds 56 more operator-reviewed train rows. ## Recipe (preserved for v1 reproducibility) - TRL `SFTTrainer` + PEFT LoRA, `transformers` (main). - 109 train / 32 holdout (8 per class) / 4 legacy eval. - LoRA `r=16`, `alpha=32`, `dropout=0.05`; assistant-only loss masking. - AdamW `lr=2e-4`, 5 epochs, effective batch 8, `bfloat16`, T4 GPU. - 4,456,448 trainable / 453,175,296 total params (0.98%). Public training kernel: `benhaslam/simsat-lfm2-5-vl-v1-training` on Kaggle. ## Inference (recommended: use v3 instead) ```python # v3 adapter, applied to the same base model: from transformers import AutoModelForImageTextToText, AutoProcessor from peft import PeftModel base = "LiquidAI/LFM2.5-VL-450M" model = AutoModelForImageTextToText.from_pretrained(base, torch_dtype="bfloat16") processor = AutoProcessor.from_pretrained(base) model = PeftModel.from_pretrained(model, "HumanAIConvention/simsat-lfm25vl-450m-v3") out = model.generate( **inputs, max_new_tokens=256, do_sample=False, repetition_penalty=1.05, no_repeat_ngram_size=20, ) ``` ## License Apache-2.0, matching the LFM2.5-VL-450M base model. Sentinel-2 imagery (c) European Union, Copernicus Sentinel-2 data 2024-2026, redistributable under the [Sentinel data legal notice](https://sentinels.copernicus.eu/web/sentinel/terms-conditions).