Text Generation
Transformers
Safetensors
Basque
English
Spanish
mamba2
mamba-2
basque
autocomplete
fim
fill-in-the-middle
ghost-text
continued-pretraining
low-resource
Instructions to use itzune/morpheus-fim with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use itzune/morpheus-fim with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="itzune/morpheus-fim")# Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("itzune/morpheus-fim") model = AutoModelForCausalLM.from_pretrained("itzune/morpheus-fim", device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use itzune/morpheus-fim with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "itzune/morpheus-fim" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "itzune/morpheus-fim", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker
docker model run hf.co/itzune/morpheus-fim
- SGLang
How to use itzune/morpheus-fim with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "itzune/morpheus-fim" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "itzune/morpheus-fim", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "itzune/morpheus-fim" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "itzune/morpheus-fim", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }' - Docker Model Runner
How to use itzune/morpheus-fim with Docker Model Runner:
docker model run hf.co/itzune/morpheus-fim
| library_name: transformers | |
| license: apache-2.0 | |
| language: | |
| - eu | |
| - en | |
| - es | |
| tags: | |
| - mamba-2 | |
| - basque | |
| - autocomplete | |
| - fim | |
| - fill-in-the-middle | |
| - ghost-text | |
| - continued-pretraining | |
| - low-resource | |
| base_model: itzune/morpheus | |
| pipeline_tag: text-generation | |
| # Morpheus-FIM (Mamba-2) β Basque Fill-in-the-Middle Autocomplete | |
| **Continued pre-training** of [itzune/morpheus](https://huggingface.co/itzune/morpheus) (the 91M AR-only Mamba-2 model, step 74K) for **Fill-in-the-Middle (FIM)** completion β the model can predict text at the cursor, not just at the end of a buffer. | |
| This is the base model for the GGUF at [itzune/morpheus-gguf](https://huggingface.co/itzune/morpheus-gguf) (`v3_fim.Q5_K_M.gguf`). | |
| ## Model Details | |
| - **Architecture:** Mamba-2 (State Space Model), 24 layers, d_model 768 | |
| - **Parameters:** 91M | |
| - **Base model:** [itzune/morpheus](https://huggingface.co/itzune/morpheus) (step 74K, AR-only, PPL 7.13) | |
| - **Checkpoint:** Phase 6 v3 `best.pt` (step 3500 of CPT) | |
| - **AR perplexity:** 7.5 | **FIM perplexity:** 7.9 | |
| - **Vocabulary:** 4,016 (4,000 original Unigram pieces + `<PRE>` `<SUF>` `<MID>` `<EOT>` + 12 padding rows) | |
| - **Trained without BOS token** (`add_bos_token=false`) | |
| ## Continued Pre-Training Recipe | |
| | Parameter | Value | | |
| |-----------|-------| | |
| | Base checkpoint | step 74K AR (`itzune/morpheus`), embeddings resized 4000 β 4016 | | |
| | Token budget | 500M tokens | | |
| | FIM/AR ratio | **70/30** | | |
| | `<EOT>` loss weight | **5Γ** (per-class cross-entropy weight on token id 4003) | | |
| | Splitting | Token-level (BigCode/StarCoder), 20% at linguistic boundaries | | |
| | Loss masking | None ("FIM-for-free" β loss on all tokens) | | |
| | Packing | Greedy whole-example packing into 1025-token windows | | |
| | Learning rate | 1.0e-3, cosine decay, ~3,815 steps | | |
| | Tokenizer | `basque_unigram_fim.model` (original 4000 + 4 FIM tokens) | | |
| The 70/30 ratio + 5Γ `<EOT>` weight directly target the FIM stop-token reliability problem: the model must learn not just *what* to generate but *when to stop*, and the `<EOT>` signal is otherwise too sparse (one token per example) within a 500M-token budget for the model to reliably emit it. | |
| ## FIM Token Format | |
| Code Llama-style FIM tokens (Bavarian et al., 2022; Roziere et al., 2023): | |
| | Token | ID | Purpose | | |
| |-------|----|---------| | |
| | `<PRE>` | 4000 | Marks start of prefix | | |
| | `<SUF>` | 4001 | Marks start of suffix | | |
| | `<MID>` | 4002 | Marks start of generation (infill) | | |
| | `<EOT>` | 4003 | End-of-infill (stop token) | | |
| | 4004β4015 | β | Padding (kernel alignment, unused) | | |
| To do a fill-in-the-middle completion, structure the prompt as: | |
| ``` | |
| <PRE>{prefix}<SUF>{suffix}<MID> | |
| ``` | |
| The model generates the infill and emits `<EOT>` when done. | |
| ## Evaluation Results | |
| FIM eval on 147 held-out examples (token-level splits, 20% at linguistic boundaries): | |
| | Metric | Result | | |
| |--------|--------| | |
| | `<EOT>` emission rate | 88.4% | | |
| | Keystrokes saved | β5.9% | | |
| | Exact-match rate | 6.8% | | |
| | Avg char accuracy | 32.3% | | |
| | Avg generation length (ref=45.0) | 40.3 | | |
| | Prefix truncation (overall) | 1.4% | | |
| | β long-bucket truncation | 2.3% (< 15% threshold) | | |
| | AR valid PPL | 7.5 | | |
| | FIM valid PPL | 7.9 | | |
| The 5Γ `<EOT>` loss weighting resolves the over-generation failure mode: `<EOT>` emission reaches 88.4% and generation length (40.3) sits near the 45.0-char reference, yielding near-break-even keystrokes saved (β5.9%). The feared premature-truncation failure mode β the dual risk of over-weighting the stop token β did not materialize (1.4% overall, 2.3% long-bucket, far below the 15% threshold). AR perplexity remained stable (7.5 vs. 7.13 AR-only base), confirming the 70/30 FIM ratio did not trade away AR capability. | |
| ## Usage | |
| ### With the Morpheus demo server (recommended) | |
| The [Morpheus demo](https://github.com/itzune/morpheus/tree/main/demo) includes a FastAPI proxy that handles FIM templating, token-ID encoding, and an OpenAI-compatible API: | |
| ```bash | |
| cd demo | |
| MORPHEUS_MODEL=v3_fim.Q5_K_M.gguf docker compose -f docker-compose.yml -f docker-compose.local.yml up -d --build | |
| # Open http://localhost:9090/editor.html | |
| ``` | |
| ### Direct with transformers | |
| ```python | |
| from transformers import AutoModelForCausalLM, AutoTokenizer | |
| model = AutoModelForCausalLM.from_pretrained("itzune/morpheus-fim") | |
| tokenizer = AutoTokenizer.from_pretrained("itzune/morpheus-fim") | |
| # FIM prompt | |
| prompt = "<PRE>Kaixo, <SUF> moduz?<MID>" | |
| inputs = tokenizer(prompt, return_tensors="pt") | |
| output = model.generate(**inputs, max_new_tokens=20, temperature=0.2, top_k=5) | |
| print(tokenizer.decode(output[0], skip_special_tokens=False)) | |
| ``` | |
| ### β οΈ Critical: token-ID prompts for llama.cpp | |
| When deploying via `llama.cpp`/`llama-server`, encode prompts with the `sentencepiece` library using `tokenizer.model` and send **token IDs** (not strings) to the `/completion` endpoint. This avoids the BOS auto-prepend and tokenizer-divergence issues documented on the [base model card](https://huggingface.co/itzune/morpheus). The demo proxy handles this automatically. | |
| ## Decoding Parameters (recommended) | |
| | Parameter | Value | Rationale | | |
| |-----------|-------|-----------| | |
| | `temperature` | 0.2 | Low-but-nonzero: recovers rank-2 correct tokens greedy misses | | |
| | `top_k` | 5 | Small nucleus; 5 correct answers sit at rank 2 in top-5 | | |
| | `repeat_penalty` (FIM) | 1.0 | FIM legitimately reuses context words | | |
| | `stop` (FIM) | `["<EOT>", "\n\n"]` | Model-emitted stop + paragraph-boundary fallback | | |
| ## Intended Use | |
| Desktop text-editor **ghost-text autocompletion** for Basque prose. The Mamba-2 architecture's O(1) decode cost makes it well-suited to long editing sessions where per-token latency matters more than parallelism. | |
| **Not intended for:** instruction following, chat, translation, or factual QA. This is a narrow autocomplete model. | |
| ## License | |
| Apache-2.0. | |
| ## References | |
| - Bavarian, M., et al. (2022). *Efficient Training of Language Models to Fill in the Middle*. arXiv:2207.14255. | |
| - Roziere, B., et al. (2023). *Code Llama: Open Foundation Models for Code*. arXiv:2308.12950. | |
| - Dao, T., & Gu, A. (2024). *Transformers are SSMs: Generalized Models and Efficient Algorithms through Structured State Space Duality*. arXiv:2405.21060. | |