--- license: other license_name: lfm1.0 license_link: https://huggingface.co/LiquidAI/LFM2.5-350M/blob/main/LICENSE base_model: LiquidAI/LFM2.5-350M tags: - lfm2 - lfm2.5 - liquid - python - math - fine-tune language: - en pipeline_tag: text-generation --- # LFM2.5-350M-Python-Math A fine-tune of [LiquidAI/LFM2.5-350M](https://huggingface.co/LiquidAI/LFM2.5-350M) (instruct) focused on **Python code generation** and **math word-problem solving**, while retaining general chat ability through a balanced mixed dataset. ## Why this exists The previous 230M fine-tune (`lfm2.5-230m-code-math`) showed strong potential but suffered from catastrophic forgetting (e.g., confusing baking cookies with HTTP cookies, failing negative constraints like "no dairy"). This 350M version addresses those issues by: 1. **Mixing general chat data** (`yahma/alpaca-cleaned`, 30k samples) to prevent knowledge loss. 2. **Injecting custom fix-it examples** targeting specific failure modes (negative constraints, complete Pygame scripts). 3. **Using longer context** (2048 tokens) so code outputs aren't truncated mid-function. 4. **Reducing epochs to 2** with a lower learning rate (`2e-5`) to prevent overfitting observed in earlier runs. Fine-tuning started from the **instruct checkpoint** rather than base. Testing confirmed that at 350M scale, starting from base with a mixed dataset still produced alignment failures (refusals, identity confusion, math regression), while the instruct checkpoint with the same dataset produced consistently strong results. ## Training details - **Base model:** `LiquidAI/LFM2.5-350M` (instruct) - **Method:** Full fine-tune (96GB VRAM, no LoRA needed) - **Datasets:** - Python Code: [`iamtarun/python_code_instructions_18k_alpaca`](https://huggingface.co/datasets/iamtarun/python_code_instructions_18k_alpaca) (Python-focused, replacing the multi-language 120k set) - Math: [`openai/gsm8k`](https://huggingface.co/datasets/openai/gsm8k) (main split) - General Chat: [`yahma/alpaca-cleaned`](https://huggingface.co/datasets/yahma/alpaca-cleaned) (30k sample subset) - Custom Fix-It: Hand-crafted examples for negative constraints ("no dairy", "no eggs") and complete runnable Pygame scripts (duplicated 50x for weight) - **Checkpoint selection:** Best by eval_loss - **Sequence length:** 2048 tokens (increased from 1024 to accommodate full scripts) - **Max response chars:** 3500 (prevents code truncation) - **Epochs:** 2 (reduced from 4; overfitting observed past epoch 2 in prior runs) - **Learning rate:** 2e-5 (reduced from 5e-5 for 350M stability) - **Loss:** Completion-only ## What it's good at - **Python Code**: Complete, runnable scripts including Pygame game loops, file I/O, classes, list comprehensions, and algorithmic implementations (e.g., two-pointer palindrome check). No more placeholder `pass` statements or truncated functions. - **Math**: GSM8K-style word problems with step-by-step reasoning annotations (`<<...>>`). Reliable on algebra, percentages, geometry, and multi-step arithmetic. - **General Chat**: Retains coherent conversational ability. Correctly handles negative constraints (e.g., "breakfast without eggs" returns egg-free options). Knows the difference between baking cookies and browser cookies. - **Speed**: At 350M parameters, achieves ~157 t/s generation on laptop CPU (i5-12450H) with Q5_K_S quantization via llama.cpp. ## Known limitations - **Python only**: Trained exclusively on Python code instructions. Other languages were not included in this fine-tune. - **Sentence counting**: May not strictly adhere to "exactly N sentences" constraints. - **Identity**: May occasionally claim to be developed by Google (artifact from Alpaca-Cleaned training data). - **Still 350M parameters**: Do not expect deep multi-step reasoning or long-form creative writing at the level of larger models. - Not evaluated on safety-critical, medical, or legal use cases. ## Usage ```python from transformers import AutoModelForCausalLM, AutoTokenizer model_id = "hauser458original/lfm2.5-350m-python-math" model = AutoModelForCausalLM.from_pretrained(model_id, dtype="bfloat16", device_map="auto") tokenizer = AutoTokenizer.from_pretrained(model_id) messages = [{"role": "user", "content": "Write a Python function to check if a number is prime."}] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, return_tensors="pt", return_dict=True ).to(model.device) output = model.generate(**inputs, max_new_tokens=512, do_sample=True, temperature=0.5, top_p=0.9) print(tokenizer.decode(output[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True)) ``` GGUF quantized versions (Q4_K_M, Q5_K_S, Q5_K_M, Q8_0, F16) for llama.cpp/Ollama/LM Studio are available at: [`hauser458original/lfm2.5-350m-python-math-GGUF`](https://huggingface.co/hauser458original/lfm2.5-350m-python-math-GGUF) ## License Inherits the [LFM Open License v1.0](https://huggingface.co/LiquidAI/LFM2.5-350M/blob/main/LICENSE) from the base model. ## Acknowledgements Built on [LiquidAI/LFM2.5-350M](https://huggingface.co/LiquidAI/LFM2.5-350M). See the [LFM2 Technical Report](https://arxiv.org/abs/2511.23404) for details on the base architecture.